← Назад ко всем вопросам

Как использовать фикстуры в pytest?

1️⃣ Как кратко ответить

Фикстуры в pytest используются для подготовки тестовой среды и данных перед выполнением тестов. Они позволяют определить функции, которые могут быть автоматически вызваны перед тестами для настройки окружения, и могут быть переиспользованы в нескольких тестах. Это делает тесты более чистыми и поддерживаемыми.

2️⃣ Подробное объяснение темы

Зачем нужны фикстуры?

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

Как работают фикстуры?

Фикстуры в pytest определяются с помощью декоратора @pytest.fixture. Они могут возвращать данные, которые будут использоваться в тестах, и могут быть настроены на выполнение определенных действий до и после тестов.

Вот простой пример фикстуры:

import pytest
​
@pytest.fixture
def sample_data():
    # Подготовка данных
    data = {"key": "value"}
    return data
​
def test_example(sample_data):
    # Использование данных из фикстуры
    assert sample_data["key"] == "value"

В этом примере фикстура sample_data возвращает словарь, который затем используется в тесте test_example.

Преимущества использования фикстур

  1. Повторное использование кода: Фикстуры могут быть использованы в нескольких тестах, что уменьшает дублирование кода.
  2. Чистота тестов: Тесты становятся более читаемыми, так как логика подготовки данных вынесена в отдельные функции.
  3. Управление ресурсами: Фикстуры могут автоматически освобождать ресурсы после завершения тестов, например, закрывать соединения с базой данных.

Расширенные возможности фикстур

  • Параметризация: Фикстуры могут быть параметризованы, что позволяет запускать тесты с разными наборами данных.

    @pytest.fixture(params=[1, 2, 3])
    def number(request):
        return request.param
    ​
    def test_numbers(number):
        assert number in [1, 2, 3]
    
  • Скоуп фикстур: Фикстуры могут иметь разные уровни скоупа (function, class, module, session), что определяет, как часто они будут вызываться.

    @pytest.fixture(scope="module")
    def setup_module():
        # Выполняется один раз для всех тестов в модуле
        return "module setup"
    
  • Автоматический вызов: Фикстуры могут быть настроены на автоматический вызов без явного указания в тестах, используя параметр autouse=True.

    @pytest.fixture(autouse=True)
    def auto_setup():
        # Эта фикстура будет вызываться автоматически для каждого теста
        pass
    

Тема: Тестирование
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки