Согласно документам: «RetryAttribute используется в тестовом методе, чтобы указать, что он должен быть перезапущен в случае сбоя до максимального числа раз».
То есть аргумент не количество повторных попыток, как вы думаете, а общее количество попыток запустить тест и [Retry(1)]
не имеет никакого эффекта, независимо от того, где вы его используете. Поскольку это может привести к путанице, я просто отредактировал эту страницу, чтобы выдать явное предупреждение.
Если бы вы попытались использовать RetryAttribute
в классе, вы бы получили предупреждение компилятора, потому что оно может только быть использованы на методы. Однако в NUnit метод может представлять либо один тест, либо группу параметризованных тестов. В случае параметризованного теста атрибут в настоящее время не действует.
Команда NUnit могла бы решить, что этот атрибут применим к каждому отдельному тестовому случаю, и соответствующим образом изменить nunit. TestCaseAttribute
также может принять необязательный параметр, указывающий количество повторов. Для долгосрочного решения вы можете попросить у них один или другой из этих вариантов.
В качестве более короткого термина, в качестве обходного пути, вы можете рассмотреть возможность получения своего собственного атрибута из TestCaseAttribute
. Вот некоторый (непроверенный) код для начала работы ...
using System;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal.Commands;
namespace NUnit.Framework
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public class RetryTestCaseAttribute : TestCaseAttribute, IRepeatTest
{
// You may not need all these constructors, but use at least the first two
public RetryTestCaseAttribute(params object[] arguments) : base(arguments) { }
public RetryTestCaseAttribute(object arg) : base(arg) { }
public RetryTestCaseAttribute(object arg1, object arg2) : base(arg1, arg2) { }
public RetryTestCaseAttribute(object arg1, object arg2, object arg3) : base(arg1, arg2, arg3) { }
public int MaxTries { get; set; }
// Should work, because NUnit only calls through the interface
// Otherwise, you would delegate to a `new` non-interface `Wrap` method.
TestCommand ICommandWrapper.Wrap(TestCommand command)
{
return new RetryAttribute.RetryCommand(command, MaxTries);
}
}
}
Вы могли бы использовать это следующим образом
[RetryTestCase("some parameter", MaxTries=3)]
public void SomeTestName(string browser)
{
// Your test code
}
Некоторые замечания по поводу вышеупомянутого:
Я скомпилировал этот код, но не проверял его. Пожалуйста, оставьте комментарий, если вы попробуете его, особенно если он нуждается в модификациях.
Код основан на некотором знании внутренних компонентов NUnit и может сломаться в будущем. Потребуется более всеобъемлющая реализация, чтобы сделать ее ориентированной на будущее. В частности, я использовал тот факт, что IRepeatTest
основан на ICommandWrapper
, но не добавляет методов. Я считаю, что каждый из двух интерфейсов нужен там, где я их размещаю, потому что NUnit проверяет их в разных точках своего кода.
Этот код примерно в три раза больше строк кода по сравнению с что нужно было бы добавить количество повторов к TestCaseAttribute
! Спросите NUnit Project, хотите ли вы эту функцию - или добавьте ее сами!