DDT数据驱动测试

简单介绍

​ DDT(Date Driver Test),所谓数据驱动测试,

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

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

​ 🎈使用的意义

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

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

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

安装及导入

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

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

ddt使用详解

​ 🎈三个要点

  • @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 eelse: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)

# 传递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)

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/246374.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

playwright自动化项目搭建

具备功能 关键技术: pylaywright测试库pytest单元测试框架pytest-playwright插件 非关键技术: pytest-html插件pytest-rerunfailures插件seldom 测试框架 实现功能: 元素定位与操作分离失败自动截图并保存到HTML报告失败重跑可配置不同…

什么是网络安全?网络安全概况

网络安全涉及保护我们的计算机网络、设备和数据免受未经授权的访问或破坏。 这个领域包括多种技术、过程和控制措施,旨在保护网络、设备和数据免受攻击、损害或未授权访问。网络安全涉及多个方面,包括但不限于信息安全、应用程序安全、操作系统安全等 …

【HarmonyOS 4.0 应用开发实战】TypeScript 快速入门之环境配置

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

include文件包含

include 文件包含利用日志文件什么是日志文件 之所以会burp抓包上传就可以成功的原因,是因为burp可以绕过url编码,导致写入日志文件中的代码没有进行编码,可以直接解析成php文件 声明:其中图片并非本人实操,而是直接截…

C语言实现插入排序算法(附带源代码)

插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常…

Cybellum—信息安全测试工具

产品概述 由于软件和数据在汽车上的使用越来越多,汽车越来越“智能化”,汽车行业面临着重大的信息安全挑战。2021年8月,ISO/SAE 21434正式发布,标准中对汽车的信息安全提出了规范化的要求,汽车信息安全不容忽视。 Cyb…

dubbo和eureka的区别

dubbo可以作为客户端,也可以作为服务端,因此他内置了很多序列化框架可供选择,通过配置可以进行选择。默认是hession,还有gson,fastJson,jdk自带的序列化。 eureka只能作为服务端,他序列要与客户…

写一份简单的产品说明书:格式和排版建议

现在的市场竞争那么激烈,拥有一份简洁明了的产品说明书可以说是很重要的。产品说明书不仅向用户提供了对产品的详细了解,还能够树立品牌形象,提升用户体验。 | 一、写一份简单的产品说明书—一些建议 1.创意封面设计 一个吸引人的封面设计能…

C++多态深度剖析

文章目录 1. 前言2. 多态的概念及定义2.1 概念2.2 多态的构成条件2.3 虚函数2.4 虚函数的重写2.5 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类3.1 概念3.2 接口继承和实现继承 4. 多态的原理4.1 虚函数表4.2 多态的原理4.3 动…

openssl3.2 - 测试程序的学习 - test\aesgcmtest.c

文章目录 openssl3.2 - 测试程序的学习 - test\aesgcmtest.c概述笔记能学到的流程性内容END openssl3.2 - 测试程序的学习 - test\aesgcmtest.c 概述 openssl3.2 - 测试程序的学习 aesgcmtest.c 工程搭建时, 发现没有提供 test_get_options(), cleanup_tests(), 需要自己补上…

【教学类-综合练习-10】20240111 大4班 综合材料(骰子、AB手环)

作品展示 背景需求 年终了,清理库存,各种打印的题型纸都拿出来,当个别化学习材料 教学过程: 时间:2024年1月11日下午 班级:大4班(最后一次带班) 人数:16人 第1类&…

SpringBoot自定义全局异常处理器

文章目录 一、介绍二、实现1. 定义全局异常处理器2. 自定义异常类 三、使用四、疑问 一、介绍 Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常。 ControllerAdvice 或 RestControllerAdvice(推荐)ExceptionHandler 二、…

北斗卫星为野外科考人员提供安全保障

北斗卫星为野外科考人员提供安全保障 自第二次青藏高原综合科学考察研究启动以来,青海不断提升科考服务保障能力,推动科考全程信息化,有效促进科考成果转化。 为保障科考人员的人身安全,青海省青藏科学考察服务中心开发了基于北…

单片机学习笔记---独立按键控制LED状态

上一节学习的是独立按键控制LED亮灭 这一节我们先来讲一下按键的抖动: 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以…

有关链表的题目

目录 1.环形链表的约瑟夫问题 2.链表的中间节点 3.合并两个有序链表 4.反转链表 5.移除链表元素 1.环形链表的约瑟夫问题 环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com) 思路:题目给出结构是环形链表,且题目已经定义好了环形链表的结构。 1…

【Docker】实现JMeter分布式压测

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示,一个JMeter实例将能够控制许多其他的远程JMeter实例,并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

嵌入式linux面试题目总结

Linux系统中常见的面试题目,分享,欢迎大家前来交流学习。 1、嵌入式系统中的CAN通信协议是什么? CAN(Controller Area Network)通信协议是一种广泛应用于嵌入式系统中的串行通信协议。它最初由德国汽车工业联合会开发…

Kafka(二)原理详解

一 、kafka核心总控制器(Controller) 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。 作用:leader副…

学习笔记-李沐动手学深度学习(五)(14-15,数值稳定性、模型初始化和激活函数、Kaggle房价预测)

总结 14-数值稳定性(梯度爆炸、梯度消失) 尤其是对于深度神经网络(即神经网络层数很多),最终的梯度就是每层进行累乘 理论 t:为第t层 y:不是之前的预测值,而是包括了损失函数L …

数据结构:搜索二叉树 | 红黑树 | 验证是否为红黑树

文章目录 1.红黑树的概述2.红黑树的性质3.红黑树的代码实现3.1.红黑树的节点定义3.2.红黑树的插入操作3.3.红黑树是否平衡 黑红树是一颗特殊的搜索二叉树,本文在前文的基础上,图解红黑树插入:前文 链接,完整对部分关键代码展示&a…