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