🍬 Почему 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().
Просмотры: 319
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти