unitTest+Ddt数据驱动测试

2023-11-16

我们设计测试用例时,会出现测试步骤一样,只是其中的测试数据有变化的情况,比如测试登录时的账号密码。这个时候,如果我们依然使用一条case一个方法的话,会出现大量的代码冗余,而且效率也会大大降低。此时,ddt模块就能帮助我们解决这个问题。

ddt(data-driven test),顾名思义,数据驱动测试。这个模块是第三方库,需要我们自己下载。或者直接在命令行输入pip install ddt。

Ddt 用法 

先看一个简单的演示:

import unittest
import ddt
@ddt.ddt # 解析Demo中使用了ddt装饰器的方法
class Demo(unittest.TestCase):

    @ddt.data(1, 2) # 迭代的参数值
    def test_case_1(self, v): # 迭代的参数个数需要与方法中的形参个数一致
        print(f"v:{v}")

    @ddt.data((1, 2), [3, 4]) # 迭代的参数值类型可以为元组或列表
    @ddt.unpack # 当迭代的参数为多维数组时,需要使用该装饰器来解析参数
    def test_case_2(self, v1, v2):
        print(f"v1:{v1} v2:{v2}")

    @ddt.data({"v3": 1, "v4": 2}, {"v3": 3, "v4": 4}) # 迭代的参数值类型可以为字典,字典的key值需要与形参的名称一致
    @ddt.unpack
    def test_case_3(self, v3, v4):
        print(f"v3:{v3} v4:{v4}")

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

演示结果:

Ddt 缺陷 

按照上面的方法将ddt运用到实际项目中,就能实现数据驱动的功能了。但是,用dir(Demo)查看类的属性时,发现找不到 test_case_1,*2,*3的方法名称,而是出现下图类似的名称。

点击查看大图↑

这是因为ddt为了防止方法名冲突,自动修改了方法名称。名称改变后,表面看起来也没影响用例的执行,这是因为我们使用的是自动搜索用例的方法执行的用例,如果使用addTest这种指定用例的方法就会报错:ValueError: no such test method in <class '__main__.Demo'>: test_case_1

如果我们不用指定用例的方法那是不是就没有问题了呢?执行上确实没问题,但如果我们使用了自动生成报告的模块(比如:BeautifulReport),生成的报告中,用例名称显示的是修改后的名称。

修复Ddt缺陷 

添加指定用例的方法看起来是无解的,因为使用数据驱动迭代的过程中,ddt必然会修改被装饰方法的方法名称,那怎么办呢?既然是ddt在解析用例过程中修改的方法名称,那么我们在解析过程中自定义用例名。

综合考虑各数据类型的特性后,决定不修改ddt对元组和列表类型数据的处理方式,只在字典类型的数据中添加指定用例名称的方法。

通读ddt源码,发现ddt是在 mk_test_name() 函数中定义的用例名称,具体代码如下:

def mk_test_name(name, value, index=0, name_fmt=TestNameFormat.DEFAULT):
    # Add zeros before index to keep order
    index = "{0:0{1}}".format(index + 1, index_len)

    if name_fmt is TestNameFormat.INDEX_ONLY or not is_trivial(value):
        return "{0}_{1}".format(name, index)
    try:
        value = str(value)
    except UnicodeEncodeError:
        # fallback for python2
        value = value.encode('ascii', 'backslashreplace')
    test_name = "{0}_{1}_{2}".format(name, index, value)
    return re.sub(r'\W|^(?=\d)', '_', test_name)

我们只要在这部分代码中增加对字典类型的数据处理即可,增加蓝色区域代码如下:

def mk_test_name(name, value, index=0, name_fmt=TestNameFormat.DEFAULT):

    # Add zeros before index to keep order
    index = "{0:0{1}}".format(index + 1, index_len)

    if name_fmt is TestNameFormat.INDEX_ONLY or not is_trivial(value):
        if isinstance(value, dict):
            test_name = value.get("case_name")
            if test_name is not None:
                return test_name
        return "{0}_{1}".format(name, index)
    try:
        value = str(value)
    except UnicodeEncodeError:
        # fallback for python2
        value = value.encode('ascii', 'backslashreplace')
    test_name = "{0}_{1}_{2}".format(name, index, value)
    return re.sub(r'\W|^(?=\d)', '_', test_name)

