python怎么调用pytest_runtest_makereport钩子函数返回的结果

在conftest.py文件封装了pytest_runtest_makereport钩子函数,测试用例需要调用返回的结果数据保存到excel中,但是在调用函数pytest_runtest_makereport的时候提示要传入'item' and 'call',这个函数怎么调用,求大佬指教

以下是调用的报错信息

Traceback (most recent call last):
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\Scripts\pytest.exe\__main__.py", line 7, in <module>
    sys.exit(console_main())
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\config\__init__.py", line 189, in console_main
    code = main()
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\config\__init__.py", line 166, in main
    ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main(
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_callers.py", line 116, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\main.py", line 317, in pytest_cmdline_main
    return wrap_session(config, _main)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\main.py", line 305, in wrap_session
    config.hook.pytest_sessionfinish(
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_callers.py", line 133, in _multicall
    teardown[0].send(outcome)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\_pytest\terminal.py", line 867, in pytest_sessionfinish
    self.config.hook.pytest_terminal_summary(
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_hooks.py", line 433, in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_manager.py", line 112, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_callers.py", line 155, in _multicall
    return outcome.get_result()
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_result.py", line 108, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "C:\Users\001\AppData\Local\Programs\Python\Python38\lib\site-packages\pluggy\_callers.py", line 80, in _multicall
    res = hook_impl.function(*args)
  File "E:\python\pywork\ZJG_UI\conftest.py", line 56, in pytest_terminal_summary
    HandleExcel("C:\\Users\\001\\Desktop\\ZJGreport01.xlsx", 'collect').update_excel(pytest_runtest_makereport())
TypeError: pytest_runtest_makereport() missing 2 required positional arguments: 'item' and 'call'

在pytest中,pytest_runtest_makereport是一个钩子函数,它在pytest运行测试用例后被调用,并且会传入以下参数:

  • item:代表一个测试用例。它包含了关于这个测试用例的所有信息,包括测试用例的名称、测试用例的参数、测试用例的配置等。
  • call:代表一个测试用例的运行结果。它包含了测试用例是否通过、运行时间、是否抛出异常等信息。

在你的conftest.py文件中,你可能需要像下面这样定义pytest_runtest_makereport函数:

def pytest_runtest_makereport(item, call):
    # 在这里编写你的代码,处理测试用例的结果并保存到excel中
    pass

如果你想调用这个函数并传入itemcall,你需要在运行测试用例的过程中捕获pytest自动调用这个函数时传入的参数。一般来说,pytest会自动在内部处理这个钩子函数的调用,你不需要自己手动去调用。

关于你的错误信息,看起来你尝试直接调用pytest_runtest_makereport函数,而没有传入正确的参数。你应该在调用这个函数时传入对应的itemcall参数,例如:

report = pytest_runtest_makereport('your_test_case', some_result)

但是请注意,这并不是正确的调用方式。实际上,你应该等待pytest在运行测试用例时自动调用这个钩子函数,并传入正确的参数。如果你想在运行测试用例后手动调用这个函数,你需要自己模拟一个itemcall对象,但这通常是不必要的。

【以下回答由 GPT 生成】

根据您提供的信息,这个问题涉及的主要部分是如何调用pytest_runtest_makereport钩子函数,并获取其返回的结果数据。

首先,我将向您解释pytest_runtest_makereport钩子函数的作用和用法。pytest_runtest_makereport函数是在每次运行测试用例时被调用的钩子函数,它接收三个参数:item、call和report。其中,item参数表示测试用例的对象,call参数表示测试用例的执行调用对象,report参数表示测试用例的执行结果报告对象。这个钩子函数的主要作用是在测试用例执行完毕后生成一个结果报告,并将其返回。

那么在测试用例中,您可以通过调用pytest_runtest_makereport函数来获取钩子函数的返回结果和保存到Excel中。以下是一种可能的实现方式:

# conftest.py 文件中实现 pytest_runtest_makereport 钩子函数
import pytest

@pytest.hookimpl(tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 在这里实现你的钩子函数逻辑
    report = None  # 初始化 report 变量
    # 进行一些测试用例的结果处理和生成报告的操作
    # ...
    return report

# test_example.py 测试用例文件中获取钩子函数返回结果并保存到 Excel
import pytest
import openpyxl

@pytest.fixture(scope="function", autouse=True)
def save_report(request):
    # 获取当前测试用例的报告
    report = request.node.rep_setup[0].session.pytest_runtest_makereport(request.node, request.call)

    # 判断报告是否存在
    if report and report.when == "call" and report.passed:
        # 将报告数据写入到 Excel 文件中
        wb = openpyxl.Workbook()
        ws = wb.active
        ws.title = "Test Report"

        # 获取报告中的相关数据
        test_name = report.nodeid
        test_duration = report.duration

        # 将数据写入到 Excel 中
        ws.cell(row=1, column=1, value="Test Name")
        ws.cell(row=1, column=2, value="Duration")
        ws.cell(row=2, column=1, value=test_name)
        ws.cell(row=2, column=2, value=test_duration)

        # 保存 Excel 文件
        wb.save("test_report.xlsx")

        # 在控制台打印报告数据
        print(f"Test Name: {test_name}")
        print(f"Duration: {test_duration}")

# 一个示例的测试用例
def test_example():
    assert True

# 使用 pytest 运行测试
$ pytest test_example.py

在上述示例中,pytest_runtest_makereport 函数被定义在 conftest.py 文件中,并实现了你的钩子函数逻辑。然后,我们通过 save_report 修饰器装饰的 fixture 函数来获取报告和保存到 Excel 中。具体的操作是在 save_report 函数中实现的,它会检查报告是否存在并通过 openpyxl 库将报告数据写入到 Excel 文件中。

请注意,这只是一个简单的示例,具体的实现方法可能因您的需求和环境而有所不同。实际上,您可能需要根据实际情况来处理报告数据和生成 Excel 文件的逻辑。

希望这能帮助到您!如果您有任何进一步的问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^