Любите Ли Вы Assert.это Так Же, Как Некоторые Другие, Или Оно Посвящено Выпуску Бета-Версии Nunit V3?

Недавно была выпущена первая бета-версия среды тестирования.

NUnit v3 .

Помимо прочего, в этой версии реализовано параллельное выполнение тестов (практически из коробки).

Я решил проверить, как это работает на одном реальном проекте и обнаружил, что новая версия nunit не поддерживаю некоторые использованные элементы из предыдущих версий.

В частности, вместо атрибута ExpectedException предлагается использовать Assert.Thorws или Assert.That. Независимо от выхода этой бета-версии, я начал использовать модель в одном из проектов.

Утверждать.

Это вместо всех других методов и атрибутов nunit. Ниже приведен небольшой опыт перевода атрибута ExpectedException в модель Assert.That. Как оказалось, тестовый проект, который я выбрал для перевода на nunit v3. содержит более 100 вариантов использования атрибута Ожидаемое исключение .

Естественно, мне хотелось как-то автоматизировать процесс перехода.

Интересно, что хотя раньше атрибут ExpectedException казался очень успешным, недавно он обнаружил несколько проблем: Например, в следующем тесте не очень понятно, в какой строке ожидается исключение.

Обычно в последнем случае, но если какой-то предыдущий метод выдаст то же исключение, тест не будет работать корректно.

В любом случае здесь есть некоторая неопределенность, «где ожидать исключительной ситуации».

  
  
  
  
  
  
  
  
  
   

[Test] [ExpectedException(typeof(ArgumentException))] public void TestExpectedException() { foo1(); foo4(); foo1(); }

Еще маленькая вещь, которая мешает, — это отчеты «покрытие кода», т. е.

вы запускаете dotCover , вы изучаете отчет и видите:

Любите ли вы Assert.Это так же, как некоторые другие, или оно посвящено выпуску бета-версии NUnit v3?

Но если вы замените его на Assert. Это совсем другое дело: вы получаете 100% покрытие.



Любите ли вы Assert.Это так же, как некоторые другие, или оно посвящено выпуску бета-версии NUnit v3?

После того, как я понял, что менять «вручную» — это слишком простой путь :), я решил написать плагин для решарпера, который помогает транслировать конструкции nunit в модель Assert.That. И начал я с тех, которые мне были нужны для перевода моего тестового проекта.

Сначала все было довольно просто:

[Test] [ExpectedException] public void TestShortExpectedException() { foo1(); foo2(); foo1(); }

перемещенный в

[Test] public void TestShortExpectedException() { foo1(); Assert.That(foo2, Throws.Exception); foo1(); }

Более сложный пример потребовал использования анонимного метода.



[Test] [ExpectedException] public void TestExpectedExceptionWithExpressions() { double i = 2 + getNumber(); }



[Test] public void TestExpectedExceptionWithExpressions() { Assert.That(() => { double i = 2 + getNumber(); }, Throws.Exception); }

Конкретный ожидаемый тип требует реализации Броски.

TypeOf

[Test] [ExpectedException(typeof(ArgumentException))] public void TestExpectedException() { foo1(); foo4(); foo1(); }



[Test] public void TestExpectedException() { foo1(); Assert.That(() => { foo4(); }, Throws.TypeOf<ArgumentException>()); foo1(); }

Ожидаемый текст сообщения об исключительной ситуации (или по-русски «сообщение эксепшина») требовал добавления .

И.

Сообщение

[Test] [ExpectedException(typeof(NotImplementedException), ExpectedMessage = "customer message")] public void TestExpectedExceptionWithCustomerMessage() { foo4("customer message"); }



[Test] public void TestExpectedExceptionWithCustomerMessage() { Assert.That(() => { foo4("customer message"); }, Throws.TypeOf<NotImplementedException>().

And.Message.EqualTo("customer message")); }

Пока поддерживаются не все дизайны: например, Математип не будет преобразовано правильно.



[Test] [ExpectedException(typeof(NotImplementedException), ExpectedMessage = "customer message", MatchType = MessageMatch.Contains)] public void TestExpectedExceptionWithCustomerMessage() { foo4("my customer message"); }

Преобразование конструкций Assert.IsNullOrEmpty и Assert.IsNotNullOrEmpty я реализовал без программирования, а только через Пользовательские шаблоны .

Пользовательские шаблоны — сильная функция, но, судя по всему, в случае сложных дизайнов она все равно не работает гладко.

Утверждаю — конструкция простая и проблем не возникло:

Любите ли вы Assert.Это так же, как некоторые другие, или оно посвящено выпуску бета-версии NUnit v3?



Любите ли вы Assert.Это так же, как некоторые другие, или оно посвящено выпуску бета-версии NUnit v3?

Плагин называется «NUnit.That.Resharper.Plugin», а его бета-версия доступна для загрузки через «Resharper — Управление расширениями».

Протестировано только на resharper версии 8.2. Прямо сейчас поддерживается небольшой набор дизайнов .

Визуально плагин работает так: выберите Заменить в нужной строке

Любите ли вы Assert.Это так же, как некоторые другие, или оно посвящено выпуску бета-версии NUnit v3?

и вы получите преобразованное выражение (атрибут ExpectedException удален)

Любите ли вы Assert.Это так же, как некоторые другие, или оно посвящено выпуску бета-версии NUnit v3?

выводы : - Утверждать.

Мне эта модель показалась довольно привлекательной; - NUnit v3. Это еще бета-версия (будьте осторожны с документацией!), но вы уже можете начать опробовать ее на тестовых проектах и подготовить реальные; - полный цикл( включая тестирование и распространение ) написание плагинов для решарпера не так сложно, как может показаться, и может использоваться для решения не только «общих», но и локальных задач.

Особую благодарность хотелось бы выразить команде решарпера (и лично мезастель ), который помог мне понять специфику разработки плагинов.

Resharper SDK позволяет создавать проекты Visual Studio на основе шаблонов, что значительно упрощает задачу.

Ссылки: — проект на GitHub https://github.com/constructor-igor/NUnit.That.Resharper.Plugin - плагин NUnit.That.Resharper.Plugin в галерее https://resharper-plugins.jetbrains.com/packages/NUnit.That.Resharper_v8.Plugin/ Ссылки на примеры и документацию — документация для разработчика resharper Руководство для разработчиков ReSharper ; - почта " Написать плагин для ReSharper не так уж и сложно.

" — Плагин «Агент Малдер» для ReSharper Теги: #resharper #plugin #nunit #Assert.That #ExpectedException #programming #.

NET #tdd #Visual Studio #C++

Вместе с данным постом часто просматривают: