news 2026/4/23 12:29:12

DDT数据驱动测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 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其实就是像下面这样的一个列表:

python

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])
  1. 如果没有@unpack[a,b]、[c,d]都会被当成一个参数传入用例,即用[a,b]运行一次,用[c,d]运行一次;
  2. 如果有@unpack,[a,b]会被分解开,一次传递两个参数给用例,用例需要定义两个参数接收
  3. @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)

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 3:43:40

保姆级CTF入门教程:从理论到实战,一篇搞定

【强烈建议收藏】CTF竞赛全方位解析:零基础学习网络安全的最佳实践 CTF(Capture The Flag)是网络安全领域的技术竞技比赛,主要分为解题、攻防、混合和战争分享四种模式。题型涵盖Web、逆向、Pwn、密码学、隐写、杂项和编程等方向,全面考察参…

作者头像 李华
网站建设 2026/4/12 21:10:47

memtest_vulkan实战指南:高效检测显卡内存稳定性的深度解析

memtest_vulkan实战指南:高效检测显卡内存稳定性的深度解析 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 在游戏运行中突然卡顿、系统无故崩溃&am…

作者头像 李华
网站建设 2026/4/15 20:07:48

JAVA打造:24小时共享自助洗车源码方案

以下是一个基于Java的24小时共享自助洗车系统源码方案,涵盖系统架构、核心功能、技术实现及安全保障等方面:一、系统架构前端:用户端:采用UniApp框架开发,支持微信小程序、APP等多端入口,提供扫码启动、预约…

作者头像 李华
网站建设 2026/4/23 11:30:37

360度全景图像查看器:重新定义你的Web视觉体验

360度全景图像查看器:重新定义你的Web视觉体验 【免费下载链接】360-image-viewer A standalone panorama viewer with WebGL 项目地址: https://gitcode.com/gh_mirrors/36/360-image-viewer 还在为如何在网页中完美展示全景图像而烦恼吗?传统解…

作者头像 李华
网站建设 2026/4/17 17:49:07

群晖DSM 7.2.2 Video Station终极修复指南

群晖DSM 7.2.2 Video Station终极修复指南 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 还在为群晖DSM 7.2.2系统无法正常使用Video Station而烦…

作者头像 李华
网站建设 2026/4/17 16:20:08

ANARCI:抗体序列智能编号与结构分析的完整指南

ANARCI:抗体序列智能编号与结构分析的完整指南 【免费下载链接】ANARCI Antibody Numbering and Antigen Receptor ClassIfication 项目地址: https://gitcode.com/gh_mirrors/an/ANARCI ANARCI(抗体编号与抗原受体分类)是牛津蛋白信息…

作者头像 李华