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


81

我使用Google C ++测试框架对代码进行单元测试。我使用带有C ++单元测试模块的Eclipse CDT进行输出分析。

以前我使用CppUnit,它具有宏家族 CPPUNIT * _MESSAGE,可以这样称呼它:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

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

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

(最好是将消息包含到现有程序读取的数据中,以便使用Google测试进行自动单元测试的方式。)

Answers:


156

当测试失败时,gtest宏返回用于输出诊断消息的流。

EXPECT_TRUE(false) << "diagnostic message";

@ErikAronesty您是否查看了源代码中是否存在与该数据交互的简便方法?
kayleeFrye_onDeck

2
如果无论结果如何都需要打印文本,只需将其写入stdout。但这通常会导致非常嘈杂的测试,难以使用。
奥德里斯·梅斯卡斯卡斯

FAIL()<<“诊断消息”; 以相同的方式工作,但是它确实将生成的输出减少了几行,因为它没有告诉您有关所有EXPECT_X()宏的实际值,期望值等。以防万一您想稍微减少输出长度。
BallisticTomato

61

在当前版本的gtest中,无法完全做到这一点。我看了一下代码,如果测试失败,则显示唯一的文本输出(包装在gtest“消息”中)。

但是,在某个时候,gtest开始printf出现在屏幕上,您可以利用高于该水平的水平来获得与平台无关的颜色。

这是一个被黑的宏,可以执行您想要的操作。这将使用gtest内部文字着色。当然,internal::名称空间应该发出警告,但嘿,它可以工作。

用法:

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

  // or C++ style

  TEST_COUT << "Hello world" << std::endl;
}

输出:

输出示例

码:

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()

谢谢,这是正确的解决方案,恕我直言。但是我可以建议\n在类内的PRINTF中添加一个吗?那是因为我们不能像使用TEST_COUT那样连接行std::cout,所以让用户添加他是没有用的\n。不管怎样,谢谢你!
快乐仙人掌

1
不幸的是,这种方法不再适用于现代版本的Google testing::internal::ColoredPrintf
Test-

15

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

只需定义一个宏:

#define GTEST_COUT std::cerr << "[          ] [ INFO ]"

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

GTEST_COUT << "Hello World" << std::endl;

您会看到这样的结果:

在此处输入图片说明

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


5

请参阅Mark Lakata的答案,这是我的方法:

步骤1:创建头文件,例如: 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_ */

第2GOUT步:在您的gtest中使用

用法:

#include "gtest_cout.h"

TEST(xxx, yyy)
{
    GOUT("Hello world!");
}

在最近的版本中,ColoredPrintf已被设为静态,因此该hack将不再起作用。
schwart

3

您应该定义以下内容:

static class LOGOUT {
public:
    LOGOUT() {}
    std::ostream&  info() {
        std::cout << "[info      ] ";
        return std::cout;
    }

} logout;

使用这个:

logout.info() << "test: " << "log" << std::endl;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.