Использование ASSERT и EXPECT в GoogleTest

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


person martjno    schedule 02.04.2010    source источник
comment
Макросы ASSERT_* не (обязательно) завершают тестовый пример, подробности см. в ответе Мартина .   -  person Brandlingo    schedule 08.08.2018


Ответы (3)


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

Используйте EXPECT, когда условие должно выполняться, но в случаях, когда это не так, мы все равно можем получить пользу от продолжения теста. (Однако в конце тест все равно провалится.)

Эмпирическое правило таково: используйте EXPECT по умолчанию, если вам не требуется что-то для хранения до конца тестов, и в этом случае вы должны использовать ASSERT для этого конкретного условия.


Это отражено в учебнике для начинающих:

Обычно EXPECT_* предпочтительнее, так как они позволяют сообщать о более чем одном сбое в тесте. Однако вы должны использовать ASSERT_*, если нет смысла продолжать, когда рассматриваемое утверждение терпит неудачу.

person GManNickG    schedule 02.04.2010
comment
Стандартный пример: перед проверкой содержимого контейнера вы УТВЕРЖДАЕТЕ его размер, потому что нет смысла проверять ОЖИДАНИЯ для элементов, которые могут даже не существовать (кроме того, ваш тест, скорее всего, упадет, если вы попытаетесь получить n-й элемент пустого контейнера) . - person chalup; 02.04.2010
comment
Дело не в том, хотите ли вы, чтобы ваша программа работала, а в том, хотите ли вы, чтобы набор тестов продолжал работать. Ошибка ОЖИДАНИЯ должна означать, что код, который вы тестируете, неисправен. Ошибка ASSERT должна означать, что сам набор тестов неисправен или что код, который вы тестируете, настолько испорчен, что нет смысла продолжать его тестировать. - person Solomon Slow; 06.12.2017
comment
Отличие @SolomonSlow является ключевым. - person orion elenzil; 09.11.2018

Используйте EXPECT_, когда вы

  • хотите сообщить о более чем одном сбое в вашем тесте

Используйте ASSERT_, когда

  • нет смысла продолжать, когда утверждение терпит неудачу

Поскольку ASSERT_ немедленно прерывает вашу функцию в случае сбоя, возможный код очистки пропускается. Выберите EXPECT_ по умолчанию.

person nabulke    schedule 02.04.2010

В дополнение к предыдущим ответам...

ASSERT_ не прекращает выполнение тестового примера. Он возвращается из любой функции, в которой он использовался. Помимо неудачного теста, он оценивается как return;, а это означает, что его нельзя использовать в функции, возвращающей что-то другое, кроме void. Если вы не согласны с предупреждением компилятора, то есть.

EXPECT_ не проходит тест, но не return;, поэтому его можно использовать внутри функций с любым возвращаемым типом.

person Martin G    schedule 10.02.2017