Pytest: передача тестовой переменной или тестового файла var в @ pytest.hookimpl (tryfirst = True, hookwrapper = True) - PullRequest
2 голосов
/ 22 июня 2019

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

В настоящее время, когда я смотрю на данные в @pytest.hookimpl(tryfirst=True, hookwrapper=True), переменные тестового файла или тестовые переменные не кажутся доступными.

Есть ли способ передать определенную переменную (переменные) из тестового файла, конкретный тест в тестовом файле или глобально из cli в @pytest.hookimpl(tryfirst=True, hookwrapper=True), например: (log_suite or log_test or cli_log) and log_file?

conftest.py

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    rep = outcome.get_result()
    setattr(item, "rep_" + rep.when, rep) # for later use

    if rep.when == 'call':
        data = {'when': rep.when, 'outcome': rep.outcome, 'nodeid':rep.nodeid}

        # the reason loggin is here, as I would like to log every test permutation result as its happening.
        if (log_suite or log_test or cli_log) and log_file: # somehow to get those
            # log logic

test_file.py

import pytest 

log_suite = True
log_file = '/tmp/pytest.log'

@pytest.mark.parametrize('t_params', {300_permutations})
def test_permutations(t_params):
    log_test = True

    # some test logic ...

1 Ответ

1 голос
/ 22 июня 2019

Вы можете получить доступ к переменным уровня модуля в хуках через item.module, например,

def pytest_runtest_makereport(item, call):
    yield
    log_file = item.module.log_file
    log_suite = item.module.log_suite
    ...

и т. Д.Однако вы не сможете получить доступ к переменным из локальной области функции, они к тому времени уже исчезли.Вы можете назначить их самому модулю, например, pytest:

def test_permutations(t_params):
    pytest.log_test = True

def pytest_runtest_makereport(item, call):
    yield
    log_test = pytest.log_test

или текущему тестовому модулю:

def test_permutations(t_params):
    globals()['log_test'] = True

def pytest_runtest_makereport(item, call):
    yield
    log_test = item.module.log_test

или использовать все, что определено глобально, например,кеш:

def test_permutations(t_params, request):
    log_test = True
    request.config.cache.set('log_test', log_test)

def pytest_runtest_makereport(item, call):
    yield
    log_test = item.session.config.cache.get('log_test', None)

Кстати, нет такого хука, как pytest_runtest_logger, перепроверьте это имя, иначе тесты не будут запущены.Вот справочник всех доступных хуков .

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