Есть ли способ указать, какие тесты pytest запускать из файла?

190

Есть ли способ выбрать pytestтесты для запуска из файла? Например, файл, foo.txtсодержащий список тестов, которые нужно выполнить:

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

Или есть ли способ выбрать несколько тестов, не имеющих общего шаблона в имени теста, из разных каталогов с pytest?

pytest -k <pattern> позволяет один шаблон.

Один из вариантов - иметь pytest.markпротив каждого теста, но мое требование - запускать разные комбинации тестов из разных файлов.

Есть ли способ указать несколько шаблонов и имя тестового файла для каждого шаблона?

Или

Есть ли способ указать точные тестовые пути в файле и передать этот файл в качестве входных данных pytest?

Или

Есть ли функция ловушки, которая может быть использована для этой цели?

Шарада
источник

Ответы:

232

Вы можете использовать -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, он также будет выбран.

supamaze
источник
1
Спасибо. Но если в foo.py и bar.py есть тест с одним и тем же именем (скажем, test_001), он в конечном итоге будет выполнен из обоих.
Шарад
2
да, все, что соответствует шаблону, будет выполнено, как я уже упоминал в примечании
supamaze
Но это проблема для меня. Я хотел бы выбрать, какие тесты выполнять из какого файла.
Шарад
@NamGVU `-k <имя метода тестирования>`
supamaze
4
Это должно бытьpy.test path/to/test/file.py -k function_name_test
LittleZero
91

Определение тестов / выбор тестов

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 --pyargs pkg.testing

Это будет импортировать pkg.testing и использовать ее расположение в файловой системе для поиска и запуска тестов.

Источник: https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests

Амритпал Сингх
источник
test_mod.py::TestClass::test_method работал лучше всего для меня
Стивен Годдридж
1
следует отметить это как принятое anser
Адам Хьюз
13

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

pytest tests.py -k 'TestClassName and test_method_name'
Питер
источник
6

Метод 1 : случайно выбранные тесты. Долго и некрасиво.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

Способ 2: Используйте выражения ключевых слов.

Примечание: я ищу по именам тестов. То же самое применимо к именам TestClass.

Случай 1: ниже будет работать в зависимости от того, что найдено. Так как мы использовали «ИЛИ».

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'
Ариндам Ройховдхери
источник
3

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

Запустите все тесты в проекте

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параметр позволяет передать выражение для запуска тестов с определенными именами, указанными в выражении в качестве подстроки имени теста. Можно использовать и , или , и не создавать сложные выражения.

Например, чтобы запустить все функции, в имени которых есть _raises:

pytest -v -k _raises
lmiguelvargasf
источник
1

Согласно документу о выполнении тестов по идентификаторам узлов

так как у вас есть все идентификаторы узлов в foo.txt, просто запустите

pytest `cat foo.txt | tr '\n' ' '`

это то же самое с командой ниже (с содержанием файла в вопросе)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test
接口 夏季
источник
0

Возможно, используя pytest_collect_file()hook, вы можете проанализировать содержимое файла .txto, в .yamlкотором тесты указаны как вам нужно, и вернуть их ядру pytest.

Хороший пример показан в документации по Pytest . Я думаю, что вы ищете.

Астерио Гонсалес
источник
0

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

И это также ограничено тем, что я использую устаревший режим совместимости со 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. Это позволит избежать необходимости корректировать импорт, но будет мешать, пока вы не удалите символические ссылки. У меня тоже сработало.

JL Peyret
источник