修改代码后,自定义用例名称的用法是在数据中定义case_name的key,值就为用例名称。

代码演示如下:

import unittest
import ddt
@ddt.ddt # 解析Demo中使用了ddt装饰器的方法
class Demo(unittest.TestCase):

    @ddt.data(1, 2) # 迭代的参数值
    def test_case_1(self, v): # 迭代的参数个数需要与方法中的形参个数一致
        print(f"v:{v}")

    @ddt.data((1, 2), [3, 4]) # 迭代的参数值类型可以为元组或列表
    @ddt.unpack # 当迭代的参数为多维数组时,需要使用该装饰器来解析参数
    def test_case_2(self, v1, v2):
        print(f"v1:{v1} v2:{v2}")

    @ddt.data({"v3": 1, "v4": 2, "case_name": "test_normal"}, {"v3": 3, "v4": 4, "case_name": "test_error"}) # 在数据中定义case_name的key,值就为用例名称
    @ddt.unpack
    def test_case_3(self, v3, v4, case_name):
        print(f"v3:{v3} v4:{v4}")

执行结果如下

需要注意两点:

  1. 自定义的用例名称不能相同,虽然不会报错,但是只会执行一个用例。

  2. 自定义的用例名称也必须是test开头。

使用这种方法,也能解决addTest添加不了用例的问题,有兴趣自己可以试试,就不在演示了。

ddt的数据可在用例描述中参数化显示

ddt对用例描述使用format方法进行了初始化

  因此在用例描述中,增加参数值的显示

@ddt.ddt # 解析Demo中使用了ddt装饰器的方法
class Demo(unittest.TestCase):

    @ddt.data({"v3": 1, "v4": 2, "case_name": "test_normal"}, {"v3": 3, "v4": 4, "case_name": "test_error"}) # 在数据中定义case_name的key,值就为用例名称
    @ddt.unpack
    def test_case(self, v3, v4, case_name):
        """参数值为v3:{v3},v4:{v4}"""
        print(f"v3:{v3} v4:{v4}")

