2014-02-04 2 views
0

Я использую кодовые контракты в своем приложении C# вместе с модульными тестами. Когда я запрашиваю результаты тестирования кода в модульных тестах, строки, содержащие кодовые контракты, сообщаются как «не охваченные».Кодовые контракты и покрытие кода

Давайте, например, метод, который имеет 2 параметра:

void MyMethod(object param1, object param2) { 
    Contract.Requires<ArgumentNullException>(param1 != null); 
    Contract.Requires<ArgumentNullException>(param2 != null); 

    // Other stuff covered explicitly by unit tests 
} 

Поскольку контракты потерпеть неудачу, если условия не будут выполнены, не должны сообщать инструмент покрытие кода, что два параметра покрыты?

Для моего понимания код, охватываемый контрактами, не нуждается в повторном тестировании. Это верно?

+1

Посмотрите здесь http://stackoverflow.com/questions/1383535/net-4-0-code-contracts-how-will-they-affect-unit-testing?rq=1 – Alex

+0

Спасибо за ссылку! Я думаю, что это означает, что мне придется протестировать исключение с помощью модульных тестов, например, проверить, действительно ли 'MyMethod (null, null)' фактически генерирует «ArgumentNullException». Это было бы менее идеальным, поскольку, поскольку контракты гарантировали функциональность. Может ли кто-нибудь подтвердить это? – drl

ответ

0

Итак, вы технически верны, что в кодовых контрактах выдается ArgumentNullException, если любой из ваших аргументов null.

Однако, все же будет хорошей идеей, чтобы подразделение проверило ваши предварительные условия. Это не так много, чтобы гарантировать, что Code Contracts работает правильно — он делает! Но чтобы убедиться, что вы фактически указали справа договор!

Я говорю это из личного опыта. Я писал запись в блоге о кодовых контрактах и ​​модульном тестировании. И, написав код примера, я изложил предварительное условие для метода. Я выполнил модульные тесты, и несколько тестов не прошли. Я был немного озадачен. Что случилось? Ну, глупый я, я отменил логическое условие, которое я хотел обеспечить. К сожалению. Тем не менее, благодаря модульным испытаниям это было поймано и легко исправлено.

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

Хотя кодовые контракты могут значительно помочь вам написать код, который не подведет, это не серебряная пуля. Он не может поймать все логические ошибки (например, контракты с кодом не помогут вам избежать бесконечных циклов). Таким образом, модульные тесты по-прежнему очень важны для процесса разработки, даже при использовании Code Contracts.

Смежные вопросы