Fixtures

Fixtures — это функции, выполняемые pytest до (а иногда и после) фактических тестовых функций. Код в фикстуре может делать все, что вам необходимо. Вы можете использовать Fixtures, чтобы получить набор данных для тестирования. Вы можете использовать Fixtures, чтобы получить систему в известном состоянии перед запуском теста. Fixtures также используются для получения данных для нескольких тестов.

Example

Вот простой пример фикстуры, который возвращает число:

import pytest

@pytest.fixture()
def some_data():
    """Return answer to ultimate question."""
    return 42

def test_some_data(some_data):
    """Use fixture return value in a test."""
    assert some_data == 42

Фикстуры отлично подходят для хранения данных и передачи их в тесты!

Фикстуры в первую очередь ищутся в том же файле, что и сам тест, потом по всем conftest.py (это модуль, фикстуры из которого доступны всем тестам в том же каталоге, импортировать его не надо!).

Пример текстуры с подключением к db

Здесь используем Built-in фикстуру — tmpdir. Следовательно, фикстуры могут переиспользоваться.

import pytest
import tasks
from tasks import Task

@pytest.fixture()
def tasks_db(tmpdir):
    """Подключение к БД перед тестами, отключение после."""
    # Setup : start db
    tasks.start_tasks_db(str(tmpdir), 'tiny')

    yield  # здесь происходит тестирование

    # Teardown : stop db
    tasks.stop_tasks_db()

Параметры фикстур

Параметр Scope

Ниже приведено краткое описание каждого значения Scope:

  • scope='function'

    Выполняется один раз для каждой функции теста. Часть setup запускается перед каждым тестом с помощью fixture. Часть teardown запускается после каждого теста с использованием fixture. Это область используемая по умолчанию, если параметр scope не указан.

  • scope='class'

    Выполняется один раз для каждого тестового класса, независимо от количества тестовых методов в классе.

  • scope='module'

    Выполняется один раз для каждого модуля, независимо от того, сколько тестовых функций или методов или других фикстур при использовании модуля.

  • scope='session'

    Выполняется один раз за сеанс. Все методы и функции тестирования, использующие фикстуру области сеанса, используют один вызов setup и teardown.

@pytest.fixture(scope='function')

Параметр Autouse

Если мы хотим, чтобы фикстура применялась к каждому тесту без доп указаний, используем параметр autouse:

@pytest.fixture(autouse=True)

Параметр Name

Чтобы переименовать фикстуру:

import pytest

@pytest.fixture(name='lue')
def ultimate_answer_to_life_the_universe_and_everything():
    """Возвращает окончательный ответ."""
    return 42

def test_everything(lue):
    """Использует более короткое имя."""
    assert lue == 42

Built-in fixtures

  • tmpdir, tmpdir_factory — фикстура для работы с временными директориями (для создания файлов)

  • pytestconfig — фикстура для управления аргументами pytest

  • capsys — работа с stdin и stdout, а так же с отключением захвата этих потоков

  • monkeypatch — позволяет изменить параметры среды и текущий каталог во время теста

Last updated