Предполагается ли pytest собирать тесты из модулей зависимостей в виртуальной среде? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь настроить проект на другом ноутбуке, чем на моей обычной машине для разработки.В этом проекте есть несколько тестов на основе pytest, которые я написал за время существования проекта.Когда я запускаю

$ pytest -k tests/my_test.py

, я получаю список ошибок из тестов sqlalchemy, например:

_ ERROR collecting env/lib64/python3.5/site-packages/sqlalchemy/testing/suite/test_update_delete.py _
env/lib/python3.5/site-packages/py/_path/local.py:662: in pyimport
    __import__(modname)
env/lib/python3.5/site-packages/sqlalchemy/testing/suite/__init__.py:2: in <module>
    from sqlalchemy.testing.suite.test_cte import *
<frozen importlib._bootstrap>:968: in _find_and_load
    ???
<frozen importlib._bootstrap>:957: in _find_and_load_unlocked
    ???
<frozen importlib._bootstrap>:664: in _load_unlocked
    ???
<frozen importlib._bootstrap>:634: in _load_backward_compatible
    ???
env/lib/python3.5/site-packages/_pytest/assertion/rewrite.py:211: in load_module
    py.builtin.exec_(co, mod.__dict__)
env/lib/python3.5/site-packages/sqlalchemy/testing/suite/test_cte.py:11: in <module>
    class CTETest(fixtures.TablesTest):
env/lib/python3.5/site-packages/sqlalchemy/testing/suite/test_cte.py:99: in CTETest
    @testing.requires.ctes_with_update_delete
E   AttributeError: 'NoneType' object has no attribute 'ctes_with_update_delete'

Почему pytest собирает тесты из зависимости?Это должно сделать это?Если нет, как я могу это исправить?

Ноутбук, на котором я настраиваю этот проект, работает под управлением Ubuntu 18.04.Я создал virtualenv с Python 3.5.6 и без ошибок запустил pip install -r requirements в virtualenv, включая sqlalchemy и pymssql.

Ответы [ 3 ]

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

Я считаю, что проблема в том, как вы вызываете это.pytest -k tests/my_test.py, вероятно, не то, что вы хотите сделать: pytest tests/my_test.py, вероятно, тем не менее, поскольку это вызовет одиночный тестовый файл tests/my_test.py (никакой рекурсии не произойдет: в том числе в пакеты вашего сайта среды).Флаг -k предназначен для выражений (например, вы можете запустить все тесты с "http" в названии).

Это не имеет большого смысла, но каким-то образом бегун захватывает некоторыеТесты sqlalchemy (или они проваливаются на import, я не совсем уверен).Не похоже, что они должны совпадать (хотя бегун будет возвращаться в ваш каталог env), но я думаю, что это немного не в этом.Вы должны быть в состоянии решить свою проблему, просто вызвав pytest без опции -k.

PS Я не могу воспроизвести поведение, которое вы видите на моем окне Windows.

НТН.

0 голосов
/ 23 октября 2018

Когда вызывается pytest, он сканирует все дочерние каталоги в корневом каталоге проекта в поисках тестов;когда вы помещаете виртуальный env для конкретного проекта в корневой каталог проекта, он также будет сканироваться без исключения.Это может привести к включению в тестовый запуск нежелательных тестов (например, если у вас есть зависимости типа numpy или pandas, которые включают тесты в дистрибутив).

Чтобы обойти это, pytest предлагаетдва варианта конфигурации:

  1. norecursedirs - содержит каталоги, которые будут исключены из сканирования.Используйте эту опцию, когда вы ищете шаблон «включить все, исключить выбранное».См. Также wim s ответ для объяснения и примера использования.По умолчанию для norecursedirs установлено значение .*', 'build', 'dist', 'CVS', '_darcs', '{arch}', '*.egg', поэтому следует помнить, что при переопределении этой опции значения по умолчанию исчезают, и их необходимо добавить обратно.
  2. testpaths - содержит каталоги, которые должны учитываться только при сканировании, так что это в основном противоположно тому, что делает norecursedirs.Используйте эту опцию при поиске шаблона «исключить все, включить выделенное».Этот параметр также добавляет незначительное или более значительное ускорение к обнаружению тестов, в зависимости от того, что вы храните в корне проекта - большинство каталогов sudbirectories не будут проходить вообще, и запуск тестов начнется раньше.

    Использование: либо поместите параметры в pytest.ini / setup.cfg / tox.ini:

    [tool:pytest]
    testpaths = tests othertests doc
    

    или передайте их через --override-ini из командной строки.

    pytest -o "testpaths=tests othertests doc" ...
    

Перемещение директории env из исходных текстов проекта является вопросом выбора и зависит от среды разработки.direnv, pipenv и т. Д. Могут иметь разные взгляды на то, где должны находиться envs, но лично я не вижу проблем с сохранением envs в корне проекта.

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

Чтобы ответить на вопрос в заголовке, нет .

Это может быть признаком создания вашего venv и установки пакетов в каталоге, который не игнорируется.Держите их где-нибудь игнорируемыми, например, ~/.venvs/ или что-то еще.

В качестве альтернативы, в частности, --ignore=env, чтобы исключить сайт или иным образом настроить обнаружение теста в файле конфигурации:

# content of pytest.ini
[pytest]
norecursedirs = env
...