29 июля 2011 г.

Шпаргалка по NUnit: Constraint модель

Давайте поговорим об Constraint модели тестов NUnit. Отличительной особенностью этой модели есть один единственный метод который реализует проверку объекта по правилу описанному Constraint. Логика проверки вынесена во внешний класс. Все классы реализующие проверки наследованы от абстрактного класса Constraint. Что позволяет реализовывать свои проверки для тестов. Синтаксис для всех Constraint проверок всегда одинаков:
Assert.That(<Проверяемый объект>, <Способ проверки>)
Например:
Assert.That( myString, Is.EqualTo("Hello") );
или (одинаковые проверки)
Assert.That( myString, new EqualConstraint("Hello") );
Если класс тестирующий логику (помеченный атрибутом [TestFixture]) наследован от класса AssertionHelper то вместо конструкции Assert.That можно использовать метод Expect().
Ну а дальше больше Подмигивающая рожица

Теперь давайте разберем как вообще подставлять Constraint классы в поле <Способ проверки>. Как вы уже видели ранее можно напрямую создавать новые экземпляры класса с помощь new. Но это просто не удобочитаемо для человека. Поэтому разработчики NUnit создали класс Is, который выполняет создание нового экземпляра Constraint за нас, с помощью своих статических методов.
Is.EqualTo
реализован как

public static EqualConstraint EqualTo(object expected)
{
   return new EqualConstraint(expected);
}
По созданию Constraint проверок все.
Теперь маленький обзор документации NUnit.

Эквивалентность – Equal Constraint

Проверка на совпадение значений проверяемого объекта и значением Constraint. При проверке могут быть задействованы модификаторы точности сравнения.
Assert.That(2 + 2, Is.EqualTo(4)); // равно
//или
Assert.That(2 + 2, Is.Not.EqualTo(5)); // не равно
Модификаторы:
  • IgnoreCase – игнорировать регистр символов (для строк)
  • AsCollection – сравнение массивов различных размерностей поэлементно. Модификатор не работает для зубчатых массивов (массив массивов), потому что они не имеют общей коллекции.
  • NoClip – модификатор отображения сообщений о сравнении строк.
  • Within – специальный модификатор с дополнительными модификаторами для определения точности сравнения чисел и времени. Точность чисел может быть задана допуском отклонения значения, отклонения в процентах и для чисел с плавающей точкой в единицах последней значащей цифры (Ulps). Точность времени (DateTimes) или промежутка времени (TimeSpans) может изменяться от дней до тиков.
  • Using – использование определенных пользователем классов сравнения.
Особенность сравнения Dictionaries и классов реализующих IDictionary начиная с версии 2.5.6 словари являются эквивалентными если список ключей совпадает и значения каждого из ключей тоже равны.

Идентичность – Same As Constraint

Идентичны ли объект Constraint и проверяемый объект.
Exception ex1 = new Exception();
Exception ex2 = ex1;
Assert.That(ex2, Is.SameAs(ex1));

Предопределенные значения – Condition Constraints

Сравнение с часто используемыми значениями. Такими как Null или True/False.
  • Is.Null – проверка на Null
  • Is.True – проверка на True
  • Is.False – проверка на False
  • Is.NaN – проверка является ли число с плавающей точкой числом.
  • Is.Empty – проверка на пустую строку, папку или коллекцию.
  • Is.Unique – уникальность элементов массива, коллекции или любого IEnumerable объекта.

Проверки больше - меньше – Comparison Constraints

  • Is.GreaterThan – сравнение на больше (Проверяемый объект > Значение проверки)
  • Is.GreaterThanOrEqualTo или Is.AtLeast – сравнение на больше или равно (Проверяемый объект >= Значение проверки)
  • Is.LessThan – сравнение на меньше (Проверяемый объект < Значение проверки)
  • Is.LessThanOrEqualTo или Is.AtMost – сравнение на меньше или равно (Проверяемый объект <= Значение проверки)
  • Is.InRange – сравнение на попадание в диапазон значений, для массивов или коллекций нужно использовать модификаттор All (проверка каждого значения)
Сравнение производиться с помощью System.Collections.IComparer. Все перечисленные методы позволяют использовать пользовательский компаратор с модификатором Using.

Проверки пути файлов и каталогов – Path Constraints

Данный вид Constraints предназначен для проверок формируемых путей приложения без манипуляций с файловой системой. Перед сравнением формат путей приводиться к общему (каноническому) виду. Что позволяет делать сравнение для различных файловых систем.
  • Is.SamePath – равнозначность путей
  • Is.SubPath – вхождение одного пути в другой
  • Is.SamePathOrUnder – равен или содержит

Проверки типов – Type Constraints

Проверка соответствия типов. Можно определять является ли объект определенного типа, является наследником типа или возможно ли присвоение типов.
  • Is.TypeOf(Type) – точное соответствие типов
  • Is.InstanceOfType(Type) – проверка принадлежности к определенному типу в цепочке наследования
  • Is.AssignableFrom(Type) – проверка возможности присвоения ссылки Type к проверяемому типу

Проверки строк – String Constraints

Проверки строк выполняют тестирование текстовых данных. Попытка проверить не текстовых данных приводит к ошибке и исключению. Существует версия проверки с префиксом Text. Но на данный момент это уже устаревшее решение и в будущем будет удалено из NUnit. Для всех проверок применим модификатор IgnoreCase (игнорировать регистр).
  • Is.StringContaining – проверка наличия подстроки в проверяемой строке
  • Is.StringStarting – проверка наличия подстроки в начале проверяемой строки
  • Is.StringEnding – проверка наличия подстроки в конце проверяемой строки
  • Is.StringMatching – проверка строки на удовлетворение шаблону



P.S. Пока все. Скоро дополню пост. В коментариях жду пожеланий и критики.

Полезные ссылки по NUnit (приложение):

NUnit 2.5: что нового? - замечательный доклад Сергея Попова