Итак... каково ожидаемое поведение, если вы прикрепите оба атрибута?
Какой атрибут находится внутри, а какой снаружи?
Если [Retry]
находится снаружи, то вы утверждаете:
[Repeat(50), Retry(3)]
говорит: «Вы должны быть в состоянии справиться с 50 успехами подряд, но у вас есть 3 попытки сделать это».Если [Repeat]
находится снаружи, то вы утверждаете:
[Repeat(50), Retry(4)]
говорит: «ПРАКТИЧЕСКИ В КАЖДОМ сете из 4 хотя бы одно из исполнений будет успешным».Насколько я могу судить, документы, которые я вижу, не дают никаких указаний. :(
Более ранние выпуски не обрабатывали это, и результат был недетерминированным. 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 не предназначены для просмотра тестовым кодом.