执行结果

 end

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unitTest+Ddt数据驱动测试 的相关文章

  • 新入职一个00后卷王,每天加班到2点,太让人崩溃了····

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 软件测试|Pydantic详细介绍与基础入门

    简介 Pydantic 是一个强大的 Python 库 用于数据验证和解析 特别是用于处理 JSON 数据 它的主要目标是使数据验证和解析变得简单 直观和可维护 本文将介绍 Pydantic 的基础知识 包括如何定义模型 验证数据以及处理错
  • 软件测试|Python中如何提取列表中索引为奇数的元素

    简介 在Python中 我们经常需要从列表中提取特定位置的元素 如果我们想要提取列表中索引为奇数的元素 可以使用一些简单的方法来实现这一目标 本文将介绍如何在Python中提取列表中索引为奇数的元素 并提供示例代码来帮助大家更好地理解这个过
  • 软件测试|SQLAlchemy环境安装与基础使用

    简介 SQLAlchemy 是一个强大的 Python 库 用于与关系型数据库进行交互 它提供了高度抽象的对象关系映射 ORM 工具 允许使用 Python 对象来操作数据库 而不必编写原生SQL查询 本文将介绍如何安装 SQLAlchem
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 软件测试|教你如何使用Python绘制出奥运五环旗

    简介 我们之前介绍过使用turtle来绘制正多边形 但是绘制正多边形只是turtle模块最基础的使用 我们可以使用turtle模块绘制出更多不一样的精彩图形 本文就来给大家介绍一个比较简单的turtle绘图实例 绘制奥运五环旗 初始化参数
  • Python自动化测试 | 如何使用Robot Framework进行自动化测试?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 一篇文章带你了解Python常用自动化测试框架——Pytest

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Jmeter 性能-阶梯式性能指标监听

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 摸爬滚打多年的打工人,总结了三条职场真理,绝不假大空!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 新手也能看懂的【前端自动化测试入门】

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 软件测试中的白盒测试,这些技巧你知道吗?

    对于很多刚开始学习软件测试的小伙伴来说 如果能尽早将黑盒 白盒测试弄明白 掌握两种测试的结论和基本原理 将对自己后期的学习有较好的帮助 今天 我们就来聊聊黑盒 白盒测试的相关话题 1 黑盒测试的方法和小结 最常见黑盒测试方法包括 边界值 等
  • 月薪2W的软件测试工程师,到底是做什么的?

    在生活中 我们常常会遇到以下几种窘迫时刻 准备骑共享单车出行 却发现扫码开锁半天 车子都没有反应 手机导航打车 却发现地图定位偏差很大 司机总是跑错地方 买个水 却遭遇自动售货机吐币 或者不找零钱 好不容易休息打个游戏 却一直出现卡顿 闪退
  • Python常用的自动化小脚本!

    一 list转json string转json 可以使用Python内置的 json 模块将列表 List 和字符串 String 转换成JSON格式 List转JSON假设我们有一个列表 List my list apple banana
  • 2024拒绝行业内卷!八年软件测试20K*16薪行业心得 想入行必看

    目前工作做软件测试工作8年 属于高级测试员那个级别吧 现在看到各行各业的人都在转行学习软件测试 想给大家一些学习建议和忠告 很多粉丝都跟我说今年行情很差 找不到工资 真的找不到工作了吗 我们常在网上看到的 程序员饱和 程序员过剩 其实一般是
  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • 程序员找工作难!拿到外包公司的 offer 我应该去么?

    引言 前一阵子有一个帖子引起了非常广泛的讨论 描述的就是一个公司的外包工作人员 加班的时候因为吃了公司给员工准备的零食 被公司的HR当场批评 这个帖子一发出来 让现在测试行业日益新增的外包公司备受关注 那么外包公司和非外包公司有什么样的不一
  • 外包干了2个月,技术倒退2年。。。

    先说一下自己的情况 本科生 20年通过校招进入深圳某软件公司 干了接近4年的 功能测试 今年国庆 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了3年的女朋
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • Web自动化测试 —— capability参数配置

    一 capability概述 capability是webdriver支持的标准命令之外的扩展命令 配置信息 配置web驱动属性 如浏览器名称 浏览器平台 结合selenium gird完成分布式 兼容性测试 官网地址 https www

