Python中DDT数据驱动详解

DDT(Data-Driven Testing,数据驱动测试)是一种软件测试方法,通过外部数据源(如Excel、CSV、数据库等)驱动测试用例的执行。它的核心思想是将测试数据与测试逻辑分离,从而提高测试的灵活性和可维护性。

以下是关于DDT的详细介绍和实现方法:


1. DDT 的核心概念

  • 测试数据与逻辑分离

  • 测试逻辑是固定的,而测试数据可以从外部文件或数据库中动态加载。

  • 数据可以是输入参数、预期结果或配置信息。

  • 数据源

  • 常见的数据源包括:CSV文件、Excel文件、JSON文件、数据库、API等。

  • 测试用例动态生成

  • 根据数据源中的每一行数据,动态生成一个测试用例。


  • 2. DDT 的优点

  • 提高测试覆盖率

  • 通过多组数据测试同一逻辑,覆盖更多场景。

  • 减少代码重复

  • 测试逻辑只需编写一次,数据可以动态加载。

  • 易于维护

  • 当测试数据变化时,只需修改数据源,而无需修改测试代码。

  • 支持复杂场景

  • 可以通过大量数据组合测试边界条件和异常情况。


  • 3. DDT 的实现方法

    以下是使用 Python 实现 DDT 的几种常见方式:

    方法 1: unittest 和 ddt 库

    ddt 是一个 Python 库,专门用于数据驱动测试。

  • 安装 ddt

    pip install ddt
  • 示例代码1:

    import unittest
    from ddt import ddt, data, unpack
    
    @ddt
    class TestMathOperations(unittest.TestCase):
    
        @data((1, 2, 3), (4, 5, 9), (10, -5, 5))
        @unpack
        def test_addition(self, a, b, expected_result):
            self.assertEqual(a + b, expected_result)
    
    if __name__ == "__main__":
        unittest.main()

    运行结果:

  • 每组数据会生成一个独立的测试用例。

  • 示例代码2:

    import requests
    import unittest
    from ddt import ddt, data
    test_data = [
        {'method':'post', 'url':'http://www.jd.com'},
        {'method':'put', 'url':'http://www.jd.com'},
        {'method':'put', 'url':'http://www.jd.com'},
    ]
    @ddt
    class Test(unittest.TestCase):
        @data(*test_data)
        def test01(self, case):
            print('请求', type(case))
            res = requests.request(method=case['method'], url=case['url'])
            print(res)
    
    
    if __name__ == '__main__':
        unittest.main()

    运行结果:

    请求 <class 'dict'>
    <Response [200]>
    请求 <class 'dict'>
    <Response [200]>
    请求 <class 'dict'>
    
    
    <Response [200]>
    Ran 3 tests in 0.423s
    
    OK

  • 方法 2:使用 pytest 和参数化

    pytest 是一个功能强大的测试框架,支持数据驱动测试。

  • 示例代码:

    import pytest
    
    # 测试数据
    test_data = [
        (1, 2, 3),
        (4, 5, 9),
        (10, -5, 5)
    ]
    
    @pytest.mark.parametrize("a, b, expected_result", test_data)
    def test_addition(a, b, expected_result):
        assert a + b == expected_result

    运行结果:

  • 每组数据会生成一个独立的测试用例。


  • 方法 3:从外部文件加载数据

    可以从 CSV、Excel 或 JSON 文件中加载测试数据。

  • 从 CSV 文件加载数据

    import csv
    import pytest
    
    def load_test_data_from_csv(file_path):
        test_data = []
        with open(file_path, newline='') as csvfile:
            reader = csv.reader(csvfile)
            next(reader)  # 跳过表头
            for row in reader:
                test_data.append(tuple(map(int, row)))  # 将数据转换为整数
        return test_data
    
    test_data = load_test_data_from_csv("test_data.csv")
    
    @pytest.mark.parametrize("a, b, expected_result", test_data)
    def test_addition(a, b, expected_result):
        assert a + b == expected_result

    CSV 文件示例 (test_data.csv):

    a,b,expected_result
    1,2,3
    4,5,9
    10,-5,5
  • 从 JSON 文件加载数据

    import json
    import pytest
    
    def load_test_data_from_json(file_path):
        with open(file_path) as f:
            return json.load(f)
    
    test_data = load_test_data_from_json("test_data.json")
    
    @pytest.mark.parametrize("data", test_data)
    def test_addition(data):
        assert data["a"] + data["b"] == data["expected_result"]

    JSON 文件示例 (test_data.json):

    [
        {"a": 1, "b": 2, "expected_result": 3},
        {"a": 4, "b": 5, "expected_result": 9},
        {"a": 10, "b": -5, "expected_result": 5}
    ]


  • 4. DDT 的最佳实践

  • 数据源管理

  • 将测试数据存储在外部文件中,便于维护和共享。

  • 数据格式标准化

  • 使用统一的格式(如 CSV、JSON)存储测试数据。

  • 边界测试

  • 在数据中包含边界值和异常值,确保测试覆盖全面。

  • 数据清理

  • 在测试前后清理测试环境,避免数据污染。

  • 测试报告

  • 生成详细的测试报告,记录每组数据的测试结果。


  • 5. DDT 的应用场景

  • API 测试

  • 使用多组输入参数测试 API 的响应。

  • UI 测试

  • 使用多组数据测试表单提交、登录等功能。

  • 数据库测试

  • 使用多组数据测试数据库查询和写入操作。

  • 性能测试

  • 使用多组数据模拟不同负载场景。

  • 作者:徐田垚

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中DDT数据驱动详解

    发表回复