Использование pytest_addoptions в некорневом conftest.py - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть проект, имеющий следующую структуру:

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.pyProject/src/proj/tests/), который создает папку .plots/ в корневом каталоге.папку и помещает туда некоторую графическую отладку:

# conftest.py
def pytest_addoption(parser):
    parser.addoption("--plots", action="store_true", default=False)

Существует два разных способа запустить этот тест:

  1. Первый изкомандная строка в каталоге 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
    ...
    
  2. Второй способ - запустить функцию 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 (в анаконде).Во всех версиях результаты воспроизводимы.

1 Ответ

0 голосов
/ 22 сентября 2018

Цитата из pytest_addoption документов :

Примечание: эта функция должна быть реализована только в плагинах или conftest.py файлах, расположенных в корневом каталоге тестов, из-за того, какpytest обнаруживает плагины во время запуска .

...

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

Когда вы вызываете pytest из Project dir, pytest распознает егов качестве корневого каталога игнорируется addoption хук в Project/src/proj/tests/conftest.py.

Если описанная вами структура проекта является требованием, я бы переместил хук pytest_addopts impl в отдельный модуль плагина;он может находиться в любом месте каталога проекта, например, Project/src/proj/tests/plugin_plots.py.Теперь, если вы позвоните

$ pytest -p src.proj.tests.plugin_plots

, будет запущен подсвечник addoption и аргументы будут добавлены правильно.

(вам может потребоваться настроить sys.path, чтобы иметь возможностьдля правильной загрузки пользовательского модуля плагина, например, используйте PYTHONPATH=. pytest -p или python -m pytest -p или установите проект в редактируемом режиме и т. д.)

Чтобы не вводить аргумент -p каждый раз, сохраните его в pytest.ini, например,

# pytest.ini
[pytest]
addopts=-p src.proj.tests.plugin_plots

Редактировать:

При программном запуске тестов расширять список аргументов:

def test(*args, **kwargs):
    from pytest import main
    cmd = ['-p', 'proj.tests.plugin_plots', '--pyargs', 'proj.tests']
    cmd.extend(args)
    return main(cmd, **kwargs)

должно работать очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...