随机推荐

  • layui复选框

    效果图 layui复选框 一个主的复选框控制多个从复选框 主复选框和从复选框的颜色不一样 layui复选框的样式 都是在选然后才会有的 所以直接通过css设置就实现不了了 只可以通过js动态设置 html代码使用了jfinal的模板 div
  • C++之string

    一些简单的关于string对象的知识 以后还会补充 1 2 3 4 5 6 7 8 9 10 11
  • 详解C结构体、C++结构体 和 C++类的区别

    先来说说C和C 中结构体的不同 a C语言中的结构体不能为空 否则会报错 1 gt d myproject visual studio 2013 projects myc main c 71 error C2016 C 要求一个结构或联合至
  • IP地址学习总结

    IP地址 IP地址是局域网中某台主机的唯一标识 一段二进制编码 由32位组成 但是通常使用点分十进制来表示 便于记忆 x x x x 子网掩码 在同一局域网中 所有的IP必须在同一网段才能相互通信 而子网掩码用来标识是属于哪一个网段 确定I
  • uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

    效果图 实现了在uniapp项目中 微信小程序平台流畅的写字签名板 也可以绘图 功能源码 复制粘贴 改改样式几分钟即可搞定 支持自动横屏 持预览 真机运行测试非常流畅不卡顿 基础模板 如下代码所示
  • Harbor镜像仓库搭建

    1 安装docker comprose docker comprose是docker容器批量管理工具 curl L https get daocloud io docker compose releases download 1 25 0
  • Unity3d 物体速度、运动的控制——Input.GetAxis、transform.Translate、transform.Rotate、AddForce

    首先介绍Input GetAxis方法 官方文档给出的解释为 Returns the value of the virtual axis identified by axisName 返回根据参数名所指定的虚拟轴上的数值 public st
  • 深入浅出AXI协议(6)——传输属性

    一 前言 在之前的文章中 我们介绍的主要内容是AXI协议的数据读写结构和读写响应结构 主要讲述了当遇到各种特殊情况时 AXI如何完成数据的读写操作 最后介绍了读写响应的4种类型 在本文中 我们将介绍AXI协议的传输属性 二 传输类型与属性
  • 性能测试流程

    参考书籍 软件测试 黑马程序员编著 性能测试与普通的功能测试目标不同 因此其测试流程与普通的测试流程也不相同 虽然性能测试也遵循测试需求分析 测试计划制订 测试用例设计 测试执行 编写测试报告的基本过程 但在实现细节上 性能测试有单独一套流
  • GDAL源码剖析(一)

    转载自 http blog csdn net liminlu0314 article details 6933772 前言 一直在使用和研究GDAL的相关东西 发现网上对GDAL的内容倒是不少 但是很少有系统的介绍说明 以及内部的一些结构说
  • Centos7 交叉编译boost_1_70_0源码 AArch架构

    环境准备 centos7 镜像 下载地址 http mirrors aliyun com centos 7 9 2009 isos x86 64 aarch64交叉编译链 下载地址 https releases linaro org com
  • JS 使用hash算法计算字符串的哈希值

  • DFS遍历框架解决岛屿问题

    补充在开头 这篇题解 是我在做leetcode无意中看到的 原po将此类问题解释的非常清晰 故将其转载并添加上对应题目的解题代码 仅用做个人的学习笔记 不做任何商业用途 引言 我们所熟悉的 DFS 深度优先搜索 问题通常是在树或者图结构上进
  • [UE4笔记] 3DUI空间交互

    在Actor中使用widget的时候制作3DUI 如果直接选择World模式 鼠标和UI是无法产生交互的 只要勾选了红框里的选项 就可以正常交互了 老是忘记 所以写个笔记记录一下 效果 注意 如果你还是点击不到 输入控制台命令showfla
  • 第十题

    第十题 限制元素 修改限制 把3改了即可
  • 【嵌入式基础】串口通信

    目录 1 前言 2 基本概念 2 1 波特率 2 2 起始位 2 3 数据位 2 4 校验位 2 5 停止位 2 6 空闲位 3 工作模式 3 1 单工模式 3 2 半双工模式 3 3 全双工模式 4 同步通信和异步通信 4 1 同步通信
  • 【Mac 教程系列第 18 篇】如何修改 iTerm2 的背景图片

    这是 Mac 教程系列第 18 篇 如果觉得有用的话 欢迎关注专栏 默认终端的效果图是这样的 修改后的效果如下图所示 如果你已经习惯了默认终端的样式 前期看有背景图片的可能会不太适应 不过有时候尝试一下不同的风格 也许会有不同的体验 如何实
  • YOLO5 目标检测

    目录 1项目的克隆和必要的环境依赖 1 1项目的克隆 1 2项目代码结构整体介绍 1 3环境的安装和依赖的安装 2 数据集和预训练权重的准备 2 1利用labelimg标注数据和数据的准备 2 2 获得预训练权重 3训练自己的模型 3 1修
  • TCP详解 (三)Nagle算法和延迟确认

    文章目录 延迟确认 Nagle算法 Nagle算法遇上延迟确认 关闭Nagle算法 一些有关TCP通信量的研究如 Caceresetal 1991 发现 如果按照分组数量计算 约有一半的TCP报文段包含成块数据 如 FTP 电子邮件和 Us
  • unitTest+Ddt数据驱动测试

    我们设计测试用例时 会出现测试步骤一样 只是其中的测试数据有变化的情况 比如测试登录时的账号密码 这个时候 如果我们依然使用一条case一个方法的话 会出现大量的代码冗余 而且效率也会大大降低 此时 ddt模块就能帮助我们解决这个问题 dd