2011-10-28 32 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;