当前位置:网站首页 > 数据驱动管理 > 正文

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修饰

 

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() 

结果展示: 

710b3328f6b044a58f6e2411fe4a3bbe.png

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":""},{"addresss":"wuhan","phone":""}]) def test_work(self,value): print(value) if __name__ == '__main__': unittest.main() 

结果展示:

setUp! [{'username': 'ljx', 'password': ''}, {'addresss': 'wuhan', 'phone': ''}] 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":""},{"addresss":"wuhan","phone":""}]) @unpack def test_work(self,value1,value2): print(value1) print(value2) if __name__ == '__main__': unittest.main() 

结果展示:

setUp! {'username': 'ljx', 'password': ''} {'addresss': 'wuhan', 'phone': ''} 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": ""}, {"addresss": "wuhan", "phone": ""}) def test_work(self, value): print(value) if __name__ == '__main__': unittest.main() 

结果展示:

setUp每个测试用例执行前执行一次 {'username': 'ljx', 'password': ''} tearDown每个测试用例执行后执行一次 setUp每个测试用例执行前执行一次 {'addresss': 'wuhan', 'phone': ''} 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": ""}, {"username": "wuhan", "password": ""}) # @unpack # def test_work(self, value1, value2): # 错误,对于字典的拆分,拆分参数必须与字典的键一致,否则报错 # print(value1) # print(value2) @data({"username": "ljx", "password": ""}, {"username": "wuhan", "password": ""}) @unpack def test_work(self, username, password): print(username,password) 

结果展示:

setUp每个测试用例执行前执行一次 ljx  tearDown每个测试用例执行后执行一次 setUp每个测试用例执行前执行一次 wuhan  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": ""}, {"username": "wuhan", "password": ""}, {"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  tearDown! setUp! wuhan  tearDown! setUp! 1 18 tearDown! 

 

 

到此这篇DDT数据驱动_数据流驱动的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 【毕业季|进击的技术er】作为一名职场人,精心总结的嵌入式学习路线图2024-10-30 20:41:10
  • 深入理解Pentaho Kettle:一个强大的ETL工具2024-10-30 20:41:10
  • 数仓建模—初识数据治理_数仓的数据治理2024-10-30 20:41:10
  • 管理服务依赖关系+服务数据+事务边界_服务管理关系包括2024-10-30 20:41:10
  • 最全Linux驱动开发全流程详细解析(持续更新)2024-10-30 20:41:10
  • 数仓建模—企业数字化建设_数仓建设模型2024-10-30 20:41:10
  • 提升数据驱动能力的意义_提升数据驱动能力的意义是什么2024-10-30 20:41:10
  • 了解数据治理体系化建模_了解数据治理体系化建模的意义2024-10-30 20:41:10
  • 流程驱动管理vs 数据驱动管理_流程驱动管理vs 数据驱动管理哪个好2024-10-30 20:41:10
  • 数仓建模—数据架构_数仓数据建模的主流模型有哪些2024-10-30 20:41:10
  • 全屏图片