Подтвердить что ты не робот

Как unit test с кодовыми контрактами

Какова рекомендация по лучшей практике для TDD с контрактами кода .NET 4.0?

Я полагаю, в частности, мой вопрос заключается в том, что, учитывая, что одна точка TDD должна позволять самообучаться в коде, а контракт теперь представляет собой часть документации, следует ли тестировать контракты с кодом так же, как и с другим кодом?

4b9b3361

Ответ 1

Это зависит от того, как вы используете контракты и какое приложение вы разрабатываете.

Прежде всего: вы, конечно, не хотите проверять утверждения и постусловия (Contract.Assert, Contract.Assume, Contract.Ensures и Contract.EnsuresOnThrow) отдельно. Я не вижу в этом никакой практической ценности - поскольку они уже проверены во время работы переписывающим устройством, вы найдете ошибки очень быстрыми даже без тестов.
Однако в хорошо протестированном приложении никакие постусловия или утверждения не должны терпеть неудачу - даже при недействительных вводах. Таким образом, если все ваши тесты (даже те, которые проверяют обработку недействительных данных!) Проходят без единого постусловия/утверждения, не могут быть выполнены, ваши постусловия и утверждения можно рассматривать как "проверенные". Для этого вам может потребоваться обработать событие ContractFailed, используя "Assert.Fail" в ваших тестах.

Теперь "интересная" часть - это предпосылки:
Вы разрабатываете библиотеку? Затем вы должны обязательно проверить их, если это позволяет ваше время/бюджет (это хуже, чем тестирование реальной логики).
Особенно, если вы используете "Contract.Requires <E> " перегрузка, которая будет бросать конкретное исключение при неудачах контракта, вы должны проверить их как регулярную проверку параметров с помощью "if-throw" -constructs.

Если вы не пишете библиотеку, я бы не сказал, что предварительные условия тестирования действительно необходимы - они не являются реальными бизнес-требованиями, а скорее помощниками для отладки.
И может получиться очень скучно писать unittest для каждого ArgumentNullException, который должен использовать метод, если параметр null.
Если вы забудете этот код проверки (что означает: Конкретный контракт. Требования) внутри вашего метода, вы, вероятно, тоже забудете блок-тест. Поэтому дополнительное значение, которое проверит параметр-валидация-тест на ваш (небиблиотечный) код, очень низкое для подключенного значения.

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

Ответ 2

Я собираюсь не согласиться с некоторыми другими людьми здесь. Контракты - это НЕ тесты, они являются утверждениями о требованиях API и promises. Они не волшебным образом доказывают правильность вашего кода, они просто предоставляют вам информацию во время выполнения, когда вы нарушаете контракт. Я не знаю о вас, но я бы не хотел отправлять код, который в каком-то угловом случае не соответствовал контрактам и разбился с утверждением о контракте! Как и любое другое поведение, контракты должны быть проверены на единицу. Если вы не выполняете контракты (и кодовые пути, которые косвенно осуществляют контракты), у вас нет доказательств действительности кода. Кодовые контракты и модульные тесты не являются взаимоисключающими концепциями.

Ответ 3

Отличный вопрос. Простой ответ - нет. кодовые контракты могут позаботиться о лишних тестах, которые не касаются поведения системы. Если вы действительно можете получить 100% -ный охват кода, вам нужно будет позаботиться о проверках isnull и т.д. Эти проверки не обязательно должны быть в вашем наборе тестов. добавленная выгода заключается в том, что они будут проверяться во время компиляции вместо ожидания выполнения тестов.

Надеюсь, что это поможет.

Ответ 4

Полезным инструментом для создания модульных тестов в сочетании с кодовыми контрактами является Pex. Он анализирует ваш код и генерирует для него базовые модульные тесты. Самое замечательное в том, что он распознает и понимает кодовые контракты и поэтому адаптирует код тестирования, который он генерирует.

Если у вас есть подписка на MSDN, вы можете загрузить Pex/Moles в качестве powertool, иначе вы можете скачать ее (не последнюю версию) на http://research.microsoft.com/en-us/projects/pex/downloads.aspx.

Ответ 5

Тесты для проверки кода ведут себя как ожидалось

Вы не должны явно писать тесты для выполнения утверждений контракта.

Однако в TDD или при изменении кода запуск модульного теста может выполнять код таким образом, чтобы сбой контракта был неудачным - когда это произойдет, тест должен потерпеть неудачу, и вы хотите, чтобы у него была возможность найти контракт, который не удалось быстро и легко, поэтому вы можете исправить код.

Итак, как-то вы хотите поймать контракт, если только затем сделать Asser.Fail( "Требование контракта не выполнено" )

Это может быть больше того, что вы после Как регистрировать ошибку при использовании кодовых контрактов