DDT数据驱动

这篇具有很好参考价值的文章主要介绍了DDT数据驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ddt简单介绍
ddt(Data Driver Tests)数据驱动测试

二、使用ddt的好处

在设计用例的时候,有些用例只是参数数据的输入不一样,比如登录这个功能,操作过程是一样的。如果用例重复去写操作过程会增加代码量,对应这种多组数据的测试用例,可以用数据驱动设计模式,一组数据对应一个测试用例,用例自动加载生成。通过数据驱动主要是为了将用例数据和用例逻辑进行分离,提高代码的重用率以及方便用例后期的维护管理。

三、什么的项目适合ddt
举个例子来说明:例如需要设计登录的测试用例,对于登录来说,登录的前置条件不变,变化的是用户名 和密码(也就是仅仅测试数据的变化) 测试数据(test_data)可以用excel来写,也可以用csv来写一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合,所以在测试一个接口时,通常会编写多条 case,而这些除了传参不同外,并没有什么区别。这个时候就可以利用 ddt 来管理测试数据,提高代码复用率。

四、导入ddt模块
ddt属于第三方模块,需要安装,安装方法:
方法一:在cmd命令窗口中输入:pip install ddt
方法二:pycharm中打开终端,输入:pip install ddt

五、四种模式
ddt要与unittest单元测试框架一起结合使用
@ddt 引入ddt模块
@data 导入数据
@unpack 拆分数据
@file_data导入外部数据

六、ddt处理各种类型数据
需注意以下几点:
1.使用ddt模块要在测试类前用@ddt进行修饰
2.要导入测试数据需在测试用例(以test_开头的方法)前用@data修饰
3.若需对测试数据进行拆分需用@unpack修饰
4.若需导入外部数据需用@file_data修饰

 文章来源地址https://www.toymoban.com/news/detail-469491.html

1、分析ddt工作原理

仅通过一个小例子说明~

代码如下(示例):

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp每个测试用例执行前都执行一次")

    def tearDown(self):
        print("tearDown每个测试用例执行后都执行一次")

    @data(1,2,"hello")
    def test_single_element(self, value):
        """
        测试单组元素
        :return:
        """
        print(value)
        self.assertEqual(value,1)

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

结果展示: 

DDT数据驱动

代码中@data(1,2,“hello”)传入了三个元素,故ddt自动生成了3个测试用用例。第一个测试用例将数据1和1进行比较,断言通过;第二个测试用例将数据2和1进行比较,断言失败;第三个测试用例将测试数据“hello”与1进行比较,断言失败(是不是发现了什么?对!对于没有使用ddt的测试用例来说,一个test_开头的测试方法一次只能生成一个测试用例,但是!有了ddt之后,可以一次向测试方法中传入多个测试数据,而生成测试用例的个数则是根据@data中传入的测试数据的元素个数而定的)
 

2、ddt测试元祖数据

2.1 测试单组元素

代码如下(示例):

import unittest
from ddt import ddt, data, unpack  # 根据需要导入相应的模块


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp每个测试用例执行前都执行一次")

    def tearDown(self):
        print("tearDown每个测试用例执行后都执行一次")

    @data(1,2,"hello")
    def test_single_element(self, value):
        """
        测试单组元素
        :return:
        """
        print(value)
        

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

结果展示:

setUp每个测试用例执行前都执行一次
1
tearDown每个测试用例执行后都执行一次
setUp每个测试用例执行前都执行一次
2
tearDown每个测试用例执行后都执行一次
setUp每个测试用例执行前都执行一次
hello
tearDown每个测试用例执行后都执行一次

