What is it, naokirin?

Boostライブラリによるテスト (3)

この前も早朝にこのネタをやっていた覚えがあるのは気のせい・・・?


ともあれ、今回はテストスイートの作り方。


まず単なるテストスィートから。

手動で一つのテストスィートを作成するためにはマクロBOOST_TEST_SUITを使用してください:

BOOST_TEST_SUITE(test_suite_name)

BOOST_TEST_SUITEは、クラスboost::unit_test::test_suiteのインスタンスを作成し、作成されたインスタンスポインターを返します。あるいは、クラスboost::unit_test::test_suiteのインスタンスを自身で作成することができます。


とのこと。(Boostのマニュアル直訳)

例として

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

// テストケース
void test_case1() { /* : */ }
void test_case2() { /* : */ }
void test_case3() { /* : */ }
void test_case4() { /* : */ }

// 初期化されたマスターテストスィートのインスタンスを返す関数
// (今回は0が返ってくるだけ)
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;
}


となっている。
つまり、BOOST_TEST_SUITE("テストスィート名")でインスタンスを作成し、そのインスタンスのメンバadd()でテストケース追加ということらしい。

気をつけるのは名前空間使ってることくらいかな。



次は自動化されたテストケースをまとめてテストスィートにする方法。

前回のようなBOOST_AUTO_TEST_CASE()を使ったテストをテストスィートに入れるためにマクロBOOST_AUTO_TEST_SUITE(test_suite_name)とBOOST_AUTO_TEST_SUITE_END()があるらしい。

使い方は例を見た方が早い。

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

BOOST_AUTO_TEST_SUITE( test_suite1 )

BOOST_AUTO_TEST_CASE( test_case1 )
{
    /*  */
}

BOOST_AUTO_TEST_CASE( test_case2 )
{
    /*  */
}

BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE( test_suite2 )

BOOST_AUTO_TEST_CASE( test_case3 )
{
    /*  */
}

BOOST_AUTO_TEST_CASE( test_case4 )
{
    /*  */
}

BOOST_AUTO_TEST_SUITE_END()



といった感じ。これでtest_suite1にtest_case1とtest_suite2、test_suite2にtest_case3とtest_suite4が入っている状態になる。


あとはマスターテストスィートだけど、これはまあいっか。あとで必要そうなら読むことにしよう。



と、ここまで書いて「あっ、テストケースの作り方についてちゃんと書いてないや・・・」ということに気がついた。

BOOST_TEST_CASE(test_function)というマクロでtest_functionに関数のアドレス(&test_caseとか)渡したら、その関数に書かれたテスト処理を実行するテストケースを返す。

ふぅ・・・、なんとか書いた。(順番が無茶苦茶になったけど・・・)