16. Пользовательские атрибуты
Цели обучения
В этом разделе мы рассмотрим некоторые способы реализации пользовательских атрибутов NUnit, которые могут быть использованы для изменения выполнения теста.
Введение и мотивация
Мощная часть NUnit заключается в том, что она очень расширима. Одним из способов расширения является использование пользовательских атрибутов. Примером являются атрибуты, которые реализуют IWrapTestMethod интерфейс. В этом интерфейсе есть метод, оборачивающий TestCommandОбычно эти тестовые команды что-то делают, вызывают execute на их внутреннюю команду и затем, возможно, делают что-то снова после завершения внутренней команды.
В следующих трех классах IWrapTestMethod интерфейс реализуется и используется в тесте:
public class MyAttribute : NUnitAttribute, IWrapTestMethod
{
public TestCommand Wrap(TestCommand command)
{
return new MyCommand(command);
}
}
public class MyCommand : TestCommand
{
private TestCommand innerCommand;
public MyCommand(TestCommand command) : base(command.Test)
{
innerCommand = command;
}
public override TestResult Execute(ITestExecutionContext context)
{
Debug.Log("Before");
var result = innerCommand.Execute(context);
Debug.Log("After");
return result;
}
}
public class MyTests
{
[Test]
[MyAttribute]
public void Test1()
{
Debug.Log("The test");
}
}
При запуске MyTests.Test1 отображается следующий вывод:
Test1 (0,017s)
-–
До
Испытания
После
Другими интерфейсами, которые могут быть реализованы пользовательскими атрибутами, являются IWrapSetUpTearDown, IApplyToContextи IApplyToTest.
2010 год
В Unity у нас есть цель, что действие никогда не должно занимать больше 500 мс. образец 16_CustomAttributes существует класс с именем MyClass, который имеет два метода. Оба метода должны возвращать true. Однако кто-то сделал регрессию, так что один из двух методов занимает много времени для запуска.
Задача состоит в создании нового пользовательского атрибута, который обнаруживает, если тест занимает больше 500 мс для запуска. Если это происходит, он должен провалить тест с описательным сообщением. Примените это к двум существующим тестам.
Подсказки
- Можно использовать класс
System.Diagnostics.Stopwatchк времени, сколько миллисекунд прошло.
Решение
Полное решение для упражнения доступно на 16_CustomAttributes_Solution.
Ядром решения является метод execute в реализации команды test:
public override TestResult Execute(ITestExecutionContext context)
{
var stopWatch = new Stopwatch();
stopWatch.Start();
var result = innerCommand.Execute(context);
stopWatch.Stop();
if (stopWatch.ElapsedMilliseconds > 500)
{
result.SetResult(ResultState.Failure, $"Test took {stopWatch.ElapsedMilliseconds} ms. That is longer than 500ms!");
}
return result;
}