Как вызвать pytest
Как правило, pytest вызывают командой pytest (другие способы вызова pytest описаны ниже). Она выполнит все тесты во всех файлах, имена которых соответствуют шаблону test_*.py или *_test.py, в текущем каталоге и его подкаталогах. В более общем случае pytest следует стандартным правилам обнаружения тестов.
Указание тестов для запуска
Pytest поддерживает несколько способов запуска и выбора тестов из командной строки или файла (см. ниже раздел о чтении аргументов из файла).
Запуск тестов в модуле
pytest test_mod.py
Запуск тестов в каталоге
pytest testing/
Запуск тестов по ключевым выражениям
pytest -k 'MyClass and not method'
Будут запущены тесты, имена которых соответствуют заданному строковому выражению (без учета регистра). В выражении можно использовать операторы Python, а в качестве переменных — имена файлов, классов и функций. Пример выше запустит TestMyClass.test_something, но не TestMyClass.test_method_simple. При запуске в Windows используйте в выражении "" вместо ''
Запуск тестов по аргументам коллекции
Передайте имя файла модуля относительно рабочего каталога, а затем спецификаторы, например имя класса и функции, разделенные символами ::, и параметры параметризации, заключенные в [].
Чтобы запустить определенный тест в модуле:
pytest tests/test_mod.py::test_func
Чтобы запустить все тесты в классе:
pytest tests/test_mod.py::TestClass
Указание конкретного метода тестирования:
pytest tests/test_mod.py::TestClass::test_method
Указание конкретного варианта параметризации теста:
pytest tests/test_mod.py::test_func[x1,y2]
Запуск тестов по выражениям маркеров
Чтобы запустить все тесты, помеченные декоратором @pytest.mark.slow:
pytest -m slow
Чтобы запустить все тесты, помеченные декоратором @pytest.mark.slow(phase=1) с аннотацией, в котором аргумент-ключевое слово phase имеет значение 1:
pytest -m "slow(phase=1)"
Дополнительные сведения см. в разделе маркеры.
Запуск тестов из пакетов
pytest --pyargs pkg.testing
Это импортирует pkg.testing и использует его расположение в файловой системе для поиска и запуска тестов.
Чтение аргументов из файла
Добавлено в версии 8.2.
Все перечисленные выше аргументы можно прочитать из файла, используя префикс @:
pytest @tests_to_run.txt
где tests_to_run.txt содержит по одной записи в строке, например:
tests/test_file.py tests/test_mod.py::test_func[x1,y2] tests/test_mod.py::TestClass -m slow
Этот файл также можно создать с помощью pytest --collect-only -q и при необходимости изменить.
Справка по версии, именам параметров и переменным окружения
pytest --version # shows where pytest was imported from pytest --fixtures # show available builtin function arguments pytest -h | --help # show help on command line and config file options
Профилирование длительности выполнения тестов
Изменено в версии 6.0.
Чтобы получить список из 10 самых медленных тестов длительностью более 1,0 с:
pytest --durations=10 --durations-min=1.0
По умолчанию pytest не отображает длительность слишком коротких тестов (<0.005s), если в командной строке не указан параметр -vv.
Управление загрузкой плагинов
Ранняя загрузка плагинов
Плагины (внутренние и внешние) можно явно загрузить заранее с помощью параметра -p в командной строке:
pytest -p mypluginmodule
Параметр принимает аргумент name, которым может быть:
- Полное имя модуля с точечной нотацией, например
myproject.plugins. Этот модуль должен быть доступен для импорта. -
Имя точки входа плагина. Это имя передается в
importlibпри регистрации плагина. Например, чтобы заранее загрузить плагин pytest-cov, можно использовать:pytest -p pytest_cov
Отключение плагинов
Чтобы отключить загрузку определенных плагинов при запуске, используйте параметр -p вместе с префиксом no:.
Пример: чтобы отключить загрузку плагина doctest, который отвечает за выполнение тестов doctest из текстовых файлов, вызовите pytest следующим образом:
pytest -p no:doctest
Другие способы вызова pytest
Вызов pytest через python -m pytest
Можно запустить тестирование через интерпретатор Python из командной строки:
python -m pytest [...]
Это почти эквивалентно прямому вызову скрипта командной строки pytest [...], за исключением того, что вызов через python также добавляет текущий каталог в sys.path.
Вызов pytest из кода Python
Можно вызвать pytest непосредственно из кода Python:
retcode = pytest.main()
это действует так же, как вызов «pytest» из командной строки. Исключение SystemExit не возникает; вместо этого возвращается код завершения. Если не передать аргументы, main прочитает аргументы командной строки процесса (sys.argv), что может быть нежелательно. Можно явно передать параметры и аргументы:
retcode = pytest.main(["-x", "mytestdir"])
Можно указать дополнительные плагины для pytest.main:
# content of myinvoke.py
import sys
import pytest
class MyPlugin:
def pytest_sessionfinish(self):
print("*** test run reporting finishing")
if __name__ == "__main__":
sys.exit(pytest.main(["-qq"], plugins=[MyPlugin()]))
При запуске будет показано, что плагин MyPlugin добавлен и его хук вызван:
$ python myinvoke.py *** test run reporting finishing
Примечание
Вызов pytest.main() приведет к импорту ваших тестов и всех модулей, которые они импортируют. Из-за механизма кэширования системы импорта Python последующие вызовы pytest.main() в том же процессе не будут учитывать изменения этих файлов между вызовами. Поэтому не рекомендуется вызывать pytest.main() несколько раз в одном процессе (например, чтобы повторно запустить тесты).
© 2015–2026 Holger Krekel and pytest-dev team
Licensed under the MIT License.
https://docs.pytest.org/en/stable/how-to/usage.html