この前も早朝にこのネタをやっていた覚えがあるのは気のせい・・・?
ともあれ、今回はテストスイートの作り方。
まず単なるテストスィートから。
「手動で一つのテストスィートを作成するためにはマクロ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とか)渡したら、その関数に書かれたテスト処理を実行するテストケースを返す。
ふぅ・・・、なんとか書いた。(順番が無茶苦茶になったけど・・・)