Функции фикстуры могут принимать объект request
для самоанализа "запрашивающей" тестовой функции, класса или контекста модуля.
Прочитаем необязательный адрес SMTP-сервера из тестового модуля, который будет использовать фикстуру smtp_connection()
:
# файл conftest.py import pytest import smtplib @pytest.fixture(scope="module") def smtp_connection(request): # читаем атрибут тестового модуля "smtpserver" , и если # он не определен, то используем `smtp.gmail.com` server = getattr(request.module, "smtpserver", "smtp.gmail.com") smtp_connection = smtplib.SMTP(server, 587, timeout=5) yield smtp_connection print(f"Завершение {smtp_connection} ({server})") smtp_connection.close()
Теперь создадим тестовый модуль, который фактически устанавливает адрес SMTP сервера в пространстве имен модуля:
# файл test_anothersmtp.py # атрибут модуля `smtpserver` будет прочитан фикстурой `smtp_connection()` smtpserver = "mail.python.org" def test_showhelo(smtp_connection): assert 0, smtp_connection.helo()
Вуаля! Фикстура smtp_connection()
взяла имя почтового сервера из пространства имен модуля.
request
.Объект request
- это специальная фикстура FixtureRequest
, предоставляющая информацию о запрашиваемой тестовой функции.
Объект request
предоставляет доступ к запрашиваемому тестовому контексту и имеет необязательный атрибут param
на случай, если фикстура косвенно параметризована.
request
.request.fixturename
имя фикстуры,request.scope
областью действия фикстуры,request.fixturenames
имена всех активных фикстур,request.node
узел сбора,request.config
объект конфигурации,request.function
объект тестовой функции,request.cls
объект класса (может быть None
),request.instance
экземпляр (может быть None
),request.module
объект модуля,request.keywords
ключевые аргументы/маркеры базового узла,request.session
объект сессии,request.addfinalizer()
добавляет функцию финализатора/очистки,request.applymarker()
применяет маркер к одному вызову тестовой функции,request.raiseerror()
вызывает FixtureLookupError
с сообщением,request.getfixturevalue()
динамически запускает функцию-фикстуру.request.fixturename: Optional[str]
:Свойство request.fixturename
имя фикстуры, для которой выполняется этот запрос.
request.scope
:Свойство request.scope
строка с областью действия фикстуры, одна из 'function'
, 'class'
, 'module'
, 'package'
, 'session'
.
request.fixturenames
:Свойство request.fixturenames
имена всех активных фикстур в этом запросе.
request.node
:Свойство request.node
базовый узел сбора (зависит от текущей области запроса).
request.config
:Свойство request.config
объект конфигурации pytest
, связанный с этим запросом.
request.function
:Свойство request.function
объект тестовой функции, если запрос имеет область действия для каждой функции.
request.cls
:Свойство request.cls
объект класса (может быть None
), в котором была собрана тестовая функция.
request.instance
:Свойство request.instance
экземпляр (может быть None
), в котором была собрана тестовая функция.
request.module
:Свойство request.module
объект модуля, в котором была собрана тестовая функция.
request.keywords
:Свойство request.keywords
словарь словарь ключевых аргументов/маркеров базового узла..
request.session
:Свойство request.session
объект сессии фреймворка pytest
.
request.addfinalizer(finalizer)
:Метод request.addfinalizer()
добавляет функцию финализатора/очистки, которая будет вызываться после завершения выполнения последнего теста в контексте запрашивающего теста.
Аргумент finalizer
- вызываемый объект, который будет очищать ресурсы.
Пример использования request.addfinalizer
для разрыва соединения в фикстуре smtp_connection()
:
import smtplib import pytest @pytest.fixture(scope="module") def smtp_connection(request): connect = smtplib.SMTP("smtp.gmail.com", 587, timeout=5) def fin(): print("SMTP-соединение закрыто") connect.close() # запускаем функцию `fin()` # которая закрывает соединение request.addfinalizer(fin) return connect
request.applymarker(marker)
:Метод request.applymarker()
применяет маркер marker
к одному вызову тестовой функции.
Этот метод полезен, если неn необходимости использовать маркер для всех вызовов функций.
Аргумент marker
- объект, созданный вызовом pytest.mark.NAME(...)
.
request.raiseerror(msg)
:Метод request.raiseerror()
вызывает FixtureLookupError
с заданным сообщением msg
.
request.getfixturevalue(argname)
:Метод request.getfixturevalue()
динамически запускает функцию-фикстуру по ее имени argname
.
Вообще рекомендуется объявлять/передавать фикстуры через аргумент тестовой функции. Но если нужно использовать какую-то фикстуру только во время настройки теста, то можно использовать этот метод для получения ее внутри фикстуры или тела тестовой функции.
Если данную фикстуру не удалось найти, вызывает pytest.FixtureLookupError
.