我使用 Google C++ 测试框架 对我的代码进行单元测试。 我使用 Eclipse CDT 和 C++ 单元测试模块 进行输出分析。
以前我使用过 CppUnit 它有宏系列 CPPUNIT*_MESSAGE 可以这样调用:
CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)
并允许发送自定义消息来测试输出。
有没有办法在谷歌测试输出中包含一些自定义文本?
(最好是可以包含现有程序读取的数据消息的方式,以使用 google test 进行自动化单元测试。)
gtest 宏返回一个流,用于在测试失败时输出诊断消息。
EXPECT_TRUE(false) << "diagnostic message";
在当前版本的 gtest 中无法干净地完成此操作。我查看了代码,如果您失败测试,则会显示唯一的文本输出(包含在gtest“消息”中)。
gtest 曾经公开其一些内部颜色格式代码(这本来很有用,因为我猜它是可移植的),但最近版本的 gtest 已经隐藏了这一点。所以我修改了这个答案,只使用 ANSI 转义序列来制作颜色。如果您想查看旧答案,请点击帖子底部的“已编辑”链接。
用途:
TEST(pa_acq,Foo)
{
TEST_COUT << "Hello world" << std::endl;
}
输出:
代码:
// 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()
有一种非常简单和 hacky 的方法来做到这一点(不需要 深入内部类或创建新的自定义类)。
定义一个宏即可:
#define GTEST_COUT std::cerr << "[ ] [ INFO ]"
并在测试中使用
GTEST_COUT
(就像 cout
):
GTEST_COUT << "Hello World" << std::endl;
你会看到结果:
感谢@Martin Nowak的发现。
从高级 googletest 主题,您可以使用一些宏来实现此目的。
SUCCEED() << "success/info message";
SUCCEED() 仅输出您的消息并继续。它不会将测试标记为已通过。其结果将由以下断言决定。FAIL() << "test failure message";
FAIL() 将您的测试标记为失败,输出您的消息,然后从函数返回。因此只能在返回 void 的函数中使用。ADD_FAILURE() << "test failure message";
ADD_FAILURE() 将您的测试标记为失败并输出您的消息。它不会从调用函数返回,并且执行流程会像 EXPECT_ 系列宏一样继续。参考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!");
}
您应该定义以下内容:
static class LOGOUT {
public:
LOGOUT() {}
std::ostream& info() {
std::cout << "[info ] ";
return std::cout;
}
} logout;
使用这个:
logout.info() << "test: " << "log" << std::endl;