Thursday, October 30, 2008

Unit testing #2. NUnit constraint-based Asserts

Починаючи з версії 2.4 в NUnit реалізовано новий стиль assert'ів. Ця модель використовує один метод Assert.That(args) для всіх тверджень. Логіка виконання кожного твердження перенесена в другий параметр. Ось декілька прикладів:
Assert.That(10.0/3.0, Is.EqualTo(3.33).Within(0.01f));
Assert.That(2*2, Is.Not.EqualTo(5));
Assert.That(new object(), Is.Not.Null);
Assert.That(string.Empty, Is.Empty);
Assert.That("abc", Has.Length(3));
Assert.That(new string[] {"a", "b", "c"}, Is.All.Not.Null);
Також можна комбінувати constraints.
Assert.That(3, Is.LessThan( 5 ) | Is.GreaterThan( 10 ));
Assert.That("s", !Is.Null));
Для того щоб працювати з новим стилем потрібно використати:
using NUnit.Framework.SyntaxHelpers;
Цей стиль мені подобається більше ніж класичний.

Детальніше - на сторінці Constraint-Based Assert Model документації NUnit .

Wednesday, October 29, 2008

Unit testing #1


Я знову вирішив щось написати. Справа в тому, що я почав читати книгу "Pragmatic Unit Testing in C# with NUnit" by Andy Hunt and Dave Thomas with Matt Hargett. І ось, вночі, коли я прочитав перші сторінки, я подумав - "Круто, прочитав лише кілька сторінок, а вже виніс для себе чотири нових речі про які не знав раніше. А наступного дня, коли на роботі розказував, що книжка цікава, що я дізнався чотири нових штучки, ніяк не міг згадати, а про яку ж все-таки четверту річ я дізнався. От три пам'ятаю а четверту ні. Отже треба ці знання записувати. Тут їм і буде місце.



Тіп #1. "Ommit the
message string for reporting unless you really need to".

Ось класичний синтаксис Assert в NUnit:
Assert.AreEqual(expected, actual [, string message])
Автори рекомендують не включати текстовий рядок для пояснення тесту, крім випадків коли це дійсно необхідно. Краще коли ім'я тесту самостійно пояснює призначення самого тесту, коли використовуються доречні методи Assert'а, або тест розбивається на декілька методів, щоб залишатися сконцентрованими на конкретних тестових випадках.

Що ж в цій практиці революційного і чому вона нова для мене? Не знаю. Просто я чомусь часто писав ці текстові пояснення в NUnit Assert'ах. Мабуть це був вплив StyleCop, який змушує завжди писати пояснення для методу System.Diagnostics.Deиug.Assert. А тепер не буду, звісно крім випадків, коли це дійсно необхідно :).