我正在尝试创建测试运行程序 python 文件,该文件在特定的测试用例文件夹中执行 pytest.exe 并通过电子邮件发送结果。
这是我的代码:
test_runner.py:
try:
command = "pytest.exe {app} > {log}".format(app=app_folder, log = log_name)
os.system(command)
except:
send_mail()
我在 conftest.py 中使用以下代码将屏幕截图添加到 pytest-html 报告中。在 conftest.py 中:
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
report = outcome.get_result()
extra = getattr(report, 'extra', [])
if pytest_html:
xfail = hasattr(report, 'wasxfail')
if (report.skipped and xfail) or (report.failed and not xfail):
test_case = str(item._testcase).strip(")")
function_name = test_case.split(" ")[0]
file_and_class_name = ((test_case.split(" ")[1]).split("."))[-2:]
file_name = ".".join(file_and_class_name) + "." + function_name
问题是,当我在 Windows 命令提示符下运行命令“pytest.exe app_folder”时,它能够发现测试用例并执行它们并获得结果。但是,当我使用 os.command 或 subprocess 从 .py 文件调用命令时,它会失败并出现以下异常:
\conftest.py", line 85, in pytest_runtest_makereport
INTERNALERROR> test_case = str(item._testcase).strip(")")
INTERNALERROR> AttributeError: 'TestCaseFunction' object has no attribute
'_testcase'
谁能帮我理解这里发生了什么?或任何其他方式来获取测试用例名称?
更新:
为了克服这个问题,我或者使用 pytest_runtest_makereport 挂钩中的 TestResult 对象来获取测试用例的详细信息。
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
在上面的示例中,报告变量包含 TestResult 对象。可以对其进行操作以获取测试用例/类/模块名称。