106

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

以前我使用CppUnit它有宏系列 CPPUNIT*_MESSAGE可以这样调用:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

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

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

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

4

6 回答 6

191

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

EXPECT_TRUE(false) << "diagnostic message";
于 2013-05-10T22:50:41.443 回答
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()
于 2015-03-19T21:52:44.650 回答
23

有一种非常简单和 hacky 的方法(无需深入研究内部类或创建新的自定义类)。

只需定义一个宏:

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

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

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

你会看到结果:

在此处输入图像描述

感谢@Martin Nowak的发现。

于 2018-02-22T10:13:52.627 回答
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_ */

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

用法:

#include "gtest_cout.h"

TEST(xxx, yyy)
{
    GOUT("Hello world!");
}
于 2017-07-27T08:11:44.403 回答
4

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

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

您应该定义以下内容:

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

} logout;

使用这个:

logout.info() << "test: " << "log" << std::endl;
于 2017-05-17T01:56:36.907 回答