Укажите, какие тесты pytest запускать из файла
Как выбрать, какие тесты pytest
запускать из файла?
У меня есть файл foo.txt
, содержащий список тестов, которые нужно выполнить:
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test
Также у меня есть несколько вопросов:
Есть ли способ выбрать несколько тестов, у которых нет общего паттерна в именах, из разных директорий с помощью
pytest
? Командаpytest -k <pattern>
позволяет использовать только один паттерн. Один из вариантов - использоватьpytest.mark
для каждого теста, но мне нужно запустить разные комбинации тестов из разных файлов.Можно ли указать несколько паттернов и имя файла теста для каждого паттерна?
Как можно указать точные пути к тестам в файле и передать этот файл в качестве входных данных для
pytest
?Существует ли функция-хук, которую можно использовать для этой цели?
5 ответ(ов)
Мой ответ предоставляет способы выполнения подмножества тестов в различных сценариях.
Запуск всех тестов в проекте
pytest
Запуск тестов в одной директории
Для запуска всех тестов из одной директории используйте имя директории в качестве параметра для pytest
:
pytest tests/my-directory
Запуск тестов в одном файле/модуле
Чтобы запустить все тесты из файла, укажите его с относительным путем в качестве параметра для pytest
:
pytest tests/my-directory/test_demo.py
Запуск одной функции теста
Чтобы запустить одну функцию теста, добавьте ::
и имя функции теста:
pytest -v tests/my-directory/test_demo.py::test_specific_function
Флаг -v
позволяет видеть, какая функция была выполнена.
Запуск одного класса теста
Чтобы запустить только класс тестов, поступите так же, как с функциями: добавьте ::
, затем имя класса к параметру файла:
pytest -v tests/my-directory/test_demo.py::TestClassName
Запуск одного метода теста из класса
Если вы не хотите запускать все тесты класса, а только один метод, просто добавьте еще один ::
и имя метода:
pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method
Запуск набора тестов на основе имени теста
Опция -k
позволяет вам передать выражение для запуска тестов, в именах которых содержится определенная подстрока, заданная выражением. Можно использовать логические операторы and, or и not для создания сложных выражений.
Например, чтобы запустить все функции, в названии которых есть _raises:
pytest -v -k _raises
Попробуйте выполнить следующую команду:
pytest path/file_test.py::test_name
Использование флага -k
, как предложили другие, будет соответствовать любому тесту, который содержит эту подстроку, а не только конкретному тесту.
Метод 1: Случайно выбранные тесты. Долгий и не очень удобный способ.
python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config
Метод 2: Использование выражений по ключевым словам.
Примечание: Я ищу по именам тестовых случаев. То же самое применимо к именам классов тестов.
Случай 1: Выполнятся любые найденные тесты, так как мы используем 'OR'.
python -m pytest -k 'test_password_valid or test_no_configuration'
Предположим, что оба теста корректны, будет выполнено 2 теста.
Случай 2: Теперь неправильное имя и еще одно корректное имя.
python -m pytest -k 'test_password_validzzzzzz or test_no_configuration'
Найден и выполнен только один тест.
Случай 3: Если вы хотите запустить все указанные тесты или ни один, используйте AND.
python -m pytest -k 'test_password_valid and test_no_configuration'
Оба теста будут выполнены, если имена корректные, или ни одного, если нет.
Случай 4: Запустить тест только в одной папке:
python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'
Случай 5: Запустить тест только из одного файла.
python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'
Случай 6: Запустить все тесты, кроме совпадающего.
python -m pytest test/integration/test_authentication.py -k 'not test_incorrect_password'
Случай 7: Запустить тестовый случай внутри тестового класса. Эта ситуация возникает, когда имя теста общее, и мы хотим запустить его только для конкретного тестового класса. Мы можем комбинировать имя класса теста и имя теста с помощью ключевых слов.
python -m pytest -k "TestClassSomeFeature and test_valid_events"
Если у вас есть методы с одинаковыми именами в двух разных классах и вам нужно запустить только один из них, вы можете сделать это следующим образом:
pytest tests.py -k "TestClassName and test_method_name"
Этот подход позволит вам выбрать конкретный тест, сочетая имя класса и имя метода. Убедитесь, что вы правильно указали имена, чтобы избежать путаницы.
Согласно документации о запуске тестов по идентификаторам узлов, если у вас есть все идентификаторы узлов в файле foo.txt
, просто выполните команду:
pytest $(tr '\n' ' ' <foo.txt)
Это аналогично следующей команде (с учетом содержимого файла, упомянутого в вопросе):
pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
Как правильно проверить, что исключение возникает в pytest?
Как вывести стандартный вывод print() в консоль во время выполнения pytest?
Сохранить график в файл изображения вместо его отображения
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как отменить последнюю миграцию?