Конфигурирование

Опции командной строки и настройки конфигурационного файла

Чтобы получить помощь по командной строке и настройкам конфигурационных файлов, используйте стандартную опцию -h:

pytest -h   # справка по опциям и настройкам конфигурационного файла

Будут отображены опции командной строки и конфигурационных файлов, которые зарегистрированы установленными плагинами.

Инициализация: определение корневой директории и файла инициализации

pytest определяет корневую директорию rootdir при каждом прогоне тестов в зависимости от параметров командной строки (уточняющих пути и файлы) и существования инициализирующих файлов (ini-files). Определенные таким образом rootdir и ini-file печатаются в заголовочной части при запуске pytest.

Для чего pytest использует rootdir:

  • Для генерации идентификаторов узлов во время сборки тестов; каждому тесту сопоставляется уникальный nodeid относительно rootdir, который учитывает полный путь, имена класса и функции, а также значение параметризации (если есть).

  • Используется плагинами для хранения специфичной для проекта/запуска тестов информации; к примеру, внутренний плагин cache создает в rootdir поддиректорию .pytest_cache для хранения состояний выполнения тестов.

rootdir НЕ используется для модификации sys.path/PYTHONPATH и не оказывает влияния на импорт модулей. Подробнее см. sys.path/PYTHONPATH и механизм импорта pytest.

Опцию командной строки --rootdir=path указывают для принудительной установки определенного каталога. Передаваемый каталог может включать переменные окружения, если используется совместно с addopts из файла pytest.ini.

Алгоритм нахождения rootdir

Вот алгоритм поиска корневого каталога из args:

  • определяем общий родительский каталог для переданных аргументов, которые распознаны в качестве существующих путей файловой системы. Если таких аргументов-путей нет, то текущей рабочей директорией становится общий родительский каталог;

  • ищем файлы pytest.ini, tox.ini и setup.cfg в каталоге-предке и выше. Если находим - он становится ini-файлом, а его каталог становится rootdir.

  • если ini-файлы не найдены, для определения rootdir ищем файл setup.py вверх от общего каталога-предка.

  • если файл setup.py не найден, ищем файлы pytest.ini, tox.ini и setup.cfg в каждом указанном аргументе args и выше. Если нашли - он становится ini-файлом, а его директория становится корневой.

  • если вообще никаких ini-файлов не найдено, то в качестве rootdir используется уже определенный общий каталог-предок. Это позволяет использовать pytest в стуктурах, которые не являются частью пакета и не имеют никакой конкретной конфигурации.

Если никакие args не указаны, pytest начинает определение rootdir из текущего рабочего каталога и оттуда же собирает тесты.

Предупреждение

В настраиваемых плагинах pytest аргументы командной строки могут включать путь, как в pytest --log-output ../../test.log args. В этом случае передавать args обязательно, в противном случае pytest использует для определения корневой директории папку test.log (также см. issue 1435). Для ссылки на текущий рабочий каталог можно использовать точку ".".

Обратите внимание, что существующий файл pytest.ini всегда будет считаться ini-файлом, тогда как tox.ini и setup.cfg файлы должны содержать секции [pytest] или [tool:pytest] соответственно. Опции из разных кандидатов в ini-файлы никогда не сливаются - побеждает первый найденный (при этом pytest.ini побеждает всегда, даже если в нем нет секции [pytest]).

Затем объект config приобретает следующие атрибуты:

  • config.rootdir: определенная корневая директория, гарантированно существует.

  • config.inifile: определенный ini-файл, может быть и None.

rootdir используется для генерации идентификаторов узлов тестов («nodeids»). Ее также могут использовать плагины для хранения установочной информации.

Пример:

pytest path/to/testdir path/other/

здесь определяется общий предок path и потом ini-файлы ищутся следующим образом:

# первый круг поиска файлов pytest.ini
path/pytest.ini
path/tox.ini    # должен содержать секцию [pytest]
path/setup.cfg  # должен содержать секцию [tool:pytest]
pytest.ini
... # все пути вплоть до корня

# теперь ищем setup.py
path/setup.py
setup.py
... # все пути вплоть до корня

Как изменить опции командной строки по умолчанию

Печатать одни и те жа параметры командной строки каждый раз при запуске pytest может быть утомительно. К примеру, вы всегда хотели бы видеть подробную информацию и пропущенных и «xfail» тестах и лаконичную «точку» для прошедших. Тогда вы можете написать в конфигурационном файле:

# content of pytest.ini or tox.ini
[pytest]
addopts = -ra -q

# content of setup.cfg
[tool:pytest]
addopts = -ra -q

Кроме того, можно установить переменную окружения PYTEST_ADDOPTS, чтобы добавить параметры командной строки для использования в этой среде:

export PYTEST_ADDOPTS="-v"

Вот как конструируется командная строка при наличии addopts или переменных окружения:

<pytest.ini:addopts> $PYTEST_ADDOPTS <extra command-line arguments>

Так что если пользователь напишет в командной строке:

pytest -m slow

фактически будет выполнена команда:

pytest -ra -q -v -m slow

Обратите внимание, что как и в других интерпретируемых приложениях, если параметры конфликтуют друг с другом - применяется последний. Поэтому в примере выше будет показан подробный вывод, поскольку опция -v перезапишет опцию -q.

Встроенные параметры конфигурационного файла

Полный лист возможных настроек конфигурационного файла см. reference documentation.