Мне известны декораторы pytest, которые помечают тесты как пропущенные (условно). Однако все они оцениваются до начала теста. У меня есть пара тестов, которые требуют взаимодействия с пользователем (очевидно, они не запускаются в CI), и если такое взаимодействие не предусмотрено, я бы хотел пометить эти тесты как что угодно, кроме «пройдено» или «не пройдено». «Пропущено» было бы хорошо, равно как и «неубедительно», или «отменено», или что-то еще.

Это возможно?

0
bers 30 Окт 2023 в 09:19
Очевидно, информации недостаточно, но похоже, что это плохо спроектированные тесты, если требуется взаимодействие с пользователем, и лучше их реорганизовать. Кроме того, я бы сказал, что вам следует просто пометить их, пропустить их и запустить вручную/отдельно.
 – 
buran
30 Окт 2023 в 09:22
Что плохого в преобразовании ручных тестов в полуавтоматические, если полностью автоматизированное невозможно (например, потому что для генерации данных нужно нажать кнопку на внешнем устройстве)? Вы бы по-прежнему сказали: «Это плохо разработанные тесты»?
 – 
bers
30 Окт 2023 в 09:41
Вы можете имитировать внешнее оборудование, предоставлять надежные/предсказуемые входные данные и соответствующим образом тестировать
 – 
buran
30 Окт 2023 в 11:16
Конечно, заплатите мне за это :)
 – 
bers
30 Окт 2023 в 13:50
Насколько я понимаю, исходя из вашего вопроса, вы разрабатываете эти тесты, поэтому я предполагаю, что вам уже выплачивают вознаграждение. Вам решать, как вы хотите делать то, за что вам платят.
 – 
buran
30 Окт 2023 в 14:46

2 ответа

Лучший ответ

В pytest можно динамически пропускать тест во время его выполнения, используя декоратор pytest.mark.skip внутри самого теста, когда определенные условия не выполняются. Если у вас есть тесты, требующие взаимодействия с пользователем, и вы хотите пометить их как нечто иное, чем просто «пройден» или «не пройден», когда такое взаимодействие отсутствует, вы можете реализовать условную оценку в тесте.

В случаях, когда необходимое взаимодействие недоступно, вы можете вызвать pytest.skip("Укажите причину пропуска") внутри тестовой функции. Этот подход позволяет вам указать, что тест был пропущен из-за отсутствия предварительных условий для определенного результата «пройден» или «не пройден», и результат будет записан как «пропущенный» в сводке теста.

1
BamGbam 30 Окт 2023 в 09:26

Оказывается, вы также можете вызвать pytest.skip() изнутри теста.

try:
    ...
except some.TimeoutException:
    pytest.skip("Timeout waiting for user interaction")

Работает отлично.

0
bers 30 Окт 2023 в 09:27