Невозможно получить имя теста при вызове выполнения 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)

Это решит вашу цель

Другие вопросы по тегам