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 ...
随机推荐
- Codeforces 1364C - Ehab and Prefix MEXs
题意:给1e5的数组a 保证 ai <= ai+1 ai<=i 求一个一样长的数组b 使得mex(b1,b2···bi) = ai QAQ:不知道为啥这1600分的题比赛时出不了 啊啊 ...
- LA3902 Network (树上dfs)
题目链接:点击打开链接 题意:n台机器连成一个树状网络,其中叶节点是客户端,其他节点是服务器,目前有一台服务器s正在提供服务.让你在其他服务器上也安排同样的服务,使得每台客户端到最近服务器的距离不超过 ...
- FZU1894 志愿者选拔
Problem Description 世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动.参加志愿者选拔的同学们排队接受面试官们的面试.参加面试的同学们按照先来先面试并且先结束的原则接受面试官们 ...
- 仿ATM程序软件
一.目标: ATM仿真软件 1 系统的基本功能 ATM的管理系统其基本功能如下:密码验证机制:吞锁卡机制:存取款功能:账户查询功能:转账功能等. 要求 要能提供以下几个基本功能: (1)系统内的相关信 ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (DP)
题意:给你一个长度为\(n\)的序列,求一个最长的\({x,x+1,x+2,.....,x+k-1}\)的序列,输出它的长度以及每个数在原序列的位置. 题解:因为这题有个限定条件,最长序列是公差为\( ...
- HDU 1173 思路题
题目大意 有n个地点(坐标为实数)需要挖矿,让选择一个地点,使得在这个地方建造基地,到n个地点的距离和最短,输出基地的坐标. 题解+代码: 1 /* 2 把这个二维分开看(即把所有点投影到x轴上,再把 ...
- C# 之 dynamic
C#中的dynamic用于避免编译时类型检查,编译器在运行时获取类型. dynamic无法使用VisualStudio的intelliSense(智能感知),即调用dynamic修饰的对象的方法或字段 ...
- Jenkins 持续集成测试工具
一.Jenkins(hudson)流程 创建job 执行job 通知机制 二.两种执行策略 定时执行:每隔一段时间执行一下(适合UI和接口测试的执行) 监控代码库执行:单元测试的执行模式(适合单元测试 ...
- 关于TCP状态TIME_WAIT的理解
1.TIME_WAIT的作用: TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器 ...
- Zabbix 自动发现 & 自动注册
自动发现 Zabbix 为用户提供了高效灵活的网络自动发现功能,有以下优点: 加快 Zabbix 部署 简化管理 无需过多管理,也能在快速变化的环境中使用 Zabbix Zabbix 网络发现基于以下 ...
