自动化框架——PO设计模式自学——参数化配置——tdd数据驱动——python数据处理之 ddt,@data, @unpack(转载)
python 的unittest 没有自带数据驱动功能。
所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成。
DDT是 “Data-Driven Tests”的缩写,包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据),file_data(可以从json或者yaml中获取测试数据)
【通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有多个数据,以元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据】
说明:
@ddt 读取单个测试数据:-----装饰测试类,继承自TestCase的类
@data()---装饰测试方法,拿到几个数据数据就执行几条用例(可以以“*变量”传入括号;也可以直接括号放入数值,逗号隔开)
@data(a,b) ------那么a和b各运行一次用例
@data([a,d],[c,d]) -----如果没有unpack,那么[a,b]当成一个参数传入用例运行;如果有unpack,那么[a,b]被分解开,按照用例中的两个参数传递
@file_data(filename) ----对于json的文件,每一个json元素按照一个用例运行,可以依照python分解元组,列表或者字典的方式分解传入
@unpack ----解包,使用复杂的数据结构时,与此同时,测试方法的参数需要多个(参数的传值个数与解包后数量必须一一对应,“可以考虑用None”)
如果test_data的值很多(大于5)不建议使用unpack,可以考虑直接列表传出,索引取值(要注意参数不对等的情况)
【注意】使用请先导包
1.传列表
import unittest from ddt import ddt,data,unpack
import unittest from ddt import ddt,data,unpack test_data=[1,3] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) #脱外套只能一层 def test_print_data(self,item): print(item)
import unittest from ddt import ddt,data,unpack test_data=[[1,3],[4,5]] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) @unpack #在“脱外套”之后,针对你拿到的每一条数据根据逗号进行拆分 def test_print_data(self,a,b): #需要按拆出来的每条数据内的个数进行传参 print(a) print(b)
2.列表嵌套字典
如果需要对字典进行unpack 参数名需要与你的字典key对应
import unittest from ddt import ddt,data,unpack test_data=[{'no':1,'name':'小李'},{'no':2,'name':'小张'}] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) def test_print_data(self,a): #需要按拆出来的每条数据内的个数进行传参 print(a['no']) print(a['name'])
import unittest from ddt import ddt,data,unpack test_data=[{'no':1,'name':'小李'},{'no':2,'name':'小张'}] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) @unpack #在“脱外套”之后,针对你拿到的每一条数据根据逗号进行拆分 def test_print_data(self,no,name): #需要按拆出来的每条数据内的个数进行传参 print(no) print(name)
如果需要对字典进行unpack 参数名需要与你的字典key对应
import unittest from ddt import ddt,data,unpack test_data=[{'no':1,'name':'小李'},{'no':2,'name':'小张'}] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) @unpack #在“脱外套”之后,针对你拿到的每一条数据根据逗号进行拆分 def test_print_data(self,a,b): #需要按拆出来的每条数据内的个数进行传参 print(a) print(b) #结果会报错,参数名需要与你的字典key对应