2014-04-07 58 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

您可以使用最低版本,但是您不应该这样做,因为升级人员保留在该级别更改内容的权利,而且您的代码可能会中断下一次升级到升级的新版本。如果你使用第一个版本的代码,你的代码将会“永远”继续工作[除非是不可能的主要重写增强] –