Есть ли способ указать, какие тесты pytest должны запускаться из файла?
Есть ли способ выбрать тесты pytest для запуска из файла? Например, файл foo.txt, содержащий список тестов, которые нужно выполнить:
tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test
Или есть способ выбрать несколько тестов, не имеющих общего шаблона в имени теста, из разных каталогов с pytest?
py.test -k <pattern>
допускает один шаблон.
Один из вариантов - иметь pytest.mark для каждого теста, но мое требование - запускать разные комбинации тестов из разных файлов.
Есть ли способ указать несколько шаблонов и имя тестового файла для каждого шаблона? Или есть способ указать точные тестовые пути в файле и передать этот файл в качестве входных данных для pytest? Или есть функция ловушки, которая может быть использована для этой цели?
Ответы
Ответ 1
Вы можете использовать -k
для запуска тестовых случаев с разными шаблонами:
py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'
Это будет запускать тестовые случаи с именем test_001 и test_some_other_test, отменяя выбор остальных тестовых случаев.
Примечание: это выберет любой тестовый случай, начинающийся с test_001 или test_some_other_test. Например, если у вас есть тестовый набор test_0012, он также будет выбран.
Ответ 2
Определение тестов/выбор тестов
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
все тесты, которые оформлены декоратором @pytest.mark.slow
.
Для получения дополнительной информации см. Марки.
Запускать тесты из пакетов
pytest --pyargs pkg.testing
Это импортирует pkg.testing
и использует его расположение в файловой системе для поиска и запуска тестов.
Источник: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests
Ответ 3
Возможно, используя pytest_collect_file()
hook, вы можете проанализировать содержимое файла .txt
o .yaml
, где тесты указаны так, как вы хотите, и вернуть их в ядро pytest.
Хороший пример показан в документации pytest. Я думаю, что вы ищете.
Ответ 4
Здесь возможен частичный ответ, поскольку он позволяет выбирать только тестовые сценарии, а не отдельные тесты в этих сценариях.
И это также ограничивалось тем, что я использовал устаревший режим совместимости против скриптов unittest
, поэтому не гарантировал, что он будет работать с собственным pytest.
Вот оно:
- создать новую диктовку, скажем
subset_tests_directory
. -
ln -s tests_directory/foo.py
-
ln -s tests_directory/bar.py
-
будьте осторожны с импортом, который подразумевает, что файлы находятся в test_directory
. Мне пришлось исправить некоторые из них, запустив python foo.py
изнутри subset_tests_directory
и исправив при необходимости.
-
После того, как тестовые сценарии выполнены правильно, просто cd subset_tests_directory
и pytest
там. Pytest будет подбирать только те скрипты, которые видит.
Другая возможность - символическая ссылка в вашем текущем тестовом каталоге, например, как ln -s foo.py subset_foo.py
затем pytest subset*.py
. Это позволит избежать необходимости корректировать импорт, но будет мешать, пока вы не удалите символические ссылки. У меня тоже сработало.
Ответ 5
Если у вас одинаковое имя метода в двух разных классах, и вы просто хотите запустить один из них, это работает:
pytest tests.py -k 'TestClassName and test_method_name'
Ответ 6
Выполните следующие простые шаги для запуска определенного теста в определенном тестовом классе или выполните только определенный тестовый класс, соответственно
$pytest -v tests_directory/foo.py TestClass.test_method_001
$pytest -v tests_directory/foo.py TestClass