Сообщить об ошибке.

Объект фикстуры request модуля pytest в Python

Функции фикстуры могут принимать объект 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: 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.