一篇搞懂ddt数据驱动测试

DDT是Python中用于unittest的数据驱动测试库,弥补了unittest自身缺乏数据驱动功能的不足。通过@ddt、@data、@unpack和@file_data等装饰器,可以实现测试数据与脚本的分离,方便地进行多组数据的测试。文章提供了直接在脚本中和从yaml、json文件中获取测试数据的示例,展示了DDT如何简化和增强unittest的测试用例。
摘要由CSDN通过智能技术生成

1. DDT简介

Python的unittest不像pytest,没有自带的数据驱动功能,所以如果在使用unittest时又想要用数据驱动来进行测试,那么就需要借助DDT来完成。
DDT全称Data-Driven Tests,通过DDT可以实现测试数据与测试脚本分离,它可以将测试数据加载到脚本中,采用数据驱动模式使一组或多组数据对应一个测试用例,从而实现自动化测试,可以有效减少代码量的同时也降低了代码的维护成本。

2. ddt模块安装

pip install ddt

3. 使用

ddt包含四种装饰器

  • @ddt:类装饰器,用来标记当前类使用ddt数据驱动
  • @data:函数装饰器,用来给函数传递数据;把传进来的数组组成元组,再对元组进行用例的遍历,根据索引取值。相当于对每个参数进行遍历
  • @unpack:函数装饰器,用来对传递的数据进行解包,解列表、元组、字典;添加unpack之后,ddt会自动把元组、列表或者字典对应到多个参数上
  • @file_data:函数装饰器,参数是文件名。用来直接读取yaml,json格式的文件数据 读取获取的数据是字典列表

导入模块

from ddt import ddt,data,unpack,file_data

4. 实战示例

4.1 直接在脚本文件中获取测试数据
import unittest,os
from ddt import ddt,data,unpack,file_data

'''1、单组、多组未分解元素'''
@ddt
class FooTestCase(unittest.TestCase):
    @data(1,2,3)
    def test_01(self,value):
        print(value)

    @data([1,2],[3,4])
    def test_02(self,value):
        print(value)

    @data({'name':'jack'},{'age':19})
    def test_03(self,value):
        print(value)

if __name__ == "__main__":
    unittest.main()


# 输出结果:
1
.2
.3
.[1, 2]
.[3, 4]
.{'name': 'jack'}
.{'age': 19}
.
----------------------------------------------------------------------
Ran 7 tests in 0.003s

OK
'''2、单组、多组分解元素'''
@ddt
class FooTestCase(unittest.TestCase):
    @data((1,2,3,4))
    @unpack
    def test_01(self,a,b,c,d):
        print(a,b,c,d)

    @data((1,2,3),(4,5,6))
    @unpack
    def test_02(self,value1,value2,value3):
        print(value1,value2,value3)
    
    @data([1,2,3],[4,5,6])
    @unpack
    def test_03(self,a,b,c):
        self.assertTrue(int(a)+int(b)>=int(c))

    @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])
    @unpack
    def test_04(self,a,b):
        print(a,b)



if __name__ == "__main__":
    unittest.main()


# 输出结果:
1 2 3 4
.1 2 3
.4 5 6
...{'name': 'lili', 'age': 12} {'sex': 'male', 'job': 'teacher'}
.
----------------------------------------------------------------------
Ran 6 tests in 0.002s

OK
'''字典数据的拆分(提取value值)'''
@ddt
class FooTestCase(unittest.TestCase):
    @data({'name':'lili','age':12},{'name':'john','age':10})
    @unpack
    # 注意这里的形参名称一定要跟字典的key名称一致,否则会报错
    def test_05(self,name,age):
        print(name,age)


if __name__ == "__main__":
    unittest.main()



# 输出结果:
lili 12
.john 10
.
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK
4.2 从yaml文件中获取测试数据
-
  name: '小红'
  age:  18
 
-
  name: '小明'
  age:  20
@ddt
class FooTestCase(unittest.TestCase):
    def setUp(self) -> None:
        print("-----Test ddt with file_data-----")


    @file_data("testdata1.yaml")
    @unpack
    # 同样的,形参名要跟字典的key名称一致
    def test_05(self,name,age):
        print("My name is:",name)
        print("I'm {} years old".format(age))


if __name__ == "__main__":
    unittest.main()

# 输出结果:
-----Test ddt with file_data-----
My name is: 小红
I'm 18 years old
.-----Test ddt with file_data-----
My name is: 小明
I'm 20 years old
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK
4.3 从json文件中获取测试数据
{
    "student1": {
        "name": "张无忌",
        "age": 24
    },
    "student2": {
        "name": "赵敏",
        "age": 20
    }
 }
@ddt
class FooTestCase(unittest.TestCase):
    def setUp(self) -> None:
        print("-----Test ddt with file_data-----")


    @file_data("testdata2.json")
    @unpack
    # 同样的,形参名要跟字典的key名称一致
    def test_05(self,name,age):
        print("My name is:",name)
        print("I'm {} years old".format(age))


if __name__ == "__main__":
    unittest.main()


# 输出结果:
-----Test ddt with file_data-----
My name is: 张无忌
I'm 24 years old
.-----Test ddt with file_data-----
My name is: 赵敏
I'm 20 years old
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK

以上就是本期文章的所有内容,感谢观看,如果对您有帮助请点赞关注+收藏,一键三连,多谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值