Spec-Zone.ru › pytest

Как вызвать 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]

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

Чтобы запустить все тесты, помеченные декоратором @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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API