0

我正在尝试创建测试运行程序 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 对象。可以对其进行操作以获取测试用例/类/模块名称。

4

1 回答 1

0

您可以将 shell=True 选项与 subprocess 一起使用以获得所需的结果

from subprocess import Popen
command='pytest.exe app_folder'   #you can paste whole command which you run in cmd
p1=Popen(command,shell=True)

这将解决您的目的

于 2017-12-14T10:16:16.237 回答