Как получить py.test для распознавания conftest.py в подкаталоге?

Итак, я просто потерял день, пытаясь выяснить, почему py.test не выполняет мой аутсорс, настройки для настройки сеанса и разборки. В конце концов я наткнулся (подсказка на this SO comment!) Этот маленький лакомый кусочек в плагинов:

Обратите внимание, что файлы conftest.py из подкаталогов по умолчанию не загружаются при запуске инструмента.

В моем проекте я получил файлы py.test(conftest.py и файлы тестов) в подкаталоге tests/, который кажется довольно стандартной настройкой. Если я запускаю py.test в каталоге тестов, все работает правильно. Если я запускаю py.test в корневом каталоге проекта, тесты все еще выполняются, но процедуры setup/teardown никогда не выполняются.

Вопросы:

  • Что такое "канонический" способ позволить пользователям правильно запускать тесты из корневого каталога проекта? Помещение conftest.py в корневой каталог мне кажется странным, потому что я чувствую, что все файлы, связанные с тестированием, должны оставаться в подкаталоге tests.
  • Почему (по дизайну) не conftest.py в подкаталогах, не загруженных по умолчанию? Я считаю, что это поведение любопытно, по меньшей мере, учитывая, что тесты в подкаталогах обнаруживаются по умолчанию, поэтому, похоже, очень мало дополнительных усилий при поиске файлов для почтовых ящиков тоже.
  • Наконец, как я могу использовать conftest.py в загрузке подкаталогов (т.е. отказаться от значения по умолчанию)? Я не мог найти это в документах. Я бы хотел избежать дополнительной консоли аргументы, если это возможно, поэтому я могу поместить что-либо в файл конфигурации или этажерка?

Любое понимание и советы очень ценятся, я чувствую, что потерял/потратил впустую много времени, чтобы диагностировать это, когда я мог бы написать тесты для моего проекта.: - (

Минимальный пример:

# content of tests/conftest.py
# adapted from http://pytest.org/latest/example/special.html
import pytest
def tear_down():
    print "\nTEARDOWN after all tests"

@pytest.fixture(scope="session", autouse=True)
def set_up(request):
    print "\nSETUP before all tests"
    request.addfinalizer(tear_down)

тестовый файл:

# content of tests/test_module.py
class TestClassA:
    def test_1(self):
        print "test A1 called"
    def test_2(self):
        print "test A2 called"

class TestClassB:
    def test_1(self):
        print "test B1 called"

Выход консоли:

pytest_experiment$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items 

tests/test_module.py test A1 called
.test A2 called
.test B1 called
.

====================================================== 3 passed in 0.02 seconds ======================================================
pytest_experiment$ cd tests/
pytest_experiment/tests$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items 

test_module.py 
SETUP before all tests
test A1 called
.test A2 called
.test B1 called
.
TEARDOWN after all tests


====================================================== 3 passed in 0.02 seconds ======================================================

Ответы

Ответ 1

После некоторой помощи на IRP-канале #pylib выясняется, что это была ошибка, исправленная в py.test 2.3.4.