Невозможно получить имя теста при вызове выполнения Pytest из Python или подпроцесса
Я пытаюсь создать файл python для тестового прогона, который запускает pytest.exe в определенной папке testcase и отправляет результаты по электронной почте.
Вот мой код:
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
Проблема в том, что когда я запускаю команду "pytest.exe app_folder" в командной строке Windows, она может обнаружить тестовые случаи, выполнить их и получить результаты. Но когда я вызываю команду из файла.py либо с помощью os.command, либо с подпроцессом, происходит сбой со следующим исключением:
\conftest.py", line 85, in pytest_runtest_makereport
INTERNALERROR> test_case = str(item._testcase).strip(")")
INTERNALERROR> AttributeError: 'TestCaseFunction' object has no attribute
'_testcase'
Может ли кто-нибудь помочь мне понять, что здесь происходит? или любой другой способ получить имя теста?
Обновить:
Чтобы преодолеть эту проблему, я альтернативно использовал объект TestResult из ловушки pytest_runtest_makereport, чтобы получить подробности тестового примера.
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
В приведенном выше примере переменная отчета содержит объект TestResult. Этим можно манипулировать, чтобы получить имя testcase/class/module.
1 ответ
Вы можете использовать параметр 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)
Это решит вашу цель