Python unittest结合DDT实现数据驱动测试详解

不晚
不晚
发布时间:2026-10-11 | 1人浏览过
原创

数据驱动测试(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自动化测试的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表