2009-07-12 4 views
2

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

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

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

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

ответ

7

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

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

CppUnit - это тонкая тестовая структура. Это часть семейства nUnit для C++.

9

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

+13

Утверждения могут существовать для проверки входных параметров. Допустимым модульным тестом является «эта функция взрывается предсказуемым образом с определенными классами плохого ввода». – Tom

1

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

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

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

Я не делал C или C++ кодирования в какое-то время, но я хотел бы начать с подобной техникой.

12

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

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

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

2

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

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

+1

Если прерывание - это желаемое поведение, возможно, вы должны использовать 'abort()', но, конечно, не 'exit()'. – Tom

+0

Это хороший момент.Возможно, я должен был сказать «если прекращение - это желаемое поведение». «Abort» имеет техническое значение, которое я не собираюсь использовать. –

+1

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

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