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 ...
随机推荐
- 阅读笔记:Very Deep Convolutional Networks for Large-Scale Image Recognition
摘要: 在这篇论文我们主要研究卷积神级网络的深度对大范围图像识别效果的影响,我们发现增加神经网络层数增加到16-19层时我们的实验结果有很大的提高.这使得我们在2014年的ImageNet Chall ...
- Codeforces Round #665 (Div. 2) D - Maximum Distributed Tree dfs贡献记录
题意: t组输入,每组数据中n个节点构成一棵树,然后给你n-1条边.给你一个m,然后给你m个k的素数因子,你需要给这n-1条边都赋一个权值,这n-1条边的权值之积应该等于k.如果k的素数因子数量小于n ...
- poj1787 Charlie's Change
Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...
- 10.PowerShell DSC之细节
mof文件到各Node放在哪里了? 在C:\Windows\System32\Configurtion文件夹下: 你可能会注意到mof的文件名称和Pull Server上的不一致,并且多出了几个.不用 ...
- CGI & FastCGI 协议
目录 CGI 是什么 CGI 特点 CGI 的流程 FastCGI 是什么 CGI & FastCGI(转载) 推荐Blog: CGI是什么,FastCGI是什么 CGI 是什么 公共网关接口 ...
- Python优化机制:常量折叠
英文:https://arpitbhayani.me/blogs/constant-folding-python 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者 ...
- Redis 的缓存淘汰机制(Eviction)
本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...
- mybatis(六)插件机制及分页插件原理
转载:https://www.cnblogs.com/wuzhenzhao/p/11120848.html MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要 ...
- Inkscape svg彩色图转灰度图
操作: Ctrl+A 全选所有对象, 然后使用滤镜渲染成灰度图, 至于这个RGB比值, 看个人需求, 标准情况下rgb2gray是0.299 * R + 0.587 * G + 0.114 * B 原 ...
- js & document.execCommand
js & document.execCommand click copy document.execCommand 已废弃 过时的 此功能已过时.尽管它可能在某些浏览器中仍然可以使用,但不建议 ...
