Действительно ли кодовые контракты помогают модульному тестированию?

У меня достаточно знаний о модульном тестировании. Я пытался читать о кодовых контрактах. Действительно ли это помогает модульному тестированию? Это переоценено, особенно когда мы говорим о кодовом контракте, помогающем выполнять модульное тестирование. Я конкретно имею в виду контракты в .net 4.0. Я использую nunit для модульного тестирования.


person Sandbox    schedule 27.07.2010    source источник


Ответы (3)


Да и Нет. Модульные тесты — это, по сути, контракт, в котором говорится, что MyMethod() принимает X и ожидает, что Y будет результатом, а когда этого не происходит, модульные тесты терпят неудачу, и вы как разработчик MyMethod() получаете предупреждение о том, что вы нарушили что-то внутри него. Контракты кода помогают вам писать модульные тесты, потому что требования в контрактах облегчают вам понимание требований модульных тестов при их написании. Однако истинная причина кодовых контрактов не для вас, а для других разработчиков, использующих API, который вы создаете. Модульные тесты позволяют узнать правильные входные и выходные данные, но когда вы выпускаете код в открытый доступ, модульные тесты не выпускаются вместе с .dll. Контракты кода позволяют другим разработчикам знать те же самые требования посредством контрактов времени компиляции и проверки. Контракты защищают от тех разработчиков (меня), которые имеют ужасную тенденцию не читать документацию по методу и просто начинают передавать вещи, поэтому теперь они будут активно предупреждаться через контракты.

person Ryan Hayes    schedule 27.07.2010
comment
Но не дублирует ли это мою логику? Я имею в виду, что у нас будет одинаковая логика (до и после условий) для контрактов и модульного тестирования. - person P.K; 27.07.2010
comment
Так и будет, и с пуристической точки зрения, так и должно быть, поскольку, если кто-то случайно удалит контракт, модульные тесты все равно будут проверять логику, согласно которой вы не хотите, чтобы он делал что-то, что он сейчас может делать, или наоборот. Контракты могут быть руководством по написанию модульных тестов, но не заменой их. - person Ryan Hayes; 27.07.2010
comment
Мне трудно согласиться с тем, что контракты дублируют модульные тесты. Контракты кода устанавливают требования, модульные тесты проверяют, что они выполняются. В некотором смысле, тесты проверяют правильность ваших контактов — контракты представляют собой доставляемый код, поэтому их следует тестировать. - person Tim Long; 06.10.2012

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

С другой стороны, контракты терпят неудачу только тогда, когда они выполняются, и поэтому без модульных тестов у вас нет гарантий качества кода (то есть, что весь ваш код выполняет различные контракты). Эти две концепции дополняют друг друга.

person wekempf    schedule 13.12.2011

Нет, я не думаю, что контракты кода помогают вам писать модульные тесты. Модульные тесты определяют поведение и ограничения данного действия. Одна из тех спецификаций, написанных в модульных тестах, может заключаться в том, что аргументы метода не могут быть нулевыми.

В этом случае вам все равно нужно написать модульный тест. Контракт кода — это способ реализации вашей спецификации, но не единственный.

Другими словами, не думайте, что использование контракта кода означает, что вам не нужно писать модульный тест! Если кто-то изменит контракт кода или удалит его, у вас не будет теста, сообщающего вам, что эта предполагаемая спецификация не удалась.

person Brian Genisio    schedule 27.07.2010
comment
Я не думаю, что кто-то говорил, что контракты кода должны заменить модульные тесты. - person David Neale; 27.07.2010
comment
Я согласен с тем, что контракты не помогают писать модульные тесты. В идеале тесты должны быть первыми, поэтому никаких контрактов не должно существовать до тех пор, пока тест не будет пройден. Затем контракты могут быть написаны для принудительного выполнения любых отрицательных (должны вызывать) тестов. - person Tim Long; 06.10.2012