Python 数据驱动工具:DDT

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值