注意:上面的结果展示并不是控制台展示的全部结果内容,因为主要讨论的对于不同类型的数据ddt是如何处理的,所以我们只关注数据处理这一块(完整的结果类似于“1.分析ddt工作原理”中的结果展示

 

2.2 测试多组未分解元素

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp每个测试用例执行前都执行一次")

    def tearDown(self):
        print("tearDown每个测试用例执行后都执行一次")

  
    @data((12,2,3),(24,6,7))
    @unpack	 # 对于要分解的元素需用@unpack修饰
    def test_mul_un_elements(self,value1,value2,value3):
        # print(value1,value2,value3)
        print(value1)
        print(value2)
        print(value3)


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

结果展示:

setUp每个测试用例执行前都执行一次
12
2
3
tearDown每个测试用例执行后都执行一次
setUp每个测试用例执行前都执行一次
24
6
7
tearDown每个测试用例执行后都执行一次

 

3、ddt测试列表数据

3.1 多组未拆分数据

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp!")

    def tearDown(self):
        print("tearDown!")

    @data([1, 2, 3, 4], [5, 6, 7, 8])
    def test_single_list(self,value):
        print(value)


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

结果展示:

setUp!
[1, 2, 3, 4]
tearDown!
setUp!
[5, 6, 7, 8]
tearDown!

 

3.2 多组拆分数据

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp!")

    def tearDown(self):
        print("tearDown!")

    @data([1, 2, 3, 4], [5, 6, 7, 8])
    # def test_single_list(self,value):
    #     print(value)
    @unpack
    def test_single_list(self, value1, value2, value3, value4):
        print(value1, value2, value3, value4)

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

结果展示:

setUp!
1 2 3 4
tearDown!
setUp!
5 6 7 8
tearDown!

3.3 复杂列表(含字典)未拆分数据

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp!")

    def tearDown(self):
        print("tearDown!")

    @data([{"username":"ljx","password":"123456"},{"addresss":"wuhan","phone":"152738748"}])
    def test_work(self,value):
        print(value)


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

结果展示:

setUp!
[{'username': 'ljx', 'password': '123456'}, {'addresss': 'wuhan', 'phone': '152738748'}]
tearDown!

3.4 复杂列表(含字典)拆分

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp!")

    def tearDown(self):
        print("tearDown!")

    @data([{"username":"ljx","password":"123456"},{"addresss":"wuhan","phone":"152738748"}])
    @unpack
    def test_work(self,value1,value2):
        print(value1)
        print(value2)


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

结果展示:

setUp!
{'username': 'ljx', 'password': '123456'}
{'addresss': 'wuhan', 'phone': '152738748'}
tearDown!

4、ddt测试字典数据

4.1 多组数据未拆分

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp每个测试用例执行前执行一次")

    def tearDown(self):
        print("tearDown每个测试用例执行后执行一次")

    @data({"username": "ljx", "password": "123456"}, {"addresss": "wuhan", "phone": "152738748"})
    def test_work(self, value):
        print(value)


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

结果展示:

setUp每个测试用例执行前执行一次
{'username': 'ljx', 'password': '123456'}
tearDown每个测试用例执行后执行一次
setUp每个测试用例执行前执行一次
{'addresss': 'wuhan', 'phone': '152738748'}
tearDown每个测试用例执行后执行一次

4.2 多组数据拆分

注意:对于字典类型数据的拆分,需注意拆分时的形参必须与字典中的键一致(否则报错),并且对于多组字典进行拆分时,各个字典中包含的键必须一一对应(否则获取不到)

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp每个测试用例执行前执行一次")

    def tearDown(self):
        print("tearDown每个测试用例执行后执行一次")

    # @data({"username": "ljx", "password": "123456"}, {"username": "wuhan", "password": "152738748"})
    # @unpack
    # def test_work(self, value1, value2):  # 错误,对于字典的拆分,拆分参数必须与字典的键一致,否则报错
    #     print(value1)
    #     print(value2)

    @data({"username": "ljx", "password": "123456"}, {"username": "wuhan", "password": "152738748"})
    @unpack
    def test_work(self, username, password):
        print(username,password)

结果展示:

setUp每个测试用例执行前执行一次
ljx 123456
tearDown每个测试用例执行后执行一次
setUp每个测试用例执行前执行一次
wuhan 152738748
tearDown每个测试用例执行后执行一次

5、ddt测试字典列表数据结合

在实际应用中会存在数据比较多的情况,如果都直接把数据传入@data中会显得代码非常冗杂,以包含多个字典的列表数据为例,可将包含多个字典的元素存放在一个列表变量中,在@data中传入列表变量即可

代码如下(示例):

import unittest
from ddt import ddt, data, unpack


@ddt
class TestDdt(unittest.TestCase):
    def setUp(self):
        print("setUp!")

    def tearDown(self):
        print("tearDown!")

    test_data = [{"username": "ljx", "password": "123456"},
                 {"username": "wuhan", "password": "152738748"},
                 {"username": "1", "password": "18"}]

    @data(*test_data)	# *test_data将test_data变量拆包成3个字典元素
    def test_work(self, value):
        print(value.get("username"))
        print(value.get("password"))


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

结果展示:

setUp!
ljx
123456
tearDown!
setUp!
wuhan
152738748
tearDown!
setUp!
1
18
tearDown!


原文链接:https://blog.csdn.net/qq_39262610/article/details/110381878

 

 

到了这里,关于DDT数据驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【linux】NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver

    之前在ubuntu20.04安装过NVIDIA驱动可以正常使用,突然一天发现外扩显示器无法识别,使用NVIDIA-SMI查看时报错: DKMS全称是DynamicKernel ModuleSupport,它可以帮我们维护内核外的驱动程序,在内核版本变动之后可以自动重新生成新的模块。 1)安装DKMS 2)查看已安装的NVIDIA版本 3)重

    2024年02月11日
    浏览(30)
  • (java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver)IDEA中连接Oracle数据库失败,缺少驱动

    该问题出现在用idea连接Oracle数据库的时候,代码都写好了但是发现连不上Oracle。 (或者是能连Oracle,但是只能连一半。。。) 首先要保证自己的Oracle数据库是启动了的噢。 运行代码时,也就是这行代码会一直报错: 连接oracle数据库时,一直报错找不到驱动,后来发现自己

    2024年02月04日
    浏览(43)
  • 从0开始python学习-52.pytest之ddt数据封装

    1. 判断是否为ddt数据 2. 处理数据 3. yaml用例中设置和使用数据

    2024年01月21日
    浏览(35)
  • (三)(Driver)驱动开发之双机调试环境搭建及内核驱动的运行

    请参考另一篇:https://blog.csdn.net/qq_41273999/article/details/133341733 请参考另一篇:https://blog.csdn.net/qq_41273999/article/details/133376458 准备好安装包,勾选将VMware Workstation控制台工具添加到系统PATH。 输入秘钥:ZF71R-DMX85-08DQY-8YMNC-PPHV8,如果失效,勾选试用30天。 下载完成后, 以管理员身份

    2024年02月06日
    浏览(25)
  • linux (platform driver)平台设备驱动匹配方法

    linux2.6驱动开发系列教程_linux 驱动开发教程_老徐拉灯的博客-CSDN博客 linux驱动基础开发1——linux 设备驱动基本概念_老徐拉灯的博客-CSDN博客 linux驱动基础开发2——linux 驱动开发前奏(模块编程)_linux驱动模块开发环境_老徐拉灯的博客-CSDN博客 linux驱动模型开发2——linux pla

    2024年02月13日
    浏览(41)
  • pytest数据驱动(最简单)

    目录 第一种:通过yaml文件获取数据(一维列表) 第二种:通过yaml文件获取数据(二维列表) 第三种:通过yaml文件获取数据(@pytest.fixture) 资料获取方法 data.yaml文件内容如下: - \\\'软件测试\\\' - \\\'单元测试\\\' - \\\'自动化测试\\\' - \\\'性能测试\\\' - \\\'测试开发\\\' - \\\'测试架构师\\\' 测试用例内容

    2024年02月13日
    浏览(22)
  • Driver8833电机驱动模块的使用(STM32为主控)

    一、硬件 STM32C8T6、STLINK下载器 Driver8833:TI公司的DRV8833是双桥马达驱动器解决方案,包括有两个H桥驱动器,可驱动两个DC电刷马达,或一个步进马达, 螺线管和其它电感负载. DRV8833具有PWM绕组电流调整/限制,H桥的输出电流1.5A RMS,2A峰值,工作电压2.7V-10.8V。 编码电机 二、Driver8833的使

    2024年02月01日
    浏览(28)
  • Linux Centos7安装更新GPU driver驱动和cuda:

    目录 1. 查看显卡版本命令: 2. 更新驱动: 2.1 下载显卡驱动 2.2 安装前配置 2.3 安装显卡驱动 3. 下载更换cuda版本: 3.1 下载cuda: 3.2 安装过程中遇到一些选项,同意协议accept 3.3 vi ~/.bashrc末端加上配置信息 参考连接: nvidia-smi:GPU驱动版本,driverAPI(支持的最高cuda版本)。

    2024年02月15日
    浏览(36)
  • 驱动 | Linux | NVMe | 1. NVMe Driver的前世今生和工作原理概述

    本文主要参考这里 1 ’ 2 的解析和 linux 源码 3 。 此处推荐一个可以便捷查看 linux 源码的网站 bootlin 4 。 更新:2022 / 02 / 19 NVMe 离不开 PCIe , NVMe SSD 是 PCIe 的 endpoint 。 PCIe 是 x86 平台上一种流行的外设总线,由于其 Plug and Play 的特性,目前很多外设都通过 PCI Bus 与 Host 通信,

    2024年02月16日
    浏览(33)
  • Velodyne 64E S3 硬件连接和 velodyne_driver ROS驱动安装

    在当前的研究工作中,点云语义分割技术的应用显得尤为重要,而我选择了rangenet++作为分割算法的核心。尽管课题组拥有一款80线激光雷达,但是在实际测试中,我们发现该算法模型在我们的数据集上的泛化表现并不理想。为了改善这一情况,我们通过学术网络借用了一款性

    2024年01月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包