Как вызвать pytest

Обычно pytest вызывается командой pytest (см. ниже для other ways to invoke pytest). Это приведет к выполнению всех тестов во всех файлах, имена которых имеют вид test_*.py или \*_test.py в текущем каталоге и его подкаталогах. В более общем случае pytest следует за standard test discovery rules.

Указание того, какие тесты следует выполнять

Pytest поддерживает несколько способов запуска и выбора тестов из командной строки.

Запуск тестов в модуле

pytest test_mod.py

Запуск тестов в каталоге

pytest testing/

Запуск тестов по ключевым выражениям.

pytest -k "MyClass and not method"

Это запустит тесты, содержащие имена, соответствующие заданному строковому выражению (без учета регистра), которое может включать операторы Python, использующие имена файлов, имена классов и имена функций в качестве переменных. В приведенном выше примере будет выполняться TestMyClass.test_something, но не TestMyClass.test_method_simple.

Запуск тестов по идентификаторам узлов.

Каждому собранному тесту присваивается уникальный nodeid, который состоит из имени файла модуля, за которым следуют спецификаторы, такие как имена классов, имена функций и параметры из параметризации, разделенные символами ::.

Чтобы запустить определенный тест в модуле:

pytest test_mod.py::test_func

Еще один пример указания метода тестирования в командной строке:

pytest test_mod.py::TestClass::test_method

Запуск тестов по маркерным выражениям.

pytest -m slow

Запустит все тесты, которые украшены декоратором @pytest.mark.slow.

Для получения дополнительной информации смотрите marks.

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

pytest --pyargs pkg.testing

Это позволит импортировать pkg.testing и использовать его расположение в файловой системе для поиска и запуска тестов.

Получение справки по версии, именам опций, переменным окружения

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. Это точечное имя должно быть импортируемым.

  • Имя точки входа подключаемого модуля. Это имя передается в setuptools при регистрации плагина. Например, для ранней загрузки плагина 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, а вернет exit code. Вы можете передавать опции и аргументы:

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() из одного и того же процесса (например, для повторного запуска тестов).

Вернуться на верх