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

问题描述 投票:0回答:6

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

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

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

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

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

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

c++ googletest
6个回答
226
投票

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

EXPECT_TRUE(false) << "diagnostic message";

68
投票

在当前版本的 gtest 中无法干净地完成此操作。我查看了代码,如果您失败测试,则会显示唯一的文本输出(包含在gtest“消息”中)。

gtest 曾经公开其一些内部颜色格式代码(这本来很有用,因为我猜它是可移植的),但最近版本的 gtest 已经隐藏了这一点。所以我修改了这个答案,只使用 ANSI 转义序列来制作颜色。如果您想查看旧答案,请点击帖子底部的“已编辑”链接。

用途:

TEST(pa_acq,Foo)
{
  TEST_COUT << "Hello world" << std::endl;
}

输出:

Example output

代码:

// C++ stream interface
class TestCout : public std::stringstream
{
public:
    ~TestCout()
    {
        std::cout << "\u001b[32m[          ] \u001b[33m" << str() << "\u001b[0m" << std::flush;
    }
};

#define TEST_COUT  TestCout()

38
投票

有一种非常简单和 hacky 的方法来做到这一点(不需要 深入内部类或创建新的自定义类)。

定义一个宏即可:

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

并在测试中使用

GTEST_COUT
(就像
cout
):

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

你会看到结果:

感谢@Martin Nowak的发现。


14
投票

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

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

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步:在你的gtest中使用

GOUT

用途:

#include "gtest_cout.h"

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

3
投票

您应该定义以下内容:

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

} logout;

使用这个:

logout.info() << "test: " << "log" << std::endl;
© www.soinside.com 2019 - 2024. All rights reserved.