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().📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст