Googletest - проверить сбой локально?

Я хотел бы знать, можно ли проверить отказавший оператор 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 и имеет другие сложности.

Есть ли способ сделать это? Запуск этой функции в отдельном потоке или сброс флага ошибки?

(ASSERT|EXPECT)_NO_FATAL_FAILURE? Это работает только при фатальных сбоях.
Yksisarvinen 11.01.2019 10:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
843
1

Ответы 1

Как ранее упоминалось в комментарии от @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 11.01.2019 13:59

@TStancek Возможно, это поведение различается в зависимости от версии googletest. Я тестировал это поведение с версией 1.7.0, и он работает, как описано в моем ответе.

Marko Popovic 11.01.2019 15:06

Попробуйте это с выводом, например: EXPECT_NO_FATAL_FAILURE (subcheck ()) << "Эта процедура не удалась". При сбое EXPECT ничего не выводится, но сообщение печатается при сбое ASSERT. По крайней мере, в моем проекте.

TStancek 11.01.2019 15:50

@TStancek Пожалуйста, проверьте мой обновленный ответ. Кстати, какую версию googletest вы используете?

Marko Popovic 11.01.2019 16:13

Спасибо, попробую (после выходных)

TStancek 11.01.2019 16:19

@TStancek Вы пробовали изменения в отредактированном ответе? Считайте, что проголосовали / отметили как принятый, если ответ был вам полезен.

Marko Popovic 16.01.2019 09:43

Ну, нет, используемая версия GTest - это настройка проекта, и она настроена на постоянное обновление до последней версии, так что я предполагаю, что мы используем 1.8.1, так что, вероятно, новее, чем ваша. Поэтому логично, что функция выполняет то, что указано в ее описании. Изменили ли они его или это была ошибка, я не знаю, но в настоящее время, похоже, он ведет себя не так, как вы описываете.

TStancek 17.01.2019 15:52

Другие вопросы по теме