我正在尝试创建测试运行器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对象。可以对其进行操作以获取测试用例/类/模块名称。
答案 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)
这将解决您的目的