python+unittest+ddt数据驱动进行接口自动化测试
所谓数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避免在测试中使用硬编码的数据。因此只需要创建一个测试脚本就可以处理上表的测试数据和条件的组合,使用数据驱动的模式,根据业务逻辑分解测试数据,并且定义变量,使用外部的excel里的数据使其参数化,从而避免使用源测试脚本中的固定数据,这种方式可以将测试脚本与测试数据分开,使得测试脚本在不同的数据集合下高度复用。
数据驱动的模式不仅可以帮助增加类似复杂条件场景下的测试覆盖,还可以极大的减少对测试代码的编写和维护工作。
如下业务是:用户登录某个软件系统后,对其他用户进行关注。具体流程是:调用登录接口获取session,然后调取关注接口把session和userid作为参数进行传递,我们把需要关注的用户的userid存放在一个文件中,作为驱动数据。如下两个userid:
# 定义一个函数,获取数据,并且把每组数据作为一个列表放在一个大列表中。
def test_data(path):
with open(path, encoding="utf-8", mode="r") as f:
data = f.readlines()
mydata = []
for line in data:
new_line = []
new_line.append(line.strip())
mydata.append(new_line)
f.close()
return mydata
返回的结果:[['2682388'], ['2682389']]
首先导入需要用到的API
import requests
import unittest
import json
from ddt import ddt, data, unpack # ddt需要通过pip安装
# 获取登录session
def login():
login_url = "http://xxx/xxx/xxx/xxx/login_process/"
data = {"user_name": "xxx",
"avatar_file": "xxx",
"mobile": "12233445567"
}
# 获取返回信息
content = requests.post(login_url, data=data)
# 将bytes类型转换为字典
re = json.loads(content.text)
return re["rsm"]["yme__user_login"], re["rsm"]["yme__Session"]
@ddt # 定义ddt数据驱动
class AFollow(unittest.TestCase):
# 初始化测试用例
def setUp(self) -> None:
# 被测接口地址
self.follow_url = "http://xxx/xxx/xxx/xxx/user_follow/"
def tearDown(self) -> None:
pass
@data(*test_data(r"\\data\follow_userid")) # 获取测试数据,对数据解包前面需要一个*
@unpack 对数据进行解包,解包后数据就变成了这种形式:['2682388'], ['2682389'],每组数据就是一条测试用例
def test_case01(self, user_id):
# 定义需要传入的参数,程序运行时这条用例会执行两次,
# 分别['2682388']和['2682389']作为测试数据执行测试
"""
关注新用户
"""
content = requests.post(self.follow_url, self.get_session(user_id))
print(json.loads(content.text), type(json.loads(content.text)))
re = json.loads(content.text)
self.assertEqual(re["rsm"]["msg"], "关注成功") # 断言
@data(*test_data(r"\\data\follow_userid"))
@unpack
def test_case02(self, user_id):
"""
关注已经关注的用户(重复关注用户)
"""
content = requests.post(self.follow_url, self.get_session(user_id))
print(json.loads(content.text), type(json.loads(content.text)))
re = json.loads(content.text)
self.assertEqual(re["rsm"]["msg"], "关注失败")
@ddt
class CancelFollow(unittest.TestCase):
def setUp(self) -> None:
self.cancel_follow_url = ""http://xxx/xxx/xxx/xxx/user_follow_del/"
def tearDown(self) -> None:
pass
@data(*test_data(r"\\data\follow_userid"))
@unpack
def test_case01(self, user_id):
"""
取消关注用户
"""
content = requests.post(self.cancel_follow_url, self.get_session(user_id))
print(json.loads(content.text), type(json.loads(content.text)))
re = json.loads(content.text)
self.assertEqual(re["rsm"]["msg"], "取消关注成功", "取消关注失败!")
if __name__ == '__main__':
unittest.main()
运行测试成功
再调试的过程中遇到了如下错误:
wrapper
add_test(
TypeError: add_test() argument after ** must be a mapping, not str
def test_data(path):
with open(path, encoding="utf-8", mode="r") as f:
data = f.readlines()
mydata = []
for line in data:
mydata.append(line.strip())
f.close()
return mydata
返回结果:['2682388', '2682389']
原因是,在获取数据时,没有将每组数据单独存放在一个列中,解包后测试数据变成了字符串。
所以需要把每组数据放在一个列表中,再把所有组数据放在一个大列表中,也可以放在元组中
python+unittest+ddt数据驱动进行接口自动化测试的更多相关文章
- 利用Python如何实现数据驱动的接口自动化测试
前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取.下面话不多说了,来一起看看详细的介绍吧. 1.需求 某API,GET方法,token,m ...
- python+unittest+requests+HTMLRunner编写接口自动化测试集
问题描述:搭建接口测试框架,执行用例请求多个不同请求方式的接口 实现步骤: ① 创建配置文件config.ini,写入部分公用参数,如接口的基本url.测试报告文件路径.测试数据文件路径等配置项 [D ...
- 接口自动化 [授客]基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0
基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 by:授客 QQ:1033553122 博客:http://blog.sina.com.cn/ishou ...
- 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]
基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版] by:授客 QQ:1033553122 由于篇幅问题,,暂且采用网盘分享的形式: 下载地址: [授客] ...
- 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0
基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...
- Python+Unittest+Requests+PyMysql+HTMLReport 接口自动化框架
整体框架使用的是:Python+Unittest+Requests+PyMysql+HTMLReport 多线程并发模式 主要依赖模块 Unittest.Requests.PyMysql.HTMLR ...
- Python Unittest与数据驱动
python中有一个装饰器类DDT,通过它我们可以复用代码,达到数据驱动测试的目的,该类的官方介绍可以参考 http://ddt.readthedocs.io/en/latest/index.html ...
- Python unittest excel数据驱动
安装xlrd 下载地址:https://pypi.python.org/pypi/xlrd 安装ddt 下载地址:https://pypi.python.org/pypi/ddt/1.1.0 clas ...
- Selenium(Python) ddt数据驱动
首先, 添加ddt模块: import unittestfrom time import sleep from ddt import ddt, data, unpack# 导入ddt模块from se ...
随机推荐
- hdu3436 Queue-jumpers(Splay)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- UVALive 7146
Long long ago there is a strong tribe living on the earth. They always have wars and eonquer others. ...
- Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
题意:给你一组全是\(2^d\ (d\ge0)\)的数,询问q次,每次询问一个数,问这个数是否能够由原数组中的数相加得到,如果能,输出最少用多少个数,否则输出\(-1\). 题解:首先贪心得出结论:如 ...
- 【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田
优美玉米 / 方伯伯的玉米田 题目链接:ybt金牌导航1-2-5 / luogu P3287 题目大意 有一个数组,你可以每次给一个区间里面的值加一,要你使得最后剩下的最长单调不下降子序列最长. 思路 ...
- dart类详细讲解
dart 是一个面向对象的语言;面向对象有 (1)继承 (2)封装 (3)多态 dart的所有东西都是对象,所有的对象都是继承与object类 一个类通常是由属性和方法组成的哈: 在dart中如果你要 ...
- codeforces 1042C Array Product【构造】
题目:戳这里 题意:n个数,两种操作,第一种是a[i]*a[j],删掉a[i],第一种是直接删除a[i](只能用一次)剩下的数序列号不变.操作n-1次,使最后剩下的那个数最大化. 解题思路: 正数之间 ...
- PyQt5笔记
PyQt5 窗口类继承QMainWindow. 1.消息盒子QMessageBox 弹出一个窗口,根据选择的不同执行不同的操作.比如点击关闭后,实用消息盒子确认是否关闭. # 关闭QWidget将产生 ...
- CSS 解决Float后塌陷问题
当父级元素没有设定高度时候,而子集元素设定float类型时候,此时父级元素不能靠子集元素撑起来,所以就形成了塌陷: 示例分析 **1.Float之前的效果** <!DOCTYPE html> ...
- 计蒜客第五场 UCloud 的安全秘钥(中等) (尺取游标法
每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...
- Generator function vs Async/Await
Generator function vs Async/Await generator async /await refs xgqfrms 2012-2020 www.cnblogs.com 发布文章 ...