Boost Test


 

 

Unit Test Framework

Немного про test module

// функция инициализации модуля

boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] );

Можно определить BOOST_TEST_MAIN или BOOST_TEST_MODULE module_name, чтобы библиотека подставила пустую функцию инициализации.

// ручное построение дерева

#include <boost/test/included/unit_test.hpp>
using namespace boost::unit_test;

void test_case1() { /* : */ }
void test_case2() { /* : */ }
void test_case3() { /* : */ }
void test_case4() { /* : */ }

test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
    test_suite* ts1 = BOOST_TEST_SUITE( "test_suite1" );
    ts1->add( BOOST_TEST_CASE( &test_case1 ) );
    ts1->add( BOOST_TEST_CASE( &test_case2 ) );

    test_suite* ts2 = BOOST_TEST_SUITE( "test_suite2" );
    ts2->add( BOOST_TEST_CASE( &test_case3 ) );
    ts2->add( BOOST_TEST_CASE( &test_case4 ) );

    framework::master_test_suite().add( ts1 );
    framework::master_test_suite().add( ts2 );

    return 0;
}

// автоматическое построение дерева

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE( test_suite1 )

    BOOST_AUTO_TEST_CASE( test_case1 )
    {
        BOOST_WARN( sizeof(int) < 4 );
    }

    BOOST_AUTO_TEST_CASE( test_case2 )
    {
        BOOST_REQUIRE_EQUAL( 1, 2 );
        BOOST_FAIL( "Should never reach this line" );
    }

BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE( test_suite2 )

    BOOST_AUTO_TEST_CASE( test_case3 )
    {
        BOOST_CHECK( true );
    }

    BOOST_AUTO_TEST_CASE( test_case4 )
    {
        BOOST_CHECK( false );
    }

BOOST_AUTO_TEST_SUITE_END()

Какие бывают test case?

Nullary function based test case

// ручная регистрация

#include <boost/test/included/unit_test.hpp>
#include <boost/bind.hpp>
using namespace boost::unit_test;

class test_class {
public:
    void test_method()
    {
        BOOST_CHECK( true /* test assertion */ );
    }
} tester;

void nullary_test_function()
{
    BOOST_CHECK( true /* test assertion */ );
}

void binary_test_function( int i, int j )
{
    BOOST_CHECK( true /* test assertion */ );
}

test_suite*
init_unit_test_suite( int argc, char* argv[] ) 
{
    framework::master_test_suite().
        add( BOOST_TEST_CASE( boost::bind( &test_class::test_method, &tester )));

    framework::master_test_suite().
        add( BOOST_TEST_CASE( &free_test_function ) );

    framework::master_test_suite().
        add( BOOST_TEST_CASE( boost::bind( &free_test_function, 2, 1 ) ) )

    return 0;
}

// автоматическая регистрация

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE( free_test_function )
{
    BOOST_CHECK( true /* test assertion */ );
}

Unary function based test case (parameterized test case)

BOOST_PARAM_TEST_CASE(test_function, params_begin, params_end)

// пример использования с ручной регистрацией

#include <boost/test/included/unit_test.hpp>
#include <boost/test/parameterized_test.hpp>
using namespace boost::unit_test;

void free_test_function( int i )
{
    BOOST_CHECK( i < 4 /* test assertion */ );
}

test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
    int params[] = { 1, 2, 3, 4, 5 };

    framework::master_test_suite().
        add( BOOST_PARAM_TEST_CASE( &free_test_function, params, params+5 ) );

    return 0;
}

Test case template

Помогает тестировать шаблонные классы и функции. Представляет собой пару макросов:

BOOST_TEST_CASE_TEMPLATE_FUNCTION(test_case_name, type_name)

BOOST_TEST_CASE_TEMPLATE(test_case_name, collection_of_types)

Первый, BOOST_TEST_CASE_TEMPLATE_FUNCTION, создаёт код теста.
Второй, BOOST_TEST_CASE_TEMPLATE, создаёт и регистрирует сам тест.

// пример использования с ручной регистрацией

#include <boost/test/included/unit_test.hpp>
#include <boost/test/test_case_template.hpp>
#include <boost/mpl/list.hpp>
using namespace boost::unit_test;

BOOST_TEST_CASE_TEMPLATE_FUNCTION( my_test, T )
{
    BOOST_CHECK_EQUAL( sizeof(T), 4 );
}

test_suite*
init_unit_test_suite( int argc, char* argv[] )
{
    typedef boost::mpl::list<int,long,unsigned char> test_types;

    framework::master_test_suite().
        add( BOOST_TEST_CASE_TEMPLATE( my_test, test_types ) );

    return 0;
}

// пример использования с автоматической регистрацией

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>
#include <boost/test/test_case_template.hpp>
#include <boost/mpl/list.hpp>

typedef boost::mpl::list<int,long,unsigned char> test_types;

BOOST_AUTO_TEST_CASE_TEMPLATE( my_test, T, test_types )
{
    BOOST_CHECK_EQUAL( sizeof(T), (unsigned)4 )
}

Fixtures

struct MyFixture {
     MyFixture() { i = new int; *i = 0 } // setup
     ~ MyFixture() { delete i; }         // teardown

    int* i;
};

BOOST_AUTO_TEST_CASE( test_case1 )
{
    MyFixture f;

    // do something involving f.i
}

BOOST_AUTO_TEST_CASE( test_case2 )
{
    MyFixture f;

    // do something involving f.i
}
#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>

struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }
    int i;
};

BOOST_FIXTURE_TEST_SUITE( s, F )

BOOST_AUTO_TEST_CASE( test_case1 )
{
    BOOST_CHECK( i == 1 );
}

BOOST_AUTO_TEST_CASE( test_case2 )
{
    BOOST_CHECK_EQUAL( i, 0 );
}

BOOST_AUTO_TEST_SUITE_END()

Что ещё?

The Execution Monitor