【问题标题】:Struggling getting Boost library unit test framework to work努力让 Boost 库单元测试框架正常工作
【发布时间】:2014-05-20 04:33:01
【问题描述】:

我已经使用 VS2013 成功构建了 Boost 库。我还成功地包含并使用了一些 Boost.Filesystem 和 Boost.Log 的东西。但是,我正在努力让以下单元测试在 Visual Studio 2013 中工作:

#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.

我应该运行可执行文件来运行测试吗?如果没有,我该如何运行它们?运行测试似乎是一个如此简单的操作,从文档中可以明显看出,但我一定错过了它。

【问题讨论】:

标签: c++ unit-testing boost visual-studio-2013


【解决方案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;                  
}                                     

这个设置对我来说很好,但我相信你可以用不同的方式设置 boost 单元测试套件

【讨论】:

  • 也许你缺少的是声明:#define BOOST_AUTO_TEST_MAIN
  • 将输出发送到std::cout 最终会自动转到文件吗?输出不是xml 格式。
  • 我问这个问题已经有一段时间了,我现在不能真正尝试这个。但是,它确实有很多细节,看起来它是正确的,所以我接受这个答案。如果有人过来读了这篇文章但不同意,请告诉我。
  • @Steve,我通常使用这样的输出文件,然后运行 ​​xlstproc 脚本排序并给我一个很好的最终输出,是的,并非所有都是 xml 格式,所以也许它应该有不同的名称 - 好点 :-)
【解决方案2】:

使用

#include <boost/test/unit_test.hpp>

而不是

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

main 在 test/unit_test.hpp 文件中定义。 “包含”是一个实现细节。

【讨论】:

  • 我使用底部的没有问题
  • 您可以使用底部的,但您不应该这样做,因为 boost 人员保留更改该级别内容的权利,恕不另行通知,并且您的代码可能会在您下次升级到新版本时中断的提升。如果您使用代码的第一个版本,您的代码将继续“永远”工作[除非对 boost 进行重大重写,这是极不可能的。]
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2016-05-16
  • 2019-04-24
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多