Search code examples
c++testingboostboost-test

Boost test does not init_unit_test_suite


I run this piece of code

#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK

#include <boost/test/unit_test.hpp>
#include <boost/test/unit_test_log.hpp>
#include <boost/filesystem/fstream.hpp>

#include <iostream>

using namespace boost::unit_test;
using namespace std;


void TestFoo()
{
    BOOST_CHECK(0==0);
}

test_suite* init_unit_test_suite( int argc, char* argv[] )
{
    std::cout << "Enter init_unit_test_suite" << endl;
    boost::unit_test::test_suite* master_test_suite = 
                        BOOST_TEST_SUITE( "MasterTestSuite" );
    master_test_suite->add(BOOST_TEST_CASE(&TestFoo));
    return master_test_suite;

}

But at runtime it says

Test setup error: test tree is empty

Why does it not run the init_unit_test_suite function?


Solution

  • Did you actually dynamically link against the boost_unit_test framework library? Furthermore, the combination of manual test registration and the definition of BOOST_TEST_MAIN does not work. The dynamic library requires slightly different initialization routines.

    The easiest way to avoid this hurdle is to use automatic test registration

    #define BOOST_TEST_MAIN
    #define BOOST_TEST_DYN_LINK
    
    #include <boost/test/unit_test.hpp>
    #include <boost/test/unit_test_log.hpp>
    #include <boost/filesystem/fstream.hpp>
    
    #include <iostream>
    
    using namespace boost::unit_test;
    using namespace std;
    
    BOOST_AUTO_TEST_SUITE(MasterSuite)
    
    BOOST_AUTO_TEST_CASE(TestFoo)
    {
        BOOST_CHECK(0==0);
    }
    
    BOOST_AUTO_TEST_SUITE_END()
    

    This is more robust and scales much better when you add more and more tests.