Cucumber.js: вторая попытка сценариев

Хотя я знаю, что тесты должны работать надежно, мой опыт говорит мне: это не всегда может быть выполнено с разумными усилиями (и не обязательно; см. мой расчет ниже).

В частности, если тесты вводятся для уже существующего веб-приложения, которое необходимо постоянно улучшать, может быть сложно создать надежные E2E-тесты. Но, напротив, это довольно просто и, кроме того, достаточно для создания тестов, которые время от времени падают (при условии, что они надежно терпят неудачу, когда дело доходит до ожиданий/утверждений).

Если вы используете Protractor для тестирования E2E, возможно, вы тоже сталкивались с этим.

Статистика говорит мне, что тест, который, как известно, имеет 25-процентный шанс сбоя, будет иметь 6,25-процентный шанс сбоя дважды при повторном запуске, 1,56-процентный шанс сбоя три раза при трехкратном запуске и 0,39-процентный шанс сбоя. четыре раза при четырехкратном запуске и 0,10% шанс вылететь пять раз при пятикратном запуске (и так далее).

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

Мое требование состоит в том, чтобы запускать сценарий Cucumber.js снова и снова до тех пор, пока он не будет успешным в первый раз во время одного запуска функции, а затем принять результат теста "пройдено/не пройдено" при успешном запуске.

Я попытался создать хук After, который повторно запускает сценарий, но не нашел способа вызвать сценарий из хука. Кроме того, я не нашел способа отказаться от запуска сценария сбоя.

Подскажите, пожалуйста, какие у меня есть варианты. Я использую Grunt, Protractor и Cucumber.

Поскольку наш тестовый набор огромен, все еще быстро растет и выполняется с помощью автоматизированного процесса сборки, мне нужен способ запускать ненадежные тесты настолько надежно, насколько это возможно.


person ideaboxer    schedule 27.04.2016    source источник
comment
Я думаю, что это приведет к неуправляемому набору тестов. Как вы будете отличать настоящие неудачи от неудач из-за ненадежности? Вы сможете запустить каждый тест только фиксированное количество раз, а затем сдаться, иначе ваш пакет будет работать вечно. Мой опыт показывает, что вы должны как можно реже повторять тесты, потому что это облегчает разработчикам написание ненадежных тестов.   -  person Dave Schweisguth    schedule 29.04.2016
comment
Как вы будете отличать настоящие неудачи от неудач из-за ненадежности? Если я позабочусь о том, чтобы тест никогда не был пройден, если тестируемые условия не соответствуют действительности (заботясь о шаге «Тогда» сценария и делая шаг «Тогда» надежно не пройденным, если приложение делает что-то протестированное неправильно), легко различить: как только тест никогда не удается пройти, мне нужно проверить тестируемый сценарий вручную. Если, с другой стороны, это не так, я могу быть (насколько) уверен (как если бы я провел безотказный тест), что со сценарием все в порядке.   -  person ideaboxer    schedule 03.05.2016
comment
Вы сможете запустить каждый тест только фиксированное количество раз, а затем сдаться, иначе ваш пакет будет работать вечно. Отказ от автоматической попытки 10 раз (максимум) не имеет большого значения: вы всегда можете запустить сценарий вручную и посмотреть, сможете ли вы воспроизвести неожиданное поведение. Поскольку я знаю, что обычно каждый тест не дает сбой в каждом запуске, если его запускать два или три раза, это будет абсолютно нормально для меня. Периодически падающий, но все еще надежно не проходящий тест на неправильное поведение приложения всегда лучше, чем отсутствие теста вообще.   -  person ideaboxer    schedule 03.05.2016
comment
Мой опыт показывает, что вы должны как можно реже повторять тесты, потому что это облегчает разработчикам написание ненадежных тестов. Я согласен с вами на 100%. Но все же: иметь один или несколько несколько ненадежных тестов намного лучше, чем вообще не иметь тестов.   -  person ideaboxer    schedule 04.05.2016


Ответы (1)


Распространенной причиной сбоев angular является не ожидание завершения всех ожидающих запросов. В моих конструкторах страниц я вставляю ожидание, пока этот Javascript вернет true:

"return angular.element(document.body).injector().get(\'$http\').pendingRequests.length == 0;"

прежде чем продолжить. Благодаря осторожному ожиданию завершения JavaScript, прежде чем продолжить мои тесты, их надежность довольно высока.

При этом существуют перезапускаемые фреймворки. Вот один из них, автор Николай Колесник.

person MikeJRamsey56    schedule 29.04.2016
comment
К сожалению, для Cucumber+Protractor (основанного на JavaScript) нет фреймворков повторного запуска. - person ideaboxer; 03.05.2016