pytest-ddreport(参数化动态)-5

概述

在自动化测试中,参数化是提升测试效率的重要手段。虽然 @pytest.mark.parametrize 能够显著减少重复代码,但它存在一个关键限制:参数必须在测试运行前静态定义,无法适应动态数据场景。

以一个典型业务场景为例:

  • A公司(100人)
  • B公司(50人)
  • C公司(10人)

需求:

  1. 随机选择一家公司
  2. 动态获取该公司所有人员信息
  3. 为每个人员生成独立的测试报告

技术挑战:

  • 传统for循环会导致所有人员共享同一条测试记录
  • 静态参数化无法处理运行时获取的动态数据

上一篇文章<pytest-ddreport(接收参数)-4>

下面我将演示如何使用ddreport库打破这种静态定义的局限性,解决动态数据场景的测试需求。

项目结构

my_project/
│
├── tcases/
│   └── case_demo1.py
├── reports/
│── pytest.ini
├── conftest.py
└── main.py
项目结构说明
my_project【目录】项目目录
tcases【目录】用来存放测试用例文件
reports【目录】用来存放测试报告
pytest.ini【文件】pytest的配置文件
conftest.py【文件】用来加载ddreport库
main.py【文件】用来运行自动化的
case_demo1.py【文件】用来编写自动化

在本地创建上面的目录和文件结构,完成之后继续看下面步骤

=========================================================================

编写自动化

以下内容直接复制粘贴

1.conftest.py

# conftest.py
from ddreport import ddreport
import pytest


@pytest.fixture(scope='session')
def drt():
    return ddreport()

2.pytest.ini

[pytest]
testpaths = tcases
python_files = case_*.py
python_classes = Test*
python_functions = test_*

3.case_demo1.py

# case_demo1.py
import pytest

aa = [1]

class TestDemo1:

    def test_1(self, drt):
        """给变量添加数据"""
        aa.extend([2, 3])               # 局部变量
        drt.gval.set("bb", [10, 20])    # 全局变量,这种方式定义的变量可以跨文件访问

    @pytest.mark.parametrize("p", aa)
    def test_2(self, p, request, drt):
        request.node.function.__doc__ = f"这是pytest的参数化演示-{p}"
        print(drt.gval.get("bb"))

    @pytest.mark.parametrize("p", {"aa"})
    def test_3(self, drt, p, request):
        request.node.function.__doc__ = f"这是drt动态参数化演示-{p}"

    @pytest.mark.parametrize("p", {"drt.bb"})
    def test_4(self, drt, p, request):
        request.node.function.__doc__ = f"这是drt全局变量的动态参数化演示-{p}"

4.main.py

# main.py
import pytest


if __name__ == "__main__":

    pytest.main(
        [
            '--ddreport=reports/test.html',     # 测试报告路径
            '--desc=测试测试测试',               # 测试报告描述
            '--tester=duanliangcong',           # 测试人员
            'tcases/'                           # 执行目录下所有用例
        ]
    )

=========================================================================

运行自动化

运行main.py,完成后可以看到reports目录下已经生成了一个test.html报告

=========================================================================

测试报告

通过测试报告,可以很明显看到ddreport动态参数化的强大之处