首页 > 解决方案 > Googletest:成功断言时未打印消息

问题描述

我试图在使用 GTest 创建的成功单元测试中发出警告。

我希望下面的代码在某处打印“我的警告消息”:

#include <gtest/gtest.h>

GTEST_API_ int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

TEST(suite, name)
{
    EXPECT_TRUE(true) << "My warning message";
}

但是,我在控制台和 XML 文件中都没有看到预期的字符串。

我尝试在调试器中单步执行代码,并看到该字符串存储在::testing::AssertionResult宏内部创建的类的对象中EXPECT_TRUE

但是,目前尚不清楚如何使其出现。

将 Googletest 更新到 master 分支的负责人并没有帮助。

标签: googletest

解决方案


只有当断言失败时,所有断言/期望才会打印自定义消息。在这种期望的情况下:

EXPECT_TRUE(true) << "My warning message";

它永远不会被触发。您可以致电确认:

EXPECT_TRUE(false) << "My warning message";

但是,使用它会使您的测试失败。如果您想在测试成功时打印消息,您可以使用SUCCEED和自定义TestEventListener

class SuccessListener : public testing::EmptyTestEventListener {
  void OnTestPartResult(const testing::TestPartResult& result) override {
    if (result.type() == testing::TestPartResult::kSuccess) {
      printf("%s\n", result.message());
    }
  }
};

int main(int argc, char* argv[]) {
    ::testing::InitGoogleTest(&argc, argv);
    testing::UnitTest::GetInstance()->listeners().Append(new SuccessListener);
    return RUN_ALL_TESTS();
}


TEST(SuccessPrintTest, SuccessPrint) {
    SUCCEED() << "Custom message";
}

输出是:

[ RUN      ] SuccessPrintTest.SuccessPrint
Succeeded
Custom message
[       OK ] SuccessPrintTest.SuccessPrint (0 ms)

如果打印到控制台,这将非常冗长 - 您可能希望将其重定向到文件(将由 处理SuccessListener)。


推荐阅读