Как получить результат теста функции в pytest для записи в мои собственные файлы журнала - PullRequest
0 голосов
/ 03 октября 2019

Я изучал / изучал это в течение нескольких дней, но не могу понять это. Все, что я хочу сделать, это получить статус каждой тестовой функции, чтобы я мог записать свои собственные файлы журнала.

Я почти уверен, что мне нужны части TestReport, хуки pytest_testreport_status и pytest_runtest_makereport. Я довольно новичок в pytest, и я просто не понимаю, как «склеить» все это вместе, чтобы это сработало.

Вот простой тест. Последний оператор в тесте - это вызов функции (process_test_function_results), который обрабатывает результаты теста и записывает результаты в файл журнала. Я считаю, что я хочу передать объект TestReport в process_test_function_results (). Просто не уверен, как заставить это работать с крючками и собрать все это вместе.

import pytest
import lib.dnet_generic as mynet_generic
import datetime

@pytest.mark.parametrize("cmd",[
    "show system version | no-more",
    "show bgp summary | no-more",
    "show bgp neighbor | no-more",
    ])
def test_cmds(logger, device_connections, testinfo, error_queue, cmd, rp_logger):

    dut =       testinfo['topo_map']['devices']['dev3']['name'] 
    connection = device_connections[dut]
    cmdOutput = connection.send_command(cmd)

    if "ERROR" in cmdOutput:
        err_time = datetime.datetime.now()
        err_mess = (f"ERROR: The command <{cmd}> returned an error.\n"
                    f"Time: {err_time}\n"
                    f"Device: {dut}\n"
                   )
        mess_level = "error"
        message = {'level' : mess_level , 'message' : err_mess} 
        error_queue.put(message)
        connection._write_session_log(err_mess)

    mynet_generic.process_test_function_results(error_queue, logger,testinfo,rp_logger)

Вот фрагмент того, как выглядит файл пользовательского вывода, записанный с помощью метода process_test_function_results. Вы заметите Результат: пусто. Я считаю, что я хочу заполнить Результат: TestReport.outcome

------------------------------------------------------------
---- Begin Function Test: test_isis_cmds[show
---- Start Time: Thu Oct 03 16:39:15  2019
------------------------------------------------------------


    --------------------------------------
    ---- Test Function completed at: Thu Oct 03 16:39:16  2019
    ---- Result:
    --------------------------------------

------------------------------------------------------------
---- Begin Function Test: test_isis_cmds[show
---- Start Time: Thu Oct 03 16:39:16  2019
------------------------------------------------------------


    --------------------------------------
    ---- Test Function completed at: Thu Oct 03 16:39:16  2019
    ---- Result:
    --------------------------------------

------------------------------------------------------------
---- Begin Function Test: test_isis_cmds[show
---- Start Time: Thu Oct 03 16:39:16  2019
------------------------------------------------------------


    --------------------------------------
    ---- Test Function completed at: Thu Oct 03 16:39:17  2019
    ---- Result:
    --------------------------------------

Спасибо за любую помощь. Al

1 Ответ

1 голос
/ 04 октября 2019

вы можете определить хуки в файле conftest.py, который должен находиться в PWD или системном пути.

PFA - пример тестового кода, чтобы проверить, является ли введенное число положительным

test.py

import pytest

@pytest.mark.parametrize("number",[1,3,0,-1])
def test_hooks(number):
    assert int(number) >= 0

conftest.py -> имеет логику захвата для записи результатов в журнал

import pytest

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    log_file = "test.log"
    outcome = yield
    result = outcome.get_result()
    if result.when == "call":
        try:
            with open(log_file, "a") as f:
                f.write(result.nodeid + "   " + result.outcome+ "    " + str(result.duration)
        except Exception as e:
            print("Error", e)
            pass

переменная result в фрагменте - это объект TestReport, который содержит подробности выполнения

Пример выходного файла журнала

test.py::test_hooks[1]   passed    0.000999927520752
test.py::test_hooks[3]   passed    0.000999927520752
test.py::test_hooks[0]   passed    0.00100016593933
test.py::test_hooks[-1]   failed    0.00100016593933

Вы можете изменить логику подключения в соответствии с вашими требованиями. Это может быть удобная ссылка https://docs.pytest.org/en/latest/reference.html для ссылок на объекты в pytest

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...