pytest — отделить логику фикстуры от тестов

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

Repository 1:
=============
/path/to/PackageA/test_A.py
/path/to/PackageB/test_B.py

Repository 2:
=============
/different_path/to/Common/conftest.py

Проблема в том, что когда я запускаю pytest на test_A.py или test_B.py, pytest не находит приборов, определенных в conftest.py. Пробовал играть с опцией --confcutdir, но безуспешно...

Единственный сценарий, который работает для меня, это запуск pytest из /different_path/to/Common/ при настройке pytest.ini testpath = /path/to/PackageA/ (кстати, запуск pytest /path/to/PackageA/ не сработал).


person alnet    schedule 20.12.2015    source источник
comment
Я думаю, что вы могли бы попробовать импортировать приборы, определенные в /different_path/to/Common/conftest.py, в /path/to/PackageA/conftest.py и /path/to/PackageB/conftest.py. Для этого вам нужно либо добавить этот каталог Common в свой PYTHONPATH, либо вы можете импортировать, используя полный путь, как показано здесь.   -  person running.t    schedule 21.12.2015


Ответы (1)


Решение этой проблемы — преобразовать Common в плагин pytest. Если у вас уже есть setup.py для этого Common проекта, просто добавьте это к вашему setup вызову:

# the following makes a plugin available to pytest
entry_points = {
    'pytest11': [
        'common = Common.plugin',
    ]
},

Однако вам придется переименовать Common/conftest.py в plugin.py (или что-то еще, кроме conftest.py), так как py.test специально обрабатывает это имя файла.

Если у вас нет setup.py для Common, вы можете заставить py.test использовать его как плагин, добавив addopts = -p Common.plugin к PackageA/pytest.ini и PackageB/pytest.ini.

person Bruno Oliveira    schedule 22.12.2015