Является ли assert и юнит-тестирование несовместимым? - PullRequest
3 голосов
/ 12 июля 2009

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

Если проверка не пройдена, проверка также не пройдена. Это оставляет меня с некоторыми тестовыми случаями, которые никогда не будут работать.

Например, функция вместо указания сбоя (возвращает false или что-то подобное) утверждает.

Есть ли решение для этого (функции модульного тестирования, содержащие assert)?

Ответы [ 5 ]

12 голосов
/ 12 июля 2009

Вы могли бы проверить тот факт, что это утверждение прерывается, когда вы ожидаете его (при неправильном вводе).

Тестовый фреймворк Google Test в виде макроса ASSERT_DEATH, который проверит, что программа прерывает работу, где вы ожидаете (например, assert).

Вы также можете скомпилировать с определенным NDEBUG (-DNDEBUG с gcc), чтобы отключить утверждения для ваших модульных тестов.

9 голосов
/ 12 июля 2009

Может быть, это только я, но я думаю, что если у вас есть ошибки проверки, вам не следует даже думать о модульном тестировании более высокого уровня, пока вы не исправите их. Идея состоит в том, что утверждения не должны никогда давать сбой ни при каких обстоятельствах, включая модульные тесты, если код написан правильно. Или, по крайней мере, так я пишу свой код.

7 голосов
/ 12 июля 2009

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

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

CppUnit - это хороший тестовый фреймворк. Это часть семейства nUnit для C ++.

2 голосов
/ 18 июля 2009

Утверждения никогда не должны проваливаться ни при каких обстоятельствах. Если они терпят неудачу в ваших тестах, это указывает на логическую ошибку. По сути, если ваша функция выполняет «assert (0)» вместо возврата кода ошибки, то функцию следует переписать. Если прерывание - желаемое поведение, тогда exit () подходит, но не assert ().

Если утверждение когда-либо не выполняется во время ваших тестов, то код содержит ошибку и должен быть изменен. Код «assert (x)» следует интерпретировать как «Логика программы требует, чтобы x было истинным. Ни при каких обстоятельствах оно не может быть ложным». Если у вас есть модульный тест, который приводит к сбою утверждения, то утверждение явно недействительно и должно быть изменено.

1 голос
/ 12 июля 2009

Похоже, что ваша тестовая среда не была создана для проверки ваших утверждений.

С утверждением, которое остановит процесс, вам нужно что-то, что будет контролировать ваше состояние выполнения.

Пример того, как Boost-Test делает это: http://www.boost.org/doc/libs/1_34_0/libs/test/doc/components/prg_exec_monitor/index.html

Некоторое время я не занимался кодированием на C или C ++, но я бы начал с аналогичной техники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...