ddt(Data-Driven Tests)
即数据驱动测试,可以实现不同数据运行同一个测试用例(通过数据的不同来驱动测试结果的不同)。
利用ddt
模块可以实现测试数据与逻辑代码的分离。
ddt
模块常用的 api 不多,大致为 ddt, data, file_data, unpack
,四个api都为装饰器类型,下面逐个介绍
ddt.ddt
用来装饰继承unittest.TestCase
的测试类,声明该测试类使用数据驱动
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class TestDDT(unittest.TestCase):
pass
ddt.data
用来向测试方法传递测试数据,可以传递多组,并以不同数据类型传递(列表、字典、元祖)
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class TestDDT(unittest.TestCase):
@data(1, 2, 3)
def test_01(self, value):
self.assertEqual(value, 2)
@data([1, 2], [3, 4]) # 如果这样传递,[1, 2] 和 [3, 4] 会被依次当做测试数据传入
def test_02(self, value):
self.assertEqual(isinstance(value, list), True)
unpack
作用是分割元素。解包
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class TestDDT(unittest.TestCase):
@data([5, 6], [7, 8])
@unpack
def test_01(self, value1, value2): # 这样做会传递两次数据,分别为 5, 6 和 7, 8
print(value1, value2)
@data({
"name": "nancy", "age": 20}): # @data里的数据key必须与字典的key保持一致
@unpack
def test_02(self, name, age):
print(name, age)
file_data
会从json | yaml
中加载数据
需要注意的是,如果文件以.yml
或者.yaml
结尾,ddt
会作为yaml
类型处理,其他所有文件都会作为json
文件处理。例如.txt
import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class TestDDT(unittest.TestCase):
@file_data('./json_test.json')
def test_11(self, value):
print(value)
@file_data('./json_test2.json')
def test_10(self, start, end, value):
print(start, end, value)
json_test.json
{
"1": "test01",
"2": "test02",
"3": "test03"
}
json_test2.json
,这里面每组测试数据都为字典类型,所以在断言的时候可以根据字典的 key 取 value
{
"positive_integer_range": {
"start": 0,
"end": 2,
"value": 1
},
"negative_integer_range": {
"start": -2,
"end": 0,
"value": -1
},
"positive_real_range": {
"start": 0.0,
"end": 1.0,
"value": 0.5
},
"negative_real_range": {
"start": -1.0,
"end": 0.0,
"value": -0.5
}
}
官方文档