Отключить светильники autouse на определенных метках pytest

можно ли предотвратить выполнение светильников с" функциональным диапазоном " с помощью autouse=True только на конкретные марки?

у меня есть следующее приспособление, установленное на autouse, чтобы все исходящие запросы автоматически высмеивались:

@pytest.fixture(autouse=True)
def no_requests(monkeypatch):
    monkeypatch.setattr("requests.sessions.Session.request", MagicMock())

но у меня есть знак под названием endtoend который я использую для определения серии тестов, которым разрешено делать внешние запросы для более надежного сквозного тестирования. Я хотел бы ввести no_requests во всех тестах (подавляющее большинство), но не в тесты, как следующее:

@pytest.mark.endtoend
def test_api_returns_ok():
    assert make_request().status_code == 200

это возможно?

3 ответов


вы также можете использовать request объект в вашем приспособлении, чтобы проверить маркеры, используемые в тесте, и ничего не делать, если установлен конкретный маркер:

import pytest

@pytest.fixture(autouse=True)
def autofixt(request):
    if 'noautofixt' in request.keywords:
        return
    print("patching stuff")

def test1():
    pass

@pytest.mark.noautofixt
def test2():
    pass

выход с -vs:

x.py::test1 patching stuff
PASSED
x.py::test2 PASSED

Я не смог найти способ отключить светильники с autouse=True, но я нашел способ вернуть изменения, внесенные в мой no_requests приспособление. monkeypatch метод undo это возвращает все патчи, сделанные в стеке, поэтому я смог вызвать его в своих тестах endtoend следующим образом:

@pytest.mark.endtoend
def test_api_returns_ok(monkeypatch):
    monkeypatch.undo()
    assert make_request().status_code == 200

было бы трудно и, вероятно, невозможно отменить или изменить autouse

вы не можете canel autouse, будучи, как это автоиспользовать. Возможно, вы могли бы сделать что-то, чтобы изменить приспособление autouse на основе состояния метки. Но это было бы банально и трудно.

возможно:

import pytest
from _pytest.mark import MarkInfo

Я не мог найти способ сделать это, но, возможно,@pytest.fixture(autouse=True) может получить MarkInfo, и если он вернулся "endtoend", fixture не будет устанавливать атрибут. Но вам также придется установить условие в параметры прибора.

т. е.: @pytest.fixture(True=MarkInfo, autouse=True). Что-то вроде того. Но я не мог найти способ.


рекомендуется организовать тесты, чтобы предотвратить это

вы можете просто отделить no_requests от тестов endtoend либо:

  1. ограничьте объем вашего приспособления autouse
  2. поместите no_requests в класс!--28-->
  3. не сделать это автоматическое использование, просто передать его в парамы каждого def вам это нужно

вот так:

class NoRequests:
    @pytest.fixture(scope='module', autouse=True)
    def no_requests(monkeypatch):
        monkeypatch.setattr("requests.sessions.Session.request", MagicMock())
    def test_no_request1(self):
        # do stuff here
    # and so on

Это хорошая практика. Может быть, другая организация могла бы помочь


но в вашем случае, наверное, легче monkeypatch.undo()