如何在Google C++测试框架中发送自定义消息?

Yur*_*kiy 67 c++ googletest

我使用Google C++ Testing Framework进行代码的单元测试.我使用Eclipse CDT和C++单元测试模块进行输出分析.

以前我用CppUnit它有宏家族 CPPUNIT*_MESSAGE,可以像这样调用:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)
Run Code Online (Sandbox Code Playgroud)

并允许发送自定义消息以测试输出.

有没有办法在谷歌测试输出中包含一些自定义文本?

(最好是包含使用谷歌测试自动单元测试的现有程序读取的数据消息的方式.)

use*_*113 133

当测试失败时,gtest宏返回一个流以输出诊断消息.

EXPECT_TRUE(false) << "diagnostic message";
Run Code Online (Sandbox Code Playgroud)

  • FAIL() &lt;&lt; "诊断消息"; 工作方式相同,但它确实将生成的输出减少了几行,因为它不会告诉您实际值、期望值等,而它对所有 EXPECT_X() 宏都是这样做的。以防万一您想稍微减少输出长度。 (3认同)
  • 如果无论结果如何都需要打印文本,只需将其写入stdout。但这通常会产生非常嘈杂的测试,难以使用。 (2认同)
  • 也看看 [SCOPED_TRACE](/sf/answers/4994438221/) (2认同)

Mar*_*ata 56

在当前版本的gtest中无法干净地完成它.我查看了代码,如果测试失败,将显示唯一的文本输出(包含在gtest"Messages"中).

但是,在某些时候,gtest开始printf进入屏幕,你可以利用上面的级别来获得与平台无关的颜色.

这是一个被黑客攻击的宏来做你想做的事.这使用gtest内部文本着色.当然internal::命名空间应该是警告铃声,但是,嘿,它的工作原理.

用法:

TEST(pa_acq,Foo)
{
  // C style
  PRINTF("Hello world \n");

  // or C++ style

  TEST_COUT << "Hello world" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

示例输出

码:

namespace testing
{
 namespace internal
 {
  enum GTestColor {
      COLOR_DEFAULT,
      COLOR_RED,
      COLOR_GREEN,
      COLOR_YELLOW
  };

  extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
 }
}
#define PRINTF(...)  do { testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__); } while(0)

// C++ stream interface
class TestCout : public std::stringstream
{
public:
    ~TestCout()
    {
        PRINTF("%s",str().c_str());
    }
};

#define TEST_COUT  TestCout()
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这种方法不再适用于现代版本的 Google Test - `testing::internal::ColoredPrintf` 不再向公众开放:( (2认同)

Vla*_*lad 14

高级 googletest 主题中,您可以使用一些宏来实现此目的。

  • SUCCEED() SUCCEED() << "success/info message"; SUCCEED() 仅输出您的消息并继续。它不会将测试标记为已通过。其结果将由以下断言决定。
  • FAIL() FAIL() << "test failure message"; FAIL() 将您的测试标记为失败,输出您的消息,然后从函数返回。因此只能在返回 void 的函数中使用。
  • ADD_FAILURE() ADD_FAILURE() << "test failure message"; ADD_FAILURE() 将您的测试标记为失败并输出您的消息。它不会从调用函数返回,并且执行流程会像 EXPECT_ 系列宏一样继续。

  • 提供的链接不再存在,但我在这里找到了它:https://google.github.io/googletest/advanced.html 另外, SUCCEED() 宏目前明确不会在输出中打印任何内容,但他们“可能”将来添加它。 (6认同)

Jus*_*dow 8

有一种非常简单且hacky的方式(无需深入了解内部类或创建新的自定义类)。

只需定义一个宏:

#define GTEST_COUT std::cerr << "[          ] [ INFO ]"
Run Code Online (Sandbox Code Playgroud)

并在测试中使用GTEST_COUT(就像cout):

GTEST_COUT << "Hello World" << std::endl;
Run Code Online (Sandbox Code Playgroud)

您会看到这样的结果:

在此处输入图片说明

幸得@马丁·诺瓦克,他的发现。


小智 5

参考 Mark Lakata 的回答,这是我的方法:

Step1:创建头文件,例如: gtest_cout.h

代码:

#ifndef _GTEST_COUT_H_
#define _GTEST_COUT_H_

#include "gtest/gtest.h"

namespace testing
{
namespace internal
{
enum GTestColor
{
    COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW
};
extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
}
}

#define GOUT(STREAM) \
    do \
    { \
        std::stringstream ss; \
        ss << STREAM << std::endl; \
        testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); \
        testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, ss.str().c_str()); \
    } while (false); \

#endif /* _GTEST_COUT_H_ */
Run Code Online (Sandbox Code Playgroud)

Step2:GOUT在你的gtest中使用

用法:

#include "gtest_cout.h"

TEST(xxx, yyy)
{
    GOUT("Hello world!");
}
Run Code Online (Sandbox Code Playgroud)

  • ColoredPrintf 在最近的版本中已变为静态,因此此 hack 将不再起作用。 (4认同)