Python中使用ddt数据驱动应注意的问题
前提条件:
需要先引入ddt和data,引入方法如下:
1、点击窗口右上角 project interpreter 点击左下角的“+”按钮,(如下图)
2、在新界面中搜索 ddt data,等待页面进行搜索,搜索出点击右下角的 install package 进行安装
如何使用ddt进行数据驱动:
1、引入ddt 和data
使用form ddt import ddt ,data,为什么不适用import ddt,data,详见https://www.cnblogs.com/qingrc/p/11648688.html
2、通过例子进行简单说明(未结合动态参数使用)
1)ddt 用来装饰类
2)data 用来装饰测试方法
在使用data进行解包后需要使用item来接收解包后的数据,
使用的数据为 t = ('苹果','火龙果','香蕉','柚子')
import unittest # import ddt,data # 该引进方法会报错 TypeError: 'module' object is not callable from ddt import ddt,data t = ('苹果','火龙果','香蕉','柚子') @ddt # 装饰类 class TestDdt(unittest.TestCase): @data(t) # 装饰方法,data解包之后 有几个参数就运行几条用例 def test_001(self,item): print('开始打印参数') print('取到的参数是{}'.format(item)) print('结束打印参数')
if __name__ == '__main__':
# p = TestDdt()
# p.test_001()
unittest.main()
注意:在调用的时候直接使用 unittest.main() 去调用,不能使用创建对象的方法去调用,原因为我们使用的是unittest框架 unittest.main()会实例化 TestCase的子类
3、结合动态参数生成多条测试用例
动态参数:*args
关键字参数:**kwargs
使用的数据为:t1 = (('苹果','火龙果'),('香蕉','柚子'))
import unittest # import ddt,data # 该引进方法会报错 TypeError: 'module' object is not callable from ddt import ddt,data t1 = (('苹果','火龙果'),('香蕉','柚子')) @ddt # 装饰类 class TestDdt(unittest.TestCase): @data(*t1) # 装饰方法,data解包之后 有几个参数就运行几条用例 def test_001(self,item): print('开始打印参数') print('取到的参数是{}'.format(item)) print('结束打印参数') if __name__ == '__main__': unittest.main()
可以根据运行结果进行对比 使用和未使用动态参数的区别
--未使用动态参数,可以看到我们运行了一条测试用例
--使用动态参数,将t1进行解包生成两个数据,执行两次测试用例
注意:运行结果里面 上方 . 代表运行一条测试用例成功,..代表两条测试用例运行成功。
4、unpack的使用方法
import unittest from ddt import ddt,data,unpack t1 = (('苹果','火龙果'),('香蕉','柚子')) @ddt # 装饰类 class TestDdt(unittest.TestCase): @data(*t1) # 装饰方法,data解包之后 有几个参数就运行几条用例 @unpack # 根据,将上一层的数据再次进行根据逗号进行拆分 因为是两个参数 所以要用两个参数进行接收,注意:有几个变量就用几个参数进行接收 def test_001(self,a,b): # 在此处给参数添加默认值 print('test_001开始打印参数') print('test_001取到的a是{}'.format(a)) print('test_001取到的b是{}'.format(b)) print('test_001结束打印参数') print() if __name__ == '__main__': unittest.main()
注意:当前后参数不一致时,添加默认值None ,所有参数都可以添加。
import unittest from ddt import ddt,data,unpack # t = ('苹果','火龙果','香蕉','柚子') t1 = (('苹果','火龙果'),('香蕉','柚子')) t2 = (('苹果','火龙果'),('香蕉','柚子','橘子')) # 当前后参数不一致时,添加默认值none 使得程序不报错 d = {'fruit1': '苹果', 'fruit2': '火龙果', 'fruit3': '香蕉', 'fruit4': '柚子'} # 只能打印出key d1 = [{'fruit1': '苹果', 'fruit2': '火龙果'}, {'fruit1': '香蕉', 'fruit2': '柚子'}] # 列表里面套2个字典,打印出来的是value @ddt # 装饰类 class TestDdt(unittest.TestCase): @data(*t2) # 装饰方法,data解包之后 有几个参数就运行几条用例 @unpack # 根据,将上一层的数据再次进行根据逗号进行拆分 因为是两个参数 所以要用两个参数进行接收,注意:有几个变量就用几个参数进行接收 def test_001(self,a,b,c=None): print('test_001开始打印参数') print('test_001取到的a是{}'.format(a)) print('test_001取到的b是{}'.format(b)) print('test_001取到的c是{}'.format(c)) print('test_001结束打印参数') print() @data(*d) # 装饰方法,data解包之后 有几个参数就运行几条用例 def test_002(self,item2): print('test_002开始打印参数') print('test_002取到的参数是{}'.format(item2)) print('test_002结束打印参数') print() @data(*d1) # 装饰方法,data解包之后 有几个参数就运行几条用例 @unpack # 如果解包的是字典,参数名应与key保持一致,否则报错 def test_003(self,fruit1,fruit2): print('test_003开始打印参数') print('test_003取到的参数是{}'.format(fruit1)) print('test_003取到的参数是{}'.format(fruit2)) print('test_003结束打印参数') print() if __name__ == '__main__': unittest.main()