> For the complete documentation index, see [llms.txt](https://appsecurity.gitbook.io/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://appsecurity.gitbook.io/devops/ppc/ppc-langs/backend/python/testing/fixtures.md).

# Fixtures

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

## Example

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

```python
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. Следовательно, фикстуры могут переиспользоваться.

```python
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.

```python
@pytest.fixture(scope='function')
```

### Параметр Autouse

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

```python
@pytest.fixture(autouse=True)
```

### Параметр Name

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

```python
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 — позволяет изменить параметры среды и текущий каталог во время теста
*
