Чи є спосіб вказати, які тести пістету потрібно запустити з файлу?


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?

Або

Чи є функція гака, яку можна використовувати для цієї мети?

Відповіді:


231

Ви можете використовувати -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, він також буде обраний.


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 працював найкраще для мене
StephenGodderidge

1
слід позначити це як прийняте ансер
Адам Хьюз

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 : Якщо ви хочете, щоб усі тести були запущені, або ніхто, тоді використовуйте І

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'

1

Відповідно до документа про виконання тестів за допомогою ідентифікаторів вузла

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

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

це те саме з командою нижче (із вмістом файлу у запитанні)

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

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

Наприклад, запустити всі функції, у яких ім'я _raises:

pytest -v -k _raises

0

Можливо, за допомогою pytest_collect_file()гака ви можете проаналізувати вміст .txto o, .yamlде тести вказані так, як вам потрібно, і повернути їх до ядра 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. Це дозволить уникнути необхідності коригування вашого імпорту, але це буде захаращувати речі, поки ви не усунете символьні посилання. Працював і для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.