Pytest: создание глобального приспособления для всего тестового прогона

У меня следующая структура модулей:

.
├── conftest.py
└── test
    ├── test_one.py
    └── test_two.py

Мой conftest.py содержит единственное приспособление:

import pytest

@pytest.fixture(scope='session')
def sophisticated_fixture():
    print('\nFixture init')
    yield 42
    print('\nFixture kill')

Мои test_{one,two}.py тесты выглядят так:

from conftest import sophisticated_fixture


def test_a(sophisticated_fixture):
    assert sophisticated_fixture == 42


def test_b(sophisticated_fixture):
    assert sophisticated_fixture == 42

Я ожидал, что запуск pytest -s в каталоге верхнего уровня приведет к запуску всех тестов с использованием одного и того же приспособления, поскольку я определил его как уровень сеанса. Однако бывает так:

============================= test session starts ==============================
platform linux -- Python 3.6.6, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: /home/tomasz/example, inifile:
collected 4 items

test/test_one.py 
Fixture init
..
test/test_two.py 
Fixture init
..
Fixture kill

Fixture kill


=========================== 4 passed in 0.01 seconds ===========================

Очевидно, что функция фиксации вызывается дважды для каждого тестового модуля, и фиксация завершается в самом конце тестового прогона.

Как я могу сделать свой прибор глобальным на время всего сеанса тестирования?


person tomuś    schedule 03.01.2019    source источник
comment
Нелепо уродливое решение: сделать глобальную переменную, содержащую значение фикстуры, инициализировать ее, только если она None. В любом случае, я бы ожидал, что у pytest будет более умный способ справиться с этим.   -  person tomuś    schedule 03.01.2019


Ответы (1)


Вам не нужно импортировать прибор в тестовый файл (ы). Приспособления автоматически обнаруживаются pytest. Попробуйте после удаления приведенной ниже строки из тестовых файлов.

from conftest import sophisticated_fixture
person Amit Verma    schedule 03.01.2019
comment
Я бы добавил, что импортировать что-нибудь из модулей conftest - плохая идея. - person hoefling; 04.01.2019