2016-06-20 2 views
8

Я установил новый плагин pytest (pytest-catchlog==1.2.2) и насколько мне это нравится, он разбивает мои модульные тесты для модуля регистрации (например,).Как отключить плагины pytest для отдельных тестов

Я бы хотел отключить этот плагин для файла test_logging.py (или даже класса или метода), но я не могу найти на нем никакой информации.

Единственный вариант, который я нашел до сих пор, состоит в том, чтобы выполнить pytest дважды: первый раз для test_logging.py только с отключенным catchlog (py.test -p no:catchlog test_logging.py) и второй раз для всех других тестовых файлов.

Пожалуйста, дайте мне знать, если я пропустил декоратор pytest или любой другой способ отключения плагинов во время выполнения.

+0

И как выглядит ошибка? Что конкретно не удалось? –

+1

К сожалению, у меня нет доступа к этому коду; он бросал операцию «ValueError: I/O» на закрытый файл », но точная трассировка стека теряется, если я не воссоздаю эту структуру тестирования. – Jovik

ответ

2

Вы не можете выборочно отключить произвольные плагины для выбранных тестов. Плагины загружаются на гораздо более ранней стадии - когда начинается pytest. И плагины фактически определяют, что делает pytest и как (например, параметры командной строки, коллекция тестов, фильтрация и т. Д.).

Другими словами, слишком поздно переопределять внутреннюю структуру pytest, когда она доходит до выполнения теста.

Ваш лучший случай, на самом деле, чтобы отметить тесты с @pytest.mark.nocatchlog и выполнять их по отдельности:

pytest -m 'nocatchlog' -p no:catchlog # problematic tests with no plugin 
pytest -m 'not nocatchlog`    # all other tests 

Если эти тесты не под вашим контролем, то есть, если вы не можете добавить метки, то вы можете только фильтр такими как -k test_logging или -k 'not test_logging' (т.е. по части их идентификатора узла).


Специально для этого pytest-catchlog плагина, вы можете сделать same hooks как это делает, и удалить его обработчик журнала из корня регистратора (при условии, что никаких других регистраторы не использовались в явном виде):

conftest.py:

import pytest 

def _disable_catchlog(item): 
    logger = logging.getLogger() 
    if item.catch_log_handler in logger.handlers: 
     logger.handlers.remove(item.catch_log_handler) 

@pytest.hookimpl(hookwrapper=True, trylast=True) 
def pytest_runtest_setup(item): 
    _disable_catchlog(item) 
    yield 

@pytest.hookimpl(hookwrapper=True, trylast=True) 
def pytest_runtest_call(item): 
    _disable_catchlog(item) 
    yield 

@pytest.hookimpl(hookwrapper=True, trylast=True) 
def pytest_runtest_teardown(item): 
    _disable_catchlog(item) 
    yield 
Смежные вопросы