[GTEST]Как игнорировать ассерты в функции?
От: plastictown Норвегия  
Дата: 07.05.21 07:01
Оценка:
Доброго времени суток!
Если есть тест на gtest, в фикстуре есть методы (очень большие, переписывать месяцы), которые генерят фейлы внутри себя, а очень хочется эти фейлы обработать, чтобы не зафейлить весь тест:
Т.е. сделать как-то так:
if(HasAnyFailure(SomeMethod())){
  doSmth1();
}else{
  doSmth2();
}

Самое похожее, что я находил — сделать изнутри метода
if(HasFatalFailure() || HasFailure()){
  SUCCEED();
}

Это работает в плане того, что можно сделать что-то в зависимости от результата, но тест фейлится все равно. Можно ли в gtest проигнорировать фейлы какой-либо функции?
Спасибо!
gtest c++ google test
Re: [GTEST]Как игнорировать ассерты в функции?
От: saf_e  
Дата: 11.05.21 08:22
Оценка:
Здравствуйте, plastictown, Вы писали:

P>Доброго времени суток!

P>Если есть тест на gtest, в фикстуре есть методы (очень большие, переписывать месяцы), которые генерят фейлы внутри себя, а очень хочется эти фейлы обработать, чтобы не зафейлить весь тест:

Боюсь даже если вы и найдете такой способ, то можете получить больше чем хотелось (начнут игнорироваться ассерты которые не должны).
Наверное самый правильный способ позволить кастомизировать эту логику:
* либо разбив на небольшие блоки которые вы сможете потом переиспользовать, и не ломать оригинальные методы
* либо вынести выполнение той логики которая вызывает ассерты в стратегию/интерфейс

Если все-таки сильно захочется сделать так как вы описали, то наверное проще всего сделать свой макрос/ф-цию проверки и использовать вместо ASSERT_*, так вы явно укажите что юзаете что-то свое и будет меньше шансов ошибиться.
Re: [GTEST]Как игнорировать ассерты в функции?
От: qaz77  
Дата: 11.05.21 10:52
Оценка:
Здравствуйте, plastictown, Вы писали:
P>Если есть тест на gtest, в фикстуре есть методы (очень большие, переписывать месяцы), которые генерят фейлы внутри себя, а очень хочется эти фейлы обработать, чтобы не зафейлить весь тест:
P>Т.е. сделать как-то так:
P>
P>if(HasAnyFailure(SomeMethod())){
P>  doSmth1();
P>}else{
P>  doSmth2();
P>}
P>


Ну вот прямо так с if-ом я сомневаюсь, что можно сделать.

В gtest для обработки assert есть макросы EXPECT_DEBUG_DEATH и ASSERT_DEBUG_DEATH.
Вторым аргументом передается регэксп для матчинга текста конкретного assert или пустая строка для отлова всех.

Если вдруг ассерты включены в релизной сборке, то надо пользоваться просто EXPECT_DEATH/ASSERT_DEATH.

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