Googletest - проверить сбой локально? - PullRequest
0 голосов
/ 11 января 2019

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

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

1 Ответ

0 голосов
/ 11 января 2019

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

С учетом всего вышесказанного я бы посоветовал вам пересмотреть свою стратегию тестирования, поскольку, похоже, ваши тесты слишком сложны. Следование «правилу одного ассерта» может быть трудным и не всегда выполнимым, но вы все равно стремитесь к нему, когда это возможно. Надеюсь, это поможет!

...