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()

 

posted @ 2019-10-10 16:48  追大奔的兔子  阅读(1804)  评论(0编辑  收藏  举报