Как обойти утверждение в модульном тесте в режиме отладки?

В тестовом примере я хотел бы протестировать функцию, которая в режиме отладки генерирует утверждение для неверного ввода. Это к сожалению останавливается Ловить тестовый бегун. Есть ли способ обойти это утверждение, чтобы тестовый бегун продолжал?

Вот мой тестовый пример:

 SCENARIO("Simple test case", "[tag]") {
GIVEN("some object") {
MyObject myobject;

WHEN("object is initialized with invalid data") {
// method init generates an assertion when parameters are invalid
bool result = myObject.init(nullptr, nullptr, nullptr, nullptr);
REQUIRE(false == result);

THEN("data processing can't be started") {
}
}
}
}

0

Решение

Обычно assert макрос делает что-то вроде

#define assert(e) ((void) ((e) \
? 0
: (void)printf ("%s:%u: failed assertion `%s'\n",  __FILE__, __LINE__, #e),
abort(), // <-- this aborts you program after printf's above
0
)

и этот макрос включен в отладочных сборках. Для более подробной информации, посмотрите на ваш стандарт assert.h

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

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

  1. скомпилируйте ваши тесты / комплект с помощью -DNDEBUG; и / или
  2. определить свой собственный assert макрос (например, выдать ошибку, которую вы поймаете) и надеяться, что ваш конкретный assert.h проверит, если он уже определен, и не будет пытаться определить его снова (снова, ищите подробности в ваших компиляторах / std libs assert.h заголовок)
1

Другие решения

Других решений пока нет …