Я хотел бы знать, можно ли проверить отказавший оператор ASSERT или EXPECT, который произошел внутри вызываемой функции и не зависит от любого другого или предыдущего неудачного оператора ASSERT / EXPECT. В основном:
void subcheck () {
EXPECT_EQ(1,1);
}
void check () {
EXPECT_EQ(1,2);
subcheck();
//Here I want to determine whether subcheck had failure
}
Я не могу спросить о TestFailure, потому что до subcheck произошел сбой. Кроме того, я хотел бы избежать обходных приемов, таких как наличие функции, возвращающей bool, потому что это усложняет ASSERT и имеет другие сложности.
Есть ли способ сделать это? Запуск этой функции в отдельном потоке или сброс флага ошибки?





Как ранее упоминалось в комментарии от @Yksisarvinen, вы можете использовать макрос EXPECT_NO_FATAL_FAILURE (или его аналог ASSERT). Это работает, даже если процедура subcheck содержит нефатальные утверждения Только. В случае вашего примера вот как вы это можете проверить:
void subcheck () {
EXPECT_EQ(1, 3) << "This failed"; // Will be printed
}
void check () {
EXPECT_EQ(1, 2);
EXPECT_NO_FATAL_FAILURE(subcheck()) << "This failed"; // Will not be printed although it compiles
}
Результат:
/path/to/test.cpp:580: Failure
Value of: 2
Expected: 1
/path/to/test.cpp:582 Failure
Value of: 3
Expected: 1
This failed
Другой подход, который вы могли бы сделать, - использовать testing::AssertionResult. Вот пример:
testing::AssertionResult subcheck2 () {
return 1 == 3 ? testing::AssertionSuccess() : testing::AssertionFailure();
}
void check ()
{
EXPECT_EQ(1, 2);
EXPECT_EQ(testing::AssertionSuccess(), subcheck2()) << "This failed"; // Will be printed
}
На этот раз результат выглядит так:
/path/to/test.cpp:580: Failure
Value of: 2
Expected: 1
/path/to/test.cpp:582: Failure
Value of: subcheck2()
Actual: 0
Expected: testing::AssertionSuccess()
Which is: 1
This failed
С учетом всего вышесказанного я предлагаю вам пересмотреть свою стратегию тестирования, поскольку кажется, что ваши тесты слишком сложны. Следование «правилу одного АССЕРТА» может быть трудным и не всегда выполнимым, но вы все равно стремитесь к нему, когда это возможно. Надеюсь это поможет!
К сожалению, похоже, что он не работает с EXPECT внутри subcheck (), реагирует только на ASSERT.
@TStancek Возможно, это поведение различается в зависимости от версии googletest. Я тестировал это поведение с версией 1.7.0, и он работает, как описано в моем ответе.
Попробуйте это с выводом, например: EXPECT_NO_FATAL_FAILURE (subcheck ()) << "Эта процедура не удалась". При сбое EXPECT ничего не выводится, но сообщение печатается при сбое ASSERT. По крайней мере, в моем проекте.
@TStancek Пожалуйста, проверьте мой обновленный ответ. Кстати, какую версию googletest вы используете?
Спасибо, попробую (после выходных)
@TStancek Вы пробовали изменения в отредактированном ответе? Считайте, что проголосовали / отметили как принятый, если ответ был вам полезен.
Ну, нет, используемая версия GTest - это настройка проекта, и она настроена на постоянное обновление до последней версии, так что я предполагаю, что мы используем 1.8.1, так что, вероятно, новее, чем ваша. Поэтому логично, что функция выполняет то, что указано в ее описании. Изменили ли они его или это была ошибка, я не знаю, но в настоящее время, похоже, он ведет себя не так, как вы описываете.
(ASSERT|EXPECT)_NO_FATAL_FAILURE? Это работает только при фатальных сбоях.