У меня есть проект, имеющий следующую структуру:
Project/
|
+-- src/
| |
| +-- proj/
| |
| +-- __init__.py
| +-- code.py
| +-- tests/
| |
| +-- __init__.py
| +-- conftest.py
| +-- test_code.py
+-- doc/
+-- pytest.ini
+-- setup.py
Импортируемый пакет proj
находится в каталоге src
.Тесты устанавливаются вместе с ним в подпакет proj.tests
.Код, сами тесты и установка работают нормально.Однако у меня возникают проблемы при передаче параметров в тесты.
У меня есть параметр --plots
, определенный в conftest.py
(в Project/src/proj/tests/
), который создает папку .plots/
в корневом каталоге.папку и помещает туда некоторую графическую отладку:
# conftest.py
def pytest_addoption(parser):
parser.addoption("--plots", action="store_true", default=False)
Существует два разных способа запустить этот тест:
Первый изкомандная строка в каталоге Project
:
$ pytest --plots
Это немедленно завершается ошибкой с
usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --plots
inifile: /.../Project/pytest.ini
rootdir: /.../Project
Если я добавлю каталог пакета, запуск пройдет нормально:
$ pytest src/proj --plots
...
rootdir: /.../Project, inifile: pytest.ini
...
Также все будет хорошо, если я укажу подкаталог test:
$ pytest src/proj/tests --plots
...
rootdir: /.../Project, inifile: pytest.ini
...
Второй способ - запустить функцию test
самого пакета.Функция test
определяется в Project/src/proj/__init__.py
следующим образом:
# __init__.py
def test(*args, **kwargs):
from pytest import main
cmd = ['--pyargs', 'proj.tests']
cmd.extend(args)
return main(cmd, **kwargs)
Функция предназначена для запуска после установки Project
следующим образом:
>>> import proj
>>> proj.test()
Как правило,это работает нормально, но если я делаю
>>> proj.test('--plots')
, я получаю ту же ошибку, что и обычно:
usage: [options] [file_or_dir] [file_or_dir] [...]
: error: unrecognized arguments: --plots
inifile: None
rootdir: /some/other/folder
Для этого теста я запустил python setup.py develop
, а затем cd
'dto
/ some / other / folder`, чтобы убедиться, что все установлено правильно.
Моя цель состоит в том, чтобы оба параметра работали правильно, когда я передаю параметр командной строки --plots
.Кажется, что я нашел обходной путь для варианта № 1, который заключается в том, чтобы вручную передать один из пакетов в pytest
, но я даже не до конца понимаю, как это работает (почему я могу передать либо src/proj
, либоsrc/proj/tests
?).
Итак, вопрос в том, как заставить pytest последовательно запускать мой тестовый пакет, чтобы получить правильный conftest.py
?Я готов рассмотреть любую разумную альтернативу, которая позволяет мне работать с опцией --plots
, работающей последовательно как в исходной версии (запущенной в оболочке из Project
), так и в версии proj.test()
.
Для справки, вот мой pytest.ini
файл:
# pytest.ini
[pytest]
testpaths = src/skg/tests
confcutdir = src/skg/tests
Кажется, что это не имеет никакого значения.
Я работаю с Pytest 3.8.0 на Pythons2.7, 3.3, 3.4, 3.5, 3.6 и 3.7 (в анаконде).Во всех версиях результаты воспроизводимы.