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