Как взаимодействуют атрибуты [Retry] и [Repeat] в NUnit

  • [Повторить] повторно запустит тест, если он не пройден, и сбой, только если ВСЕ запуски не пройдены.
  • [Повторить] повторно запустит тест, если он пройден, и пройдёт, только если ВСЕ прогоны пройдены.

Итак... каково ожидаемое поведение, если вы прикрепите оба атрибута?

Какой атрибут находится внутри, а какой снаружи?

Если [Retry] находится снаружи, то вы утверждаете:

  • «Это должно быть в целом очень стабильным, но иногда мерцание в порядке».
  • например [Repeat(50), Retry(3)] говорит: «Вы должны быть в состоянии справиться с 50 успехами подряд, но у вас есть 3 попытки сделать это».

Если [Repeat] находится снаружи, то вы утверждаете:

  • «Обычно это не дает сбоев ВСЕ время. Это будет стабильно работать, если вы попробуете несколько раз».
  • например [Repeat(50), Retry(4)] говорит: «ПРАКТИЧЕСКИ В КАЖДОМ сете из 4 хотя бы одно из исполнений будет успешным».

Насколько я могу судить, документы, которые я вижу, не дают никаких указаний. :(

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
912
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Более ранние выпуски не обрабатывали это, и результат был недетерминированным. PR в 2018 году представил код, из-за которого любой тест с несколькими повторяющимися атрибутами (такими как Repeat и Retry) всегда терпел неудачу.

На самом деле, в кодовой базе есть даже тест для проверки такого поведения:

К сожалению, ответ заключается в том, что вы не можете использовать оба атрибута в одном и том же тесте в текущих выпусках NUnit.

Обходной путь...

Используйте атрибут, который вы хотите сделать «снаружи», и реализуйте эквивалент другого атрибута в самом тестовом коде.

Если вы хотите протестировать «три шанса получить 50 правильных результатов подряд», используйте [Retry(3)] и добавьте код в свой тест, чтобы выполнить операцию 50 раз, терпя неудачу, как только она терпит неудачу.

for (int i = 0; i < 50; i++)
{
    // Try your operation
    Assert.That(.... // whatever you are asserting
}

Если вы хотите протестировать «выполнить 50 раз с 4 попытками каждый раз», используйте [Повторить (50)] и включить цикл, реализующий повторную попытку. Это сложнее, так как вы должны предотвратить преждевременное завершение теста любыми утверждениями. Ниже приведено хотя бы начало того, что вам может понадобиться сделать.

Exception ex = null;

for (int i = 0; i < 4; i++)
{
    ex = Assert.Catch(() => // try your operation );
    if (ex == null) Assert.Pass();
}

Assert.Fail(ex.Message);

Важно: не используйте c# try и catch вместо Assert.Catch. В последних версиях NUnit о сбое сообщается до того, как возникнет какое-либо исключение. Исключения NUnit не предназначены для просмотра тестовым кодом.

Другие вопросы по теме