从python或subprocess调用pytest执行时无法获取testname

时间:2017-12-13 10:25:02

标签: pytest pytest-html

我正在尝试创建测试运行器python文件,它在特定的testcase文件夹中执行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 hook中的TestResult对象来获取测试用例的详细信息。

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()

在上面的示例中,report变量包含TestResult对象。可以对其进行操作以获取测试用例/类/模块名称。

1 个答案:

答案 0 :(得分:0)

你可以在子进程中使用shell = True选项来获得所需的结果

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

这将解决您的目的