Подтвердить что ты не робот

Есть ли способ указать, какие тесты 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? Или есть функция ловушки, которая может быть использована для этой цели?

4b9b3361

Ответ 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