Перейти к содержанию

Как запускать pytest

См. также

Полный справочник флагов командной строки 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]

Запуск тестов по выражению маркеров (marker expressions)

Чтобы запустить все тесты, декорированные @pytest.mark.slow:

pytest -m slow

Чтобы запустить все тесты, декорированные аннотированным @pytest.mark.slow(phase=1), где keyword-аргумент phase равен 1:

pytest -m "slow(phase=1)"

Подробнее см. marks.

Запуск тестов из пакетов

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.0s:

pytest --durations=10 --durations-min=1.0

По умолчанию pytest не показывает длительности тестов, которые слишком малы (<0.005s), если не передать -vv в командной строке.

Управление загрузкой плагинов

Ранняя загрузка плагинов

Можно явно «раньше времени» загрузить плагины (встроенные и внешние) в командной строке опцией -p:

pytest -p mypluginmodule

Опция принимает параметр name, который может быть:

Полное точечное имя модуля, например myproject.plugins. Это имя должно быть импортируемым.

Имя entry-point плагина. Это имя, которое передаётся в 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

Note

Вызов pytest.main() приведёт к импорту ваших тестов и любых модулей, которые они импортируют. Из‑за механизма кэширования системы импорта Python повторные вызовы pytest.main() в рамках одного процесса не отразят изменения в этих файлах между вызовами. Поэтому делать несколько вызовов pytest.main() из одного процесса (например, чтобы перезапускать тесты) не рекомендуется.