pytest和allure的使用指南-将不同环境下执行的用例展示在同一报告中
场景:
不同环境下运行的相同用例,如何将不同环境的执行结果都展示在同一个allure报告里
解决
通过对用例 node_id的修改完成让不同环境用例展示在同一个报告中
conftest配置
import pytest
# 注册自定义参数 cmdopt 到配置对象
def pytest_addoption(parser):
parser.addoption("--env", action="store",
default="None",
help="将自定义命令行参数 ’--env' 添加到 pytest 配置中")
def pytest_itemcollected(item):
env = item.config.getoption("--env")
item._nodeid = 'windows_'+env+'_'+item._nodeid
@pytest.fixture(scope='session')
def cmdopt(pytestconfig):
input_arg = pytestconfig.getoption('--env')
ht = pytestconfig.getoption('--html')
print('input_arg', input_arg)
print('ht', ht)
return input_arg
总结: pytest
的命令行接收数据是需要用到内置参数pytest_addoption(parser)
,函数里使用指定语句来添加自定义参数:parser.addoption("--env",action="store",default="None",help="将自定义命令行参数:--env 添加到pytest配置中")
然后内置的钩子参数pytest_itemcollected(item)
这个item
实际上是pytest收集用例时的item对象,会对每个用例都收集为一个item
对象,然后实际上allure报告上展示的用例是有唯一标识的比如用例的node_id
,然后这个node_id
是由什么决定的呢:通常由测试路径和函数名组成
所以通过内置钩子函数,在收集到用例item
后,对item
的node_id
进行修改,从而完成同一个用例,不同环境的id
不一样,当然了,在修改之前,为了实现动态修改,还需要从pytest
命令行中读取参数--env
的值来完成动态修改
这里的代码具体意思是当 pytest 收集到一个测试项(即一个测试用例)时,会调用这个钩子函数,并将 `item` 作为参数传递给它。以下是逐步的解释:
1. **钩子函数**:`pytest_itemcollected` 是一个 pytest 提供的钩子,用于在测试项被收集后触发。pytest 收集所有测试用例时,访问到每个测试用例就会调用这个函数。
2. **参数 `item`**:`item` 是当前被收集的测试项的对象,包含关于该测试用例的所有信息,例如名称、路径、模块等。
3. **修改 `item._nodeid`**:`item._nodeid` 是该测试项的唯一标识符,通常由测试路径和函数名组成。通过将 `item._nodeid` 前缀更改为 `'windows_'`,你实际上是在为每个被收集的测试项添加一个前缀。这可能用于标识测试在 Windows 上运行,便于后续的报告或输出管理。
测试文件
import allure
def test_demo(cmdopt):
print(cmdopt)
allure.dynamic.title(f"[标题]{cmdopt}")
allure.attach(f"Execution Environment: {cmdopt}", name="Environment Info", attachment_type=allure.attachment_type.TEXT)
a=10
print(a)
assert a==10