boost::test

トップページ > その他 >

abstract

必要なヘッダ
<boost/test/minimal.hpp> 最小セット(ライブラリのリンク等不要で簡単なテストが書ける),
<boost/test/unit_test.hpp> 単体テスト,
他必要に応じて色々
出来ること
C++用Testingフレームワーク
リファレンス
en

sample

#include <vector>
#include <boost/test/unit_test.hpp>
using namespace std;
using namespace boost::unit_test_framework;

// 
// STLのvectorクラステンプレートのテストコードを書いてみました。
// 

void push_back_test()
{
	vector<int> v;
	BOOST_CHECK( v.empty() );
	BOOST_CHECK_EQUAL( v.size(), 0 );

	v.push_back( 1 );
	v.push_back( 2 );
	BOOST_CHECK( !v.empty() );
	BOOST_CHECK_EQUAL( v.size(), 2 );
	BOOST_CHECK_EQUAL( v.front(), 1 );
	BOOST_CHECK_EQUAL( v.back(),  2 );
}

void at_test()
{
	vector<char> vi( 100, 'a' );
	BOOST_CHECK_THROW( vi.at(100), std::exception );
}

void construct_test()
{
	vector<int> vi( 100, 3 );
	BOOST_CHECK_EQUAL( vi.size(), 100 );
	BOOST_CHECK_EQUAL( vi[10], 3 );

	vector<double> vd( vi.begin(), vi.end() );
	BOOST_CHECK_EQUAL( vd.size(), 100 );
	BOOST_CHECK_EQUAL( vd[99], 3.0 );
}

// 
// テストケースをここでtest_suiteに追加して返すと、
// あとはライブラリ側でテストを走らせてくれます。
// 

test_suite* init_unit_test_suite( int argc, char* argv[] )
{
	test_suite* test = BOOST_TEST_SUITE( "std::vector test" );
	test->add( BOOST_TEST_CASE( &construct_test ) );
	test->add( BOOST_TEST_CASE( &at_test ) );
	test->add( BOOST_TEST_CASE( &push_back_test ) );
	return test;
}

実行例

コンパイル時にはライブラリのリンクが必要。成功すると、次のように表示されます。

C:\temp> cl test.cpp libboost_unit_test_framework.lib
C:\temp> test
Running 3 test cases...

*** No errors detected

テストに失敗があると、次のような表示になります。

Running 3 test cases...
test.cpp(24): error in "at_test": exception std::exception is expected

*** 1 failure detected in test suite "std::vector test"

etc

コードを書く度に、その動作を検証するテストコードも同時に用意しておく (あるいはむしろ、本体より先にテストコードを書いておく…)という習慣は、 バグの早期発見に役立つと言われています。 で、このテストコードを書いたり繰り返し実行したりする際のサポートとなる フレームワークは、C++では CppUnit などが有名どころ。boostのこのtestライブラリも、 要するにそういうフレームワークの一つです。

presented by k.inaba   under NYSDL.