Pytest работает очень медленно для проекта - PullRequest
2 голосов
/ 25 апреля 2019

Моя установка pytest работает очень медленно, особенно на этапе сбора.

Итак, я установил настройку pytest для своего проекта Django, и тестовые файлы каждого приложения Django находятся в отдельной папке, т. Е. Дерево выглядит следующим образом

root
|
+--a
|  |
|  +--tests
|       |
|       +--conftest.py
|       +--testAa.py
|       +--testBa.py
+--b
|  |
|  +--tests
|       |
|       +--conftest.py
|       +--testAb.py
|       +--testBb.py
...
pytest.ini

Файл pytest.ini указывает, где искать тесты, и имеет следующий контент

[pytest]
DJANGO_SETTINGS_MODULE = project.project.settings.test
python_files = tests.py test_*.py *_tests.py
addopts = --reuse-db

Для каждого приложения в папке tests у меня есть файл с именем contest.py. Этот файл создает набор объектов, которые многократно используются в тестовых файлах. Например, если объект класса A используется более одного раза, конкурс создает эту переменную один раз, и тесты используют этот конкурс в качестве входных данных. Каждый конкурс имеет декоратор @pytest.fixture(scope="function"), а тесты - декоратор @pytest.mark.django_db.

Я не думаю, что время загрузки вызвано конфликтами или декораторами, описанными в предыдущем абзаце, а скорее древовидной структурой и файлом pytest.ini, который я выложил. Есть ли правила для того, что является хорошей структурой для этого? Как я уже сказал, время загрузки чрезвычайно велико для сбора тестов. Чтобы быть более точным, у меня есть около 80 тестов, и сбор их занимает около 40 секунд. Запуск их всех занимает дополнительно 20.

1 Ответ

1 голос
/ 27 апреля 2019

Более или менее повторяется мой другой ответ :

Когда вы вызываете pytest, он будет сканировать все подкаталоги в корневом каталоге проекта в поисках тестов. Это может замедлить сбор тестов; может быть целесообразно исключить из проверки несвязанные каталоги. pytest предлагает для этого два варианта конфигурации:

  1. norecursedirs - содержит каталоги, которые будут исключены из сканирования. Используйте эту опцию, когда вы ищете шаблон «включить все, исключить выбранное». По умолчанию для 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" ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...