概述
在自动化测试中,参数化是提升测试效率的重要手段。虽然 @pytest.mark.parametrize
能够显著减少重复代码,但它存在一个关键限制:参数必须在测试运行前静态定义,无法适应动态数据场景。
以一个典型业务场景为例:
- A公司(100人)
- B公司(50人)
- C公司(10人)
需求:
- 随机选择一家公司
- 动态获取该公司所有人员信息
- 为每个人员生成独立的测试报告
技术挑战:
- 传统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动态参数化的强大之处