pytest和allure的使用指南-将不同环境下执行的用例展示在同一报告中

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后,对itemnode_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