Есть ли способ указать, какие тесты 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.

Вот оно:

  1. создать новую диктовку, скажем subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. будьте осторожны с импортом, который подразумевает, что файлы находятся в test_directory. Мне пришлось исправить некоторые из них, запустив python foo.py изнутри subset_tests_directory и исправив при необходимости.

  5. После того, как тестовые сценарии выполнены правильно, просто 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