2011-10-28 24 views
31

我正在使用googletest C++ testing framework。正常情况下运行测试的文本输出看起来是这样的:在Google Test中打印额外的输出

 
[ RUN  ] MyTest.Fuzz 
[  OK ] MyTest.Fuzz (1867 ms) 

我想输出相同的格式一些额外的数据,例如:

 
[ RUN  ] MyTest.Fuzz 
[   ] random seed = 1319760587 
[  OK ] MyTest.Fuzz (1867 ms) 

我已在googletest文档中找到Logging Additional Information但似乎只是将结构化数据发送到XML输出,而不是标准控制台输出。

是否有一个googletest函数,我可以在我的单元测试中调用输出这种格式的文本?手动发送数据到cout工程,但它不包括通常的彩色输出,所以我必须通过打印13个空格或其他任何明确缩进输出。

+6

有用的答案:http://stackoverflow.com/a/29155677/92957 – Eugene

回答

9

您可以编写默认打印机PrettyUnitTestResultPrinter的包装以打印出测试属性。您可以使用listeners.default_result_printer()(请参见下文)获取默认打印机。你将不得不实施EmptyTestEventListener,改变方法PrettyUnitTestResultPrinter::OnTestEnd()in gtest.cc),并使用结果属性:test_info.result()->GetTestProperty(i)像打印机的XML输出:

String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
    const TestResult& result) { 
    Message attributes; 
    for (int i = 0; i < result.test_property_count(); ++i) { 
    const TestProperty& property = result.GetTestProperty(i); 
    attributes << " " << property.key() << "=" 
     << "\"" << EscapeXmlAttribute(property.value()) << "\""; 
    } 
    return attributes.GetString(); 
} 

然后你就可以替代默认的监听你的测试,如它在的完成google test sample

UnitTest& unit_test = *UnitTest::GetInstance(); 
if (terse_output) { 
    TestEventListeners& listeners = unit_test.listeners(); 
    delete listeners.Release(listeners.default_result_printer()); 
    listeners.Append(new TersePrinter); 
} 
int ret_val = RUN_ALL_TESTS(); 
11

简单地打印到stderr将在默认测试配置下工作。

std::cerr << "[   ] random seed = " << random_seed << std::endl; 
+1

我曾提到我的问题,并写入输出这样做不包括通常的彩色输出。 –

+2

这很棒,但cout不显示。 – thang

+1

std :: cout不为我工作,但std:cerr显示 – user501743

0

我刚使用std::cout符合ANSI颜色代码在Linux的但我相信代码在自胜10周年更新窗口工作。

std:cout << "\033[0;32m" << "[   ] " << "\033[0;0m" 
<< "random seed = " << random_seed << lend; 

或只需创建一个头文件和一些#define报表,它包括在我的测试。我也喜欢将文本格式化为更加突出。

#define ANSI_TXT_GRN "\033[0;32m" 
#define ANSI_TXT_MGT "\033[0;35m" //Magenta 
#define ANSI_TXT_DFT "\033[0;0m" //Console default 
#define GTEST_BOX "[  cout ] " 
#define COUT_GTEST ANSI_TXT_GRN << GTEST_BOX //You could add the Default 
#define COUT_GTEST_MGT COUT_GTEST << ANSI_TXT_MGT 

所以我的代码是:

cout << COUT_GTEST_MGT << "random seed = " << random_seed << ANSI_TXT_DFT << endl;