目录
1,DDT 简介
2,data 装饰器
3,unpack 装饰器
4,file_data 装饰器
5, 总结
1,DDT 简介
Data-Driven Tests(DDT)即数据驱动测试. 它允许您通过不同的测试数据来运行同一个测试用例, 使它作为多个测试用例出现. 其官方文档给出的定义如下:
DDT (Data-Driven Tests) allows you to multiply one test case by running it with different test data, and make it appear as multiple test cases.
DDT 的经典使用场景之一是: 测试用例的代码不变, 只有测试数据在变化. DDT 作为第三方库, 使用前需要先安装:
sudo pip3 install ddt
2,data 装饰器
@data()是一个装饰器, 它包含了您想提供给测试方法的值, 个数和测试方法参数一样多. 使用方法: 在测试类 (继承于 unittest.TestCase) 上面设置装饰器 @ddt, 在测试方法上设置装饰器 @data()
[示例 1] @data
- #coding:utf-8
- import unittest
- # 从 ddt 模块导入装饰器 ddt,file_data,unpack,data
- from ddt import ddt,file_data,unpack,data
- @ddt
- # 定义测试类 BoolTest
- class BoolTest(unittest.TestCase):
- @data(1,"hello",3>2)
- def test_true_001(self,value):
- self.assertTrue(value)
- @data("",1>2,{})
- def test_false_002(self,value):
- self.assertFalse(value)
- if __name__ == "__main__":
- unittest.main()
示例 1 运行结果如下:
我们只编写了两个测试方法, 但是通过 6 组不同的测试数据, 最终可以达到运行 6 个测试用例的目的. 这就是数据驱动测试的强大之处. 再来看一个多个输入值的示例.
@unpack 自动解压元组, 列表到多个参数; 字典到多个关键字参数.
3,unpack 装饰器
[示例 2] unpack dict
- #coding:utf-8
- import unittest
- # 从 ddt 模块导入装饰器 ddt,file_data,unpack,data
- from ddt import ddt,file_data,unpack,data
- # 测试取绝对值函数 abs()
- @ddt
- class AbsTest(unittest.TestCase):
- @data({"val":1,"res":1},
- {"val":0,"res":0},
- {"val":-1,"res":1})
- @unpack
- def test_abs(self,val,res):
- self.assertEqual(abs(val),res)
- if __name__ == "__main__":
- unittest.main()
示例 2 运行结果:
[示例 3] unpack list
- # 测试取绝对值函数 abs()
- @ddt
- class AbsTest(unittest.TestCase):
- # @data({"val":1,"res":1},
- # {"val":0,"res":0},
- # {"val":-1,"res":1})
- @data([-1,1],[0,0],[1,1])
- @unpack
- def test_abs(self,val,res):
- self.assertEqual(abs(val),res)
- if __name__ == "__main__":
- unittest.main()
示例 3 运行结果同示例 2.
4,file_data 装饰器
ddt 支持从文件中加载数据,@file_data()装饰器会从 JSON 或 YAML 中加载数据. 只有以 ".yml" 和 ".yaml" 结尾的文件被加载为 YAML 文件. 所有其他格式文件都作为 JSON 文件加载, 比如 txt. 修改示例 3.
abs_data.JSON 文件位于测试用例同级目录, 内容如下:
- {
- "case1":{
- "val":1,
- "res":1
- },
- "case2":{
- "val":-1,
- "res":1
- },
- "case3":{
- "val":0,
- "res":0
- }
- }
[示例 4] load JSON
在测试方法 test_abs 上设置 @file_data 装饰器:
- # 测试取绝对值函数 abs()
- @ddt
- class AbsTest(unittest.TestCase):
- # @data({"val":1,"res":1},
- # {"val":0,"res":0},
- # {"val":-1,"res":1})
- @file_data("./abs_data.json")
- def test_abs(self,val,res):
- self.assertEqual(abs(val),res)
- if __name__ == "__main__":
- unittest.main()
示例 4 运行结果:
5, 总结
使用数据驱动思想编写测试用例有以下优势:
测试代码和测试数据分开, 比较灵活, 易维护.
在测试代码相对健壮的情况下, 新增用例只需新增测试数据即可, 开发难度小.
避免编写大量相同的测试代码, 代码复用率高.
劣势是对测试代码的质量要求相对较高, 试想如果因为测试数据的变化而需要频繁改动测试方法, 那也是一件很痛苦的事情哦. 关于测试数据驱动测试, 有的玩法是通过从 Excel 加载测试数据, 这一定程度上来讲也是可行的, 但是碰到复杂的业务场景和测试数据比较多的情况, 非常容易翻车的哦. 商用的系统业务场景一般都不简单, 毕业设计做的 *** 管理系统除外, 而且使用 Excel, 测试依赖这个痛点也不好解决. 后面有时间的话, 写一下关于 Excel+request+unitest 接口自动化测试框架的开发过程.
(完)
点击这里返回本篇目录
来源: https://www.cnblogs.com/webDepOfQWS/p/10767790.html