C++ 具有动态链接和手动设置的Boost unittest框架

C++ 具有动态链接和手动设置的Boost unittest框架,c++,unit-testing,boost,C++,Unit Testing,Boost,我正在尝试设置一个带有动态链接和手动设置的boost unittest框架(不是boost\u AUTO\u TEST\u案例)。我举了一个简单的例子来重现我的错误: //SomeLib.cpp #define BOOST_TEST_DYN_LINK #include "SomeLib.h" int getImportantNumber(){return 1729;} int increaseNumber(int number){return number+1;} //SomeTests.cp

我正在尝试设置一个带有动态链接和手动设置的boost unittest框架(不是boost\u AUTO\u TEST\u案例)。我举了一个简单的例子来重现我的错误:

//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;
}
这通常通过添加

#define BOOST_TEST_DYN_LINK
到所有测试文件和

#define BOOST_TEST_MODULE something
精确到一个任意测试文件。但是,当手动注册boost测试时,最后一个定义不能很好地工作。如果在使用此定义后尝试运行测试,则会得到

build/test/app

Test setup error: test tree is empty

看。是否可以对boost使用boost手动注册和动态链接?

根据您的链接问题,所需的定义是
\define boost\u TEST\u MAIN

显示的代码不包含此定义(或增强测试模块)

据我所知,当您自己定义
init\u unit\u TEST\u suite
并使用
BOOST\u TEST\u模块时,您需要
BOOST\u MAIN

BOOST\u TEST\u MODULE
——定义此标志以生成测试模块 初始化函数,它使用定义的值命名 主测试套件。如果是动态库变量,则使用默认函数 main()实现也会生成


此外,一个示例显示了这一点:

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;  //++++++++++++++
}
    ...
    framework::master_test_suite().add( ts1 );
    return 0;
}
这就是我们为主测试套件设置所做的(我们使用的是Boost 1.44 atm)

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

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;  //++++++++++++++
}
    ...
    framework::master_test_suite().add( ts1 );
    return 0;
}
这似乎来自Boost.Test文档中较新的部分


也许您需要在
init\u unit\u test\u suite
函数中返回主测试套件(一次)?您尝试过这个吗?

当我使用仅页眉库时,我成功地手动设置了测试,以使用动态链接来增强功能

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

BOOST\u TEST\u MAIN只能在一个模块中定义。它引入了main的定义。如果您在多个模块中定义它,那么您将有多个定义的main


有关这些配置宏的解释,请参见my。

BOOST_TEST_模块或BOOST_TEST_MAIN与BOOST_TEST_DYN_链接组合会导致上述错误。“测试设置错误:测试树为空”我尚未尝试此操作。由于我们设法让它与我提出的解决方案一起工作,所以它并不那么紧迫,但如果我有时间,我将对它进行测试。非常感谢Boost文档的重写,它更易于阅读和理解。帮个大忙!