python 基于DDT实现数据驱动测试


Posted in Python onFebruary 18, 2021

简单介绍

​ DDT(Date Driver Test),所谓数据驱动测试,简单来说就是由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避免在测试中使用硬编码的数据,也就是测试数据和用例脚本代码分离。

​ DDT它其实就是一个装饰器,它会根据你传递进来的数据来决定要生成几个测试用例。

​ ?使用的意义

1.代码复用率高:一个测试逻辑只需要写一次,可以多条测试数据复用,同时提高测试脚本的编写效率。

2.异常排查效率高:根据测试数据,每条数据生成一条测试用例,用例相互分离,一条失败的情况下不会影响其他测试用例。

3.代码可维护性高:简洁明了的测试框架,利于其他同事阅读,提高代码的可维护性。

安装及导入

​ cmd命令行执行安装:pip install ddt

​ 直接导入到模块:import ddt,或导入具体的装饰器:from ddt import ddt, data, unpack

使用详解

​ ?三个要点:

  • @ddt:装饰测试类
  • @data:装饰测试用例
  • @unpack:装饰测试用例

​ 要使用ddt的前提是要有测试用例类,然后用@ddt去装饰测试用例类,用@data(测试数据)去装饰测试用例,如下登录接口例子:

from ddt import ddt, data
from common.read_excel import ReadExcel
from common.my_logger import log


@ddt # 装饰登录测试用例类,声明使用ddt
class LoginTestCase(unittest.TestCase):
  
  excel = ReadExcel("cases.xlsx", "login")
  cases = excel.read_data()
  
  @data(*cases)	# 装饰测试用例
  def test_login(self, case):
    case_data = eval(case["data"])
    expected = eval(case["expected"])
    case_id = case["case_id"]
    result = login_check(*case_data)
    response = self.http.send(url=url, method=method, json=data, headers=headers)
    result = response.json()
    try:
      self.assertEqual(expected["code"], result["code"])
      self.assertEqual((expected["msg"]), result["msg"])
    except AssertionError as e:
      log.info("用例:{}--->执行未通过".format(case["title"]))
      print("预期结果:{}".format(expected))
      print("实际结果:{}".format(result))
      raise e
    else:
      log.info("用例:{}--->执行通过".format(case["title"]))


if __name__ == '__main__':
  unittest.main()

@ddt它做的事情其实就等同于这句代码:LoginTestCase = ddt(LoginTestCase),把具体的类名传给ddt,告诉ddt是这个测试用例类要使用数据驱动。

@data做的事情就是把测试数据作为一个参数传递给测试用例,一个数据对应生成一条测试用例,如果data里面有多个数据那么就对应生成多条测试用例。如果data里放的类似是元组、列表等这样的序列类型的数据,data会把他们当成是一个整体,即一个测试数据。

​ 如果想一次传递多个参数给测试用例,需要自行在脚本中对数据进行分解或者使用@unpack分解数据。如上例子中的测试用例,只使用了一个参数,但这个参数case是一个字典,字典中已经包含多个数据,直接用key获取对应的值即可。@unpack则是可以把序列类型的数据拆分为多个,以多个参数传给测试用例,但测试用例也需要定义同等数量的参数来接收。

​ 上面例子的测试数据cases来源是使用了openpyxl来读取excel中的测试数据的,关于openpyxl可以看我这个系列的另外一篇随笔。这里直接说明cases其实就是像下面这样的一个列表:

cases = [{'case_id': 1, 'title': '正常登录', 'data': '("test", "Test1234")', 'expected': '{"code": 0, "msg": "登录成功"}'}, {'case_id': 2, 'title': '密码错误', 'data': '("test", "123")', 'expected': '{"code": 1, "msg": "账号或密码不正确"}'}, {'case_id': 3, 'title': '账户名错误', 'data': '("test11", "Test1234")', 'expected': '{"code": 1, "msg": "账号或密码不正确"}'}]

# *解包后,一个字典就是一个测试用例数据
# 如第一个字典:{'case_id': 1, 'title': '正常登录', 'data': '("test", "Test1234")', 'expected': '{"code": 0, "msg": "登录成功"}'}

​ 通过*解包,它的数据就是3个字典,每次给测试用例传入1个字典,而这个字典里就存放了一条完整的登录接口测试用例的测试数据,包括用例id、用例标题、测试的账号密码、期望返回的结果。

​ ?小结:

  • @data(a,b):a和b各运行一次用例
  • @data(*(a,b):a和b各运行一次用例,使用*解包,相当于@data(a,b)
  • @data([a,d],[c,d])

                  如果没有@unpack[a,b]、[c,d]都会被当成一个参数传入用例,即用[a,b]运行一次,用[c,d]运行一次;
                  如果有@unpack,[a,b]会被分解开,一次传递两个参数给用例,用例需要定义两个参数接收
                  @unpack可适用元组、列表或字典,但当传入的是字典时,字典的key和用例定义的参数名需要保持一致

​ 关键代码:@file_data,传递文件(json/yaml)

扩展

​ 关键代码:@file_data,传递文件(json/yaml)

# 传递json
"""
json文件数据
{
	"token":123456,
	"actionName": "api.login",
	"content": {
		"user": "miki",
		"pwd": "Test123"
	}
}
"""
"""
yaml文件
test_list:
 - 11
 - 22
 - 12

sorted_list: [ 11, 12, 22 ]
"""
from ddt import *


@ddt	# 声明使用ddt
class TestFile(unittest.TestCase):

  @file_data('D:/test/test.json')
  def test_json(self, json_data):
    print(json_data)
    
  @file_data('D:/test/test.yaml')
  def test_yaml(self, yaml_data):
    print("yaml", yaml_data)

以上就是python 基于DDT实现数据驱动测试的详细内容,更多关于python 实现数据驱动测试的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
一步步解析Python斗牛游戏的概率
Feb 12 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
python 文件操作删除某行的实例
Sep 04 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
Python 音频生成器的实现示例
Dec 24 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
python如何建立全零数组
Jul 19 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
python切割图片的示例
Nov 12 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 #Python
python 使用openpyxl读取excel数据
Feb 18 #Python
Python用SSH连接到网络设备
Feb 18 #Python
python 实现IP子网计算
Feb 18 #Python
详解python3 GUI刷屏器(附源码)
Feb 18 #Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 #Python
Python如何telnet到网络设备
Feb 18 #Python
You might like
世界收音机发展史
2021/03/01 无线电
IIS6的PHP最佳配置方法
2007/03/19 PHP
php curl 上传文件代码实例
2015/04/27 PHP
nginx下安装php7+php5
2016/07/31 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
jquery 学习之二 属性(类)
2010/11/25 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
python数据结构之二叉树的遍历实例
2014/04/29 Python
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
党课知识竞赛主持词
2014/04/01 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
卖房授权委托书样本
2014/10/05 职场文书
后备干部推荐材料
2014/12/24 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
《观潮》教学反思
2016/02/17 职场文书
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript