Python unittest结合DDT实现数据驱动测试详解
数据驱动测试(Data-Driven Testing, DDT)的核心在于将测试脚本与测试数据分离,适用于需要验证多组数据的单元测试或接口测试场景。在Python中,通过结合 unittest 框架与 DDT 库,可以高效实现这一目标。本文将介绍安装配置、核心装饰器用法及文件数据加载的具体操作。
环境准备与安装
实现数据驱动测试需安装 ddt 库。若需加载 .yml 或 .yaml 格式的配置文件,还需额外安装 PyYAML。安装命令如下:
pip install ddt
pip install PyYAML核心装饰器用法
DDT 模块主要包含类装饰器 @ddt 和方法装饰器。方法装饰器决定了数据如何传递给测试用例。
1. 基础数据传递:@data
@data 装饰器可接收列表、元组或字典。默认情况下,整个数据结构会作为单一参数传入测试函数。
import unittest
from ddt import ddt, data
def add(a, b):
return a + b
@ddt
class MyTest(unittest.TestCase):
@data({"a": "1", "b": 2})
def test_basic(self, data):
print(data)
if __name__ == '__main__':
unittest.main(verbosity=2)2. 解包参数:@unpack
当测试函数需要多个独立参数时,需配合 @unpack 使用。它会将列表或元组中的元素分解为多个参数传递。
import unittest
from ddt import ddt, unpack
def add(a, b):
return a + b
@ddt
class MyTest(unittest.TestCase):
@data((1, 5), (4, 2), (6, 7), (5, 6))
@unpack
def test_unpack(self, a, b):
print(f"a={a}, b={b}")
if __name__ == '__main__':
unittest.main(verbosity=2)对于字典数据,@unpack 同样适用,可直接将键值对映射为函数参数:
import unittest
from ddt import ddt, unpack
def add(a, b):
return a + b
@ddt
class MyTest(unittest.TestCase):
@data(
{"a": 1, "b": 1, "c": 2},
{"a": 0, "b": 0, "c": 0},
{"a": -1, "b": 1, "c": 0}
)
@unpack
def test_dict_unpack(self, a, b, c):
print(a, b, c)
if a + b == c:
print(True)
else:
print(False)
if __name__ == '__main__':
unittest.main(verbosity=2)3. 外部文件加载:@file_data
@file_data 装饰器支持从外部文件加载测试数据。文件扩展名决定了加载方式:
.json、.yml、.yaml:按对应格式解析。- 其他格式(如
.txt):默认按 JSON 格式加载。
JSON 文件示例:
{
"case1": {
"a": 1,
"b": 1,
"c": 2
},
"case2": {
"a": -1,
"b": 1,
"c": 0
},
"case3": {
"a": 0,
"b": 0,
"c": 0
}
}Python 调用代码:
import unittest
from ddt import ddt, file_data
def add(a, b):
return a + b
@ddt
class MyTest(unittest.TestCase):
@file_data("test.json")
def test_file_data(self, a, b, c):
print(a, b, c)
if __name__ == '__main__':
unittest.main(verbosity=2)若 JSON 结构包含嵌套的 data 和 result 字段,可调整函数参数以匹配:
import unittest
from ddt import ddt, file_data
def add(a, b):
return a + b
@ddt
class MyTest(unittest.TestCase):
@file_data("test.json")
def test_nested(self, data, result):
print(data, result)
if __name__ == '__main__':
unittest.main(verbosity=2)YAML 文件示例:
def add(a, b):
return a + b
@ddt
class MyTest(unittest.TestCase):
@file_data("test.yml")
def test_yaml(self, a, b, c):
print(a, b, c)
总结
通过 @data、@unpack 和 @file_data 的组合,可以实现灵活的数据驱动测试。这种方式不仅简化了测试代码的编写,还提高了测试用例的可维护性和扩展性。以上就是Python+unittest+DDT实现数据驱动测试的详细内容,更多关于Python自动化测试的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













