🍬 Почему assert() убивает тесты, а ASSERT_EQ не трогает другие?
assert() крашит процесс. ASSERT_EQ() — нет. Оба проверяют условия. В чём разница на уровне исполнения?
Механизм обработки неудачи в Google Test построен на исключениях и return, а не на abort().
⚡️ Как работает assert():
#define assert(expr) \
((expr) ? (void)0 : __assert_fail(...))
При провале вызывается __assert_fail(), которая делает abort() — немедленное завершение процесса. Никаких cleanup, никаких других тестов.
🔍 Как работает ASSERT_EQ:
#define ASSERT_EQ(a, b) \
if (auto result = Compare(a, b); !result) { \
RecordFailure(result); \
return; // <-- ключевое!
}
✏️ При провале:
1. Ошибка записывается в объект теста
2. Выполняется return из функции теста
3. Фреймворк перехватывает управление
4. Следующий тест запускается нормально
🪐 Технический нюанс:
В helper-функциях ASSERT_* использует специальный механизм — макрос генерирует код, который бросает внутреннее исключение Google Test, если тест не void. Это позволяет прервать выполнение даже из вложенных функций.
🍋 Практический вывод:
Никогда не используй assert() в production коде, который тестируешь — это помешает тестированию граничных случаев. Используй throw или возвращай error codes.
В тестах всегда используй ASSERT_*/EXPECT_*, а не assert().