Понимание ограничений модульного теста и синтаксических помощников NUnit
Я и коллега начинаем новый проект и пытаемся в полной мере использовать преимущества TDD. Мы все еще выясняем все концепции, касающиеся модульного тестирования, и пока основываем их прежде всего на других примерах.
Мой коллега недавно поставил под сомнение смысл помощников по синтаксису NUnit, и я изо всех сил пытаюсь объяснить их преимущества (поскольку я сам по-настоящему не понимаю этого, за исключением того, что моя интуиция говорит, что они хороши!). Вот пример утверждения:
Assert.That(product.IsValid(), Is.False);
Для меня это имеет смысл, мы говорим, что ожидаем product.IsValid()
быть false
, С другой стороны, мой коллега предпочел бы, чтобы мы просто написали:
Assert.That(!product.IsValid());
Он говорит ему, что это имеет больше смысла, и он может прочитать это легче.
Пока единственное, с чем мы можем согласиться, это то, что вы, вероятно, получите более полезный результат, если тест не пройден по первому, но я думаю, что должно быть лучшее объяснение. Я просмотрел некоторую информацию о помощниках по синтаксису ( http://nunit.com/blogs/?p=44), и они имеют смысл, но я не совсем понимаю концепцию ограничений, отличную от того, что они "чувствуют" правильным,
Интересно, кто-нибудь мог бы объяснить, почему мы используем концепцию ограничений и почему они улучшают приведенные выше примеры модульных тестов?
Благодарю.
4 ответа
Я думаю, что это в основном связано с чисто английским прочтением заявления.
Первый читает
Утверждать, что товар действителен, является ложным
Второе читает
Утверждают, что не товар действителен
Я лично считаю, что первый легче обрабатывать. Я думаю, что все зависит от предпочтений. Хотя некоторые из методов расширения интересны, они позволяют вам делать подобные утверждения:
product.IsValid().IsFalse();
Я вижу вашу версию лучше, чем ваши коллеги. Тем не менее, я все еще чувствую себя по крайней мере так же комфортно
Assert.IsFalse(product.IsValid());
Если вы можете убедить меня, что Assert.That
Синтаксис имеет объективную выгоду по сравнению с вышесказанным, я был бы очень заинтересован:) Возможно, это просто сила привычки, но я очень легко могу прочитать "Какого рода утверждение мы делаем? Теперь, о чем мы это утверждаем?" стиль.
Это все сахар. Внутренне они преобразуются в ограничения.
Из прагматического модульного тестирования, стр. 37:
"В NUnit 2.4 введен новый стиль утверждений, который является несколько менее процедурным и допускает более объектно-ориентированную базовую реализацию.... Например:
Assert.That(actual, Is.EqualTo(expected));
Преобразует в:
Assert.That(actual, new EqualConstraint(expected));"
Использование ограничений также позволяет вам наследовать от Constraint и создавать свои собственные пользовательские ограничения с сохранением согласованного синтаксиса.
Мне не нравится Assert.That, в частности тот факт, что его наиболее распространенный сценарий (сравнение равенства двух объектов) заметно хуже, чем "классический" синтаксис Assert.AreEqual().
С другой стороны, я очень люблю расширения MSpec NUnit. Я рекомендую вам проверить их (или посмотреть на расширения SpecUnit, или расширения NBehave, или расширения NBehave Spec * Unit, я думаю, что они все одинаковые).