Отключить светильники 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 либо:
- ограничьте объем вашего приспособления autouse
- поместите no_requests в класс!--28-->
- не сделать это автоматическое использование, просто передать его в парамы каждого 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
Это хорошая практика. Может быть, другая организация могла бы помочь