7

Укажите, какие тесты pytest запускать из файла

1

Как выбрать, какие тесты 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 ответ(ов)

1

Мой ответ предоставляет способы выполнения подмножества тестов в различных сценариях.

Запуск всех тестов в проекте

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
0

Попробуйте выполнить следующую команду:

pytest path/file_test.py::test_name

Использование флага -k, как предложили другие, будет соответствовать любому тесту, который содержит эту подстроку, а не только конкретному тесту.

0

Метод 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"
0

Если у вас есть методы с одинаковыми именами в двух разных классах и вам нужно запустить только один из них, вы можете сделать это следующим образом:

pytest tests.py -k "TestClassName and test_method_name"

Этот подход позволит вам выбрать конкретный тест, сочетая имя класса и имя метода. Убедитесь, что вы правильно указали имена, чтобы избежать путаницы.

0

Согласно документации о запуске тестов по идентификаторам узлов, если у вас есть все идентификаторы узлов в файле foo.txt, просто выполните команду:

pytest $(tr '\n' ' ' <foo.txt)

Это аналогично следующей команде (с учетом содержимого файла, упомянутого в вопросе):

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь