2010-09-24 53 views
3

我知道默認情況下報告是針對標準錯誤的,因此必須將其重定向到一個文件。 我的問題是我們應該在全球夾具中做這件事嗎?這似乎並沒有爲我工作一些如何。使用BOOST.Test在文件中生成測試報告的更好方法是什麼?

這就是我想 -

struct MyConfig 
{ 
MyConfig() 
    : testReport("fileName.log") 
    { 
    if(!testReport.fail()) 
    original = std::cerr.rdbuf(testReport.rdbuf()); 
    } 
    ~MyConfig() 
    {   
     cerr.rdbuf(original);   
     testReport.close(); 
    } 
    ofstream testReport; 
    streambuf* original; 

}; 

BOOST_GLOBAL_FIXTURE(MyConfig); 

運行測試後,在控制檯上報告僅輸出,雖然0KB文件與給定的名稱創建。

回答

4

你可以嘗試這個替代方案,改編自here,據稱可以用於Boost 1.34.1。這似乎更像Boost的意圖 - 查看結果流覆蓋的用法。

// 
// run_tests.cc 
// 

#define BOOST_AUTO_TEST_MAIN 

#include <iostream> 
#include <fstream> 
#include <cassert> 
#include <boost/test/auto_unit_test.hpp> 
#include <boost/test/results_reporter.hpp> 

std::ofstream ReportRedirector::out; 

struct ReportRedirector 
{ 
    ReportRedirector() 
    { 
     out.open("fileName.log"); 
     assert(out.is_open()); 
     boost::unit_test::results_reporter::set_stream(out); 
    } 
private: 
    static std::ofstream out; 
}; 

BOOST_GLOBAL_FIXTURE(ReportRedirector) 
+0

爲什麼'out'需要聲明爲'static'? – Hemant 2010-09-27 06:52:19

+1

我看不出有什麼理由說明非靜態在這裏會失敗,但這是根據鏈接中的信息應該測試的版本。 – 2010-09-27 11:19:25

5

隨着升壓1.44.0(也許更高版本),你需要將下面的代碼創建一個全球性的燈具會被重定向測試程序至主測試套件命名的文件,其中包含測試輸出(見Boost Documentation

#include <boost/test/unit_test.hpp> 
#include <string> 
#include <fstream> 

struct LogToFile 
{ 
    LogToFile() 
    { 
     std::string logFileName(boost::unit_test::framework::master_test_suite().p_name); 
     logFileName.append(".xml"); 
     logFile.open(logFileName.c_str()); 
     boost::unit_test::unit_test_log.set_stream(logFile); 
    } 
    ~LogToFile() 
    { 
     boost::unit_test::unit_test_log.test_finish(); 
     logFile.close(); 
     boost::unit_test::unit_test_log.set_stream(std::cout); 
    } 
    std::ofstream logFile; 
}; 

BOOST_GLOBAL_FIXTURE(LogToFile); 

在這個例子中logFile並不像在因爲聲明logFile靜態成員導致錯誤地生成的XML以及訪問所述夾具結構由Steve Townsend提供的答案的靜態成員不是線程安全這種方式。

但是,Boost 1.44.0中似乎存在一個錯誤,如果 logFile不是fixture結構的靜態成員(可能與前面提到的錯誤相同),也會導致生成不正確的XML輸出。 要解決此問題,需要在關閉析構函數中的文件流以生成有效的XML之前,使用 logFile << "</TestLog>" << std::flush;行。
感謝@Wracky(評論如下),我用boost::unit_test::unit_test_log.test_finish();替換了logFile << "</TestLog>" << std::flush;這一行,這比手動編寫標籤更清潔。

注意:測試運行時使用以下參數:--output_format=XML --log_level=all --report_level=no。 這使得使用xUnit plugin生成的XML文件爲continuous integration server Jenkins

+0

不幸的是這不適用於報告。我需要使用命令行「--report_format = XML --report_level = detailed」來使用QuickBuild,但是沒有任何輸出顯示在xml文件中。 – Cthutu 2013-11-12 15:27:22

+1

我有同樣的問題,最後標籤不在那裏。我想,因爲它是我自己的輸出流,所以我必須告訴提高測試結束了一些方法。看起來有這樣的功能。 如果我加上這個: 'unit_test_log。test_finish();' 代碼,就在關閉日誌文件之前,我在輸出中獲得了標記。 希望這會有所幫助。 – Wracky 2014-04-07 13:07:18

+0

感謝提示@Wracky。我會毫不猶豫地嘗試,並更新答案,如果它適合我​​。 – MKroehnert 2014-04-07 15:47:08

3

對於完整性:

您不必自己重定向輸入,如果你不想。 您也可以通過命令行參數指定的日誌文件:

C:\MyTest.exe --log_sink=fileName.log 

我花了一段時間來尋找。希望這可以幫助!

相關問題