python 的unittest 没有自带数据驱动功能。
所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成。
资料:http://ddt.readthedocs.io/en/latest/
ddt:
装饰类,也就是继承自TestCase的类。
ddt.data:
装饰测试方法。参数是一系列的值。
ddt.file_data:
装饰测试方法。参数是文件名。文件可以是json 或者 yaml类型。
注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。
如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。
如果文件中是字典,字典的值会作为测试用例参数。
ddt.unpack:
传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表对应到多个参数上。字典也可以这样处理。参见下面的示例方法test_7,方法中参数必须和字典的键一模一样
测试用例方法名生成规则
使用ddt后,会产生一个新的测试用例方法名:之前的测试用例方法名加上_ordinal_data
之前的测试用例方法名:即定义的测试用例方法名。比如def test_large(),这里就是test_large
ordinal:序列数,从1开始递加。data是传的数据值,数据是字典的话key会作为测试用例方法名的后缀显示
import unittest
from ddt import ddt,data,unpack,file_data
#导入ddt中的ddt,data,unpack方法
test=(4,5,6)
A=(7,8,9)
B=(1,2,3)
D=[11,22,33]
E={'三国':'诸葛亮','皇帝':'刘备','将军':'张飞'}
F={'三国':'诸葛亮','皇帝':'刘备','将军':'张飞'}
@ddt #首先用ddt装饰类
class caseddt_D1(unittest.TestCase):
#读取单个数据,传给所装饰方法的参数
@data(1,2,3)
def test_1(self,a):
print("a="+str(a))
#读取元组,元组是个整体,未拆分,传一个参数
@data((1,2,3))
def test_2(self,b):
print("b=" +str(b))
#读取变量里的数据
@data(test)
def test_3(self,c):
print("test结果"+str(c))
@data(A,B) #读取多个变量,未拆分,一次只传一个参数
def test_4(self,c):
print(c)
@data((11,22,33),(55,66,'kk')) # 读取多个变量,unpack就可以拆分输入的参数
@unpack
def test_5(self,a,b,c):
print(a,b,c)
#如果文件中是列表,用unpack拆分后,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。
@data(D) #列表和元组都可以读取
@unpack
def test_6(self,a,b,c):
print(a,b,c)
#如果文件中是字典,字典的键作为测试方法的参数名称,字典的值会作为测试用例参数传入。
@data(E) #此处传的是字典,下面定义的方法中参数必须是字典的键
@unpack
def test_7(self,三国,皇帝,将军):
print(三国,皇帝,将军)
@data(F) # 此处传的是字典,未拆分,当做整体传参
def test_7_A(self,a):
print(a)
#print(三国, 皇帝, 将军)
@data({'first': 1, 'second': 3, 'third': 2},
{'first': 4, 'second': 6, 'third': 5})
@unpack
def test_dicts(self, first, second, third):
self.assertTrue(first < third < second)
#读取json文件数据,需导入file_data
#读取json文件中的列表格式数据,传出的就是列表元素
@file_data('test_data_list.json')
def test_listjson(self,value):
print(value)
#读取字典格式的json数据,传出的是字典的值
@file_data('test_data_dict.json')
def test_dictjson(self, value):
print(value)
#读取yaml文件中的数据
@file_data('test_data_dict.yaml')
def test_dictyaml(self,vaule):
print((vaule))
@file_data('test_data_list.yaml')
def test_listtyaml(self, vaule):
print((vaule))
if __name__ == '__main__':
unittest.main(verbosity=2)
执行结果;
"C:\Program Files\Python37\python.exe" D:/PycharmProjects/lovetest/caseDDT/caseddt_Demo.py
test_1_1_1 (__main__.caseddt_D1) ... ok
test_1_2_2 (__main__.caseddt_D1) ... ok
test_1_3_3 (__main__.caseddt_D1) ... ok
test_2_1__1__2__3_ (__main__.caseddt_D1) ... ok
test_3_1__4__5__6_ (__main__.caseddt_D1) ... ok
test_4_1__7__8__9_ (__main__.caseddt_D1) ... ok
test_4_2__1__2__3_ (__main__.caseddt_D1) ... ok
test_5_1__11__22__33_ (__main__.caseddt_D1) ... ok
test_5_2__55__66___kk__ (__main__.caseddt_D1) ... ok
test_6_1__11__22__33_ (__main__.caseddt_D1) ... ok
test_7_1 (__main__.caseddt_D1) ... ok
test_7_A_1 (__main__.caseddt_D1) ... ok
test_dictjson_1_unsorted_list (__main__.caseddt_D1)
test_dictjson_1_unsorted_list ... ok
test_dictjson_2_sorted_list (__main__.caseddt_D1)
test_dictjson_2_sorted_list ... ok
test_dicts_1 (__main__.caseddt_D1) ... ok
test_dicts_2 (__main__.caseddt_D1) ... ok
test_dictyaml_1_unsorted_yamllist (__main__.caseddt_D1)
test_dictyaml_1_unsorted_yamllist ... ok
test_dictyaml_2_sorted_list (__main__.caseddt_D1)
test_dictyaml_2_sorted_list ... ok
test_listjson_1_Hello (__main__.caseddt_D1)
test_listjson_1_Hello ... ok
test_listjson_2_json列表格式 (__main__.caseddt_D1)
test_listjson_2_json列表格式 ... ok
test_listtyaml_1_Hello (__main__.caseddt_D1)
test_listtyaml_1_Hello ... ok
test_listtyaml_2_listyaml (__main__.caseddt_D1)
test_listtyaml_2_listyaml ... ok
----------------------------------------------------------------------
Ran 22 tests in 0.001s
OK
a=1
a=2
a=3
b=(1, 2, 3)
test结果(4, 5, 6)
(7, 8, 9)
(1, 2, 3)
11 22 33
55 66 kk
11 22 33
诸葛亮 刘备 张飞
{'三国': '诸葛亮', '皇帝': '刘备', '将军': '张飞'}
['json字典的值', 12, 15]
[15, 12, 50]
['dictyaml', 15, 12]
[15, 12, 50]
Hello
json列表格式
Hello
listyaml
Process finished with exit code 0