2014-04-07 79 views
2

我已經成功構建了使用VS2013的Boost庫。我也成功地包含並使用了一些Boost.Filesystem和Boost.Log的東西。不過,我掙扎着爬以下的單元測試在Visual Studio 2013的工作:努力獲得Boost庫單元測試框架的工作

#define BOOST_TEST_MODULE MyTest 
#include <boost/test/included/unit_test.hpp> 

class Multiplier { 
public: 
    explicit Multiplier(int i) : _value{ i } {} 
    int multiply(int i) { return _value * i; } 
private: 
    int _value; 
}; 

BOOST_AUTO_TEST_CASE(everything_test) { 
    Multiplier m{ 5 }; 
    BOOST_CHECK_EQUAL(m.multiply(2), 10); 
} 

這顯然不是一個真正的單元測試,但是這不是問題的關鍵... :)

通過包括boost/test/included/unit_text.hpp,我應該得到一個爲我提供的main()函數,看來我是因爲我能夠解決這個錯誤。但是,當我運行生成的可執行文件時,我得到一個Access violation reading location 0x00000000.

我應該運行可執行文件來運行測試嗎?如果不是,我該如何運行它們?運行測試看起來像是一個簡單的操作,從文檔中可以明顯看出,但我必須忽略它。

+0

你是否嘗試過從命令行運行可執行文件?使用適當的命令行參數[http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/utf/user-guide/runtime-config/reference.html]。 – Ravi

+0

你有能力運行一個空的測試用例嗎?你記得在你的生成文件中添加鏈接信息嗎? ?我在我的Makefile中有以下內容:-lboost_system – serup

回答

1

首先確保你的makefile中有鏈接信息;例如:

-lboost_system -lboost_log -lboost_signals -lboost_thread -lboost_filesystem -lboost_regex 
當然

只添加這是需要特定的測試用例套件

然後在您的測試套件文件升壓有如下:

#define BOOST_TEST_MODULE YourTestSuiteName     
#define BOOST_TEST_DYN_LINK        
#include <boost/test/unit_test.hpp>  
#include <boost/test/results_reporter.hpp>    
#define BOOST_AUTO_TEST_MAIN 

#ifndef NOTESTRESULTFILE               
#ifdef BOOST_AUTO_TEST_MAIN               
std::ofstream out;                 

struct ReportRedirector                
{                     
    ReportRedirector()                
    {                    
     out.open("test_results.xml");            
     assert(out.is_open());             
     boost::unit_test::results_reporter::set_stream(out);      
    }                    
};                     

BOOST_GLOBAL_FIXTURE(ReportRedirector)            
#endif                    
#endif 

BOOST_AUTO_TEST_SUITE (YourTestSuiteName)    
BOOST_AUTO_TEST_SUITE_END()            

BOOST_AUTO_TEST_CASE(YourTestCaseName)         
{                    
    cout<<"BOOST_AUTO_TEST_CASE(YourTestCaseName)\n{"<<endl;   

    BOOST_CHECK(false == true); //TODO: testcase not finished 

    cout<<"}"<<endl;     
}          

此設置正常工作對我來說,但我相信你可以用不同的方式設置增強單元測試套件

+0

或許你缺少的是聲明: '#define BOOST_AUTO_TEST_MAIN' – serup

+0

發送輸出到'std :: cout'最終會自動進入文件?輸出不是'xml'格式。 – Steve

+0

我問這個問題已經有一段時間了,現在我不能真正嘗試這個。但是,它確實有相當多的細節,看起來是正確的,所以我接受了這個答案。如果有人來過並閱讀並且不同意,請告訴我。 – Steve

1

使用

#include <boost/test/unit_test.hpp> 

而非

#include <boost/test/included/unit_test.hpp> 

主要在測試/ unit_test.hpp文件中定義。 「包含」是一個實現細節。

+1

我使用最低版本沒有問題 – serup

+0

您可以使用最低版本,但是您不應該這樣做,因爲升級人員保留在該級別更改內容的權利,而且您的代碼可能會中斷下一次升級到升級的新版本。如果你使用第一個版本的代碼,你的代碼將會「永遠」繼續工作[除非是不可能的主要重寫增強] –