Являются ли утверждения избыточными, когда у вас есть модульные тесты? - PullRequest
4 голосов
/ 23 декабря 2010

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

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

Теперь я спрашиваю: избыточны ли утверждения, когда у вас есть модульные тесты? Потому что это выглядит излишним, когда вы тестируете поведение кода; но в то же время это не тот же контекст выполнения.

Должен ли я сделать оба?

Ответы [ 4 ]

6 голосов
/ 23 декабря 2010

Утверждения, которые проверяют предварительные условия, могут помочь обнаружить и обнаружить ошибки интеграции.То есть, в то время как модульные тесты демонстрируют, что метод работает правильно, когда он используется (вызывается) правильно, утверждения, которые проверяют предварительные условия, могут обнаружить неправильное использование (вызовы) метода.Использование утверждений приводит к быстрому сбою неисправного кода, что способствует отладке.

0 голосов
/ 23 декабря 2010

Модульное тестирование и утверждения - это совершенно разные вещи, но они дополняют друг друга.

Утверждения имеют дело с правильным вводом-выводом методов.

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

Таким образом, утверждения для квадратного корня метода расположены вдоль линий ввода и вывода, оба являются неотрицательными числами. С другой стороны, юниты могут проверить, что квадратный корень из 9 равен 3, а этот квадратный корень из некоторого отрицательного числа дает исключение.

0 голосов
/ 23 декабря 2010

Я бы сказал, что вам нужны оба. Модульные тесты проверяют правильность утверждений в методе;)

0 голосов
/ 23 декабря 2010

Утверждения не только подтверждают код, но и служат формой документации, которая информирует читателей о свойствах различных структур, которые, как они могут быть уверены, будут удовлетворены в этот момент выполнения (например, node->next != NULL). Это помогает создать мысленную модель кода, когда вы читаете его.

Утверждения также служат для предотвращения аварийных сценариев во время выполнения. например,

   assert(fuel);
   launch_rocket();

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

Итак, короче, я бы оставил их там. Это хорошая привычка добавлять их, и нет смысла отучаться от них.

...