pytest: предотвращает многократное выполнение импортированного автоматически используемого фикстера сеанса - PullRequest
0 голосов
/ 21 ноября 2018

Мои тестовые файлы pytest распределены по нескольким пакетам, и они имеют некоторые общие свойства.Тем не менее, я обнаружил, что мой автоматически используемый прибор в области сеанса запускается несколько раз.

Вот базовая структура моего проекта:

.
├── Pipfile
├── Pipfile.lock
├── __init__.py
├── common
│   ├── __init__.py
│   └── conftest.py
├── pkg_a
│   ├── __init__.py
│   ├── conftest.py
│   └── test_a.py
└── pkg_b
    ├── __init__.py
    ├── conftest.py
    └── test_b.py

А вот содержимое каждого .py file:

==> ./__init__.py <==

==> ./common/__init__.py <==

==> ./common/conftest.py <==
import pytest


@pytest.fixture(scope='session', autouse=True)
def setup():
    print 'setting up'
    yield
    print 'tearing down'


==> ./pkg_a/__init__.py <==

==> ./pkg_a/conftest.py <==
from common.conftest import *

==> ./pkg_a/test_a.py <==
def test():
    assert True

==> ./pkg_b/__init__.py <==

==> ./pkg_b/conftest.py <==
from common.conftest import *

==> ./pkg_b/test_b.py <==
def test_b():
    assert True

Вот вывод команды pytest:

➜ pytest -s pkg_a pkg_b
========================== test session starts ==========================
platform darwin -- Python 2.7.15, pytest-3.10.0, py-1.7.0, pluggy-0.8.0
rootdir: /path/to/the/project, inifile:
collected 2 items

pkg_a/test_a.py setting up
.
pkg_b/test_b.py setting up
.tearing down
tearing down


======================= 2 passed in 0.02 seconds ========================

Насколько я понимаю, для сессионных приспособлений они будут запускаться только один раз за время жизни pytestкоманда.Но здесь setting up и tearing down печатаются дважды, и они чередуются.

Есть ли способ выполнить прибор только один раз?Я хочу, чтобы setting up печатался только один раз в начале и tearing down в самом конце для всего сеанса тестирования.

PS Я знаю, что параметризованное устройство сеанса будет выполняться несколько раз.Но я не думаю, что мой прибор параметризован.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы правы.Сеанс с привязкой к области должен запускаться только один раз.Но если вы посмотрите внимательно, есть два установочных приспособления для test_a.Один из общего / conftest.py и другой из pkg_a / conftest.py.Вам не нужно импортировать common.conftest.py в pkg_a / conftest.py.pytest начинает сбор файлов conftest, начиная с корня проекта.Вы можете увидеть процесс установки прибора с помощью переключателя --setup-show: pytest test_a.py --setup-show.

Чтобы решить вашу проблему, вы можете удалить from common.conftest import * из ваших файлов test_a (b) /conftest.py.

Подробнее о коллекции контеста pytest здесь: https://docs.pytest.org/en/2.7.3/plugins.html

...