通过动态链接和手动设置来提升单元测试框架

时间:2014-02-12 10:55:16

标签: c++ unit-testing boost

我正在尝试使用动态链接和手动设置(不是BOOST_AUTO_TEST_CASE)来设置boost unittest框架。我已经做了一个简单的例子来重现我的错误:

//SomeLib.cpp
#define BOOST_TEST_DYN_LINK
#include "SomeLib.h"
int getImportantNumber(){return 1729;}
int increaseNumber(int number){return number+1;}

//SomeTests.cpp
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
#include "lib/SomeLib.h"
#include "SomeTests.h"
using namespace boost::unit_test;

void SomeTests::numberIs1729(){
    BOOST_CHECK(getImportantNumber() == 1729);
}
void SomeTests::increase(){
    BOOST_CHECK(increaseNumber(1) == 2);
}

//ChainedInc.cpp
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
#include "lib/SomeLib.h"
#include "ChainedInc.h"
using namespace boost::unit_test;

void ChainedInc::incinc(){
    BOOST_CHECK(increaseNumber(increaseNumber(1)) == 3);
}
void ChainedInc::incincinc(){
    BOOST_CHECK(increaseNumber(increaseNumber(increaseNumber(1))) == 4);
}

//Master.cpp
#define BOOST_TEST_DYN_LINK
#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/test/unit_test.hpp>
#include "SomeTests.h"

using namespace boost::unit_test;
test_suite* init_unit_test_suite( int, char** )
{
    test_suite* ts1 = BOOST_TEST_SUITE( "Suite1" );

    boost::shared_ptr<SomeTests> test1 ( new SomeTests());
    ts1->add( BOOST_TEST_CASE( boost::bind(&SomeTests::numberIs1729, test1)));
    ts1->add( BOOST_TEST_CASE( boost::bind(&SomeTests::increase, test1)));

    framework::master_test_suite().add( ts1 );
    return 0;
}

当我运行此代码时,我收到以下错误:

/usr/bin/g++ test/ChainedInc.cpp.1.o test/Master.cpp.1.o test/SomeTests.cpp.1.o lib/SomeLib.cpp.2.o -o /home/mto/src/manualBoost/build/test/app -Wl-Bdynamic -L/usr/lib64 -lboost_unit_test_framework

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

这通常可以通过添加

来解决
#define BOOST_TEST_DYN_LINK

到所有测试文件和

#define BOOST_TEST_MODULE something

到一个任意测试文件。但是,当手动注册增压测试时,最后一个定义不能很好地工作。如果我在使用此定义后尝试运行我的测试,我会得到

build/test/app

Test setup error: test tree is empty

Boost test does not init_unit_test_suite。是否可以使用boost手动注册和动态链接来提升?

3 个答案:

答案 0 :(得分:3)

BOOST_TEST_MAIN应该只在一个模块中定义。它引入了main的定义。如果您在多个模块中定义它,那么您将有多个定义的main。

有关这些配置宏的说明,请参阅我的documentation rewrite

答案 1 :(得分:1)

根据您的关联问题,所需的定义为#define BOOST_TEST_MAIN

您提供的代码不包含此定义(也不包含BOOST_TEST_MODULE

根据我的理解the docs,当您自己定义BOOST_TEST_MAIN并且使用init_unit_test_suite时,如果您使用自动内容,则需要BOOST_TEST_MODULE

  

BOOST_TEST_MODULE - 将此标志定义为生成测试模块   初始化函数,它使用定义的值来命名   主测试套件。在动态库变体默认功能的情况下   也生成了main()实现


此外,old example from the boost docs显示了这一点:

test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
    test_suite* test = BOOST_TEST_SUITE( "Master test suite" );

    test->add( BOOST_TEST_CASE( &my_test_function ) );

    return test;  //++++++++++++++
}

这是我们为主测试套件设置做的(我们在Boost 1.44 atm。)

但上面的代码显示了这一点:

    ...
    framework::master_test_suite().add( ts1 );
    return 0;
}

似乎是来自Boost.Test文档的一些较新版本。

也许您需要在init_unit_test_suite函数中返回主测试套件(一次)?你试过这个吗?

答案 2 :(得分:0)

当我使用仅标头库时,我设法获得手动设置测试以使用动态链接来提升。

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