Повторно использовать существующий контекстный менеджер в качестве приспособления для pytest - PullRequest
3 голосов
/ 24 февраля 2020

У меня есть менеджер контекста, который требуется для нескольких тестов. Вместо того чтобы писать блок with внутри каждого теста, я подумал, что было бы лучше создать фиксатор из этого диспетчера контекста и украсить тест с помощью @pytest.mark.usefixtures("my_fixture").

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

Вот что у меня есть:

import my_context_manager

@pytest.fixture
def my_fixture(arg1, arg2):

    with my_context_manager(arg1, arg2) as c:
        yield c

Это подходящий способ преобразовать существующий менеджер контекста в приспособление?

Я должен отметить, что мне известен contextlib.ContextDecorator для написания менеджера контекста, который можно использовать в качестве декоратора. Но мой менеджер контекста требует аргументов, и они не распознаются, когда они находятся в выражении типа @my_context_decorator(arg1, arg2).

1 Ответ

1 голос
/ 24 февраля 2020

Создал простой менеджер контекста, использовал его в качестве прибора и вызвал этот прибор в тесте.

Примечание. Преимущество использования менеджера контекста в этом случае заключается в том, что тест по-прежнему не проходит exit выполню. Однако, если вы напрямую вызываете диспетчер контекста в тесте и если тест не пройден, операторы пост-выхода не будут выполняться.

createcontextmanager.py

class ContextManager():
    def __init__(self):
        print('init method called')

    def __enter__(self):
        print('enter method called')
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback):
        print('exit method called')

test_checkcontextmanagerwithfixture.py

import pytest
import createContextManager as ccm

@pytest.fixture(name ="c")
def check():
    with ccm.ContextManager() as cm:
        yield "hello"

@pytest.mark.stackoverflow
def test_checkficture(c):

    assert c =="hello", 'failed'

Порядок вывода с помощью 'python -m pytest -m stackoverflow -v -s' у вас может быть что-то еще. Я думаю, что это мы хотим от менеджера контекста.

  • метод init с именем
  • метод ввода с именем
  • PASSED
  • метод выхода с именем
...