Unity 6.3
0 онлайн 25 гостей 3 в системе
Вход

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;
}