Boost.Testの使い方初歩
Boost.Testの初歩の使い方
参照ページ
単体テストケース
<boost/test/included/unit_test.hpp>
をincludeする前に#define BOOST_TEST_MODULE test-name
でモジュール名を定義し、後はBOOST_AUTO_TEST_CASE()
マクロでテスト関数を定義していきます。BOOST_TEST_MODULE
はBOOST_TEST_MAIN
の意味を包含しており、定義することでmain()
関数の記載を省略できます
#define BOOST_TEST_MODULE test_example #include <boost/test/included/unit_test.hpp> int max(int a, int b) { return a > b ? a : b; } BOOST_AUTO_TEST_CASE(test_max_pos_pos) { BOOST_TEST(max(0, 2) == 2); BOOST_TEST(max(10, 2) == 10); } BOOST_AUTO_TEST_CASE(test_max_pos_neg) { BOOST_TEST(max(0, -2) == 0); BOOST_TEST(max(-10, 2) == 2); } BOOST_AUTO_TEST_CASE(test_max_neg_neg) { BOOST_TEST(max(-5, -2) == -2); BOOST_TEST(max(-20, -21) == -20); }
コンパイルと実行
% clang++ test.cc -o test % ./test Running 3 test cases... *** No errors detected
テスト毎の前処理、後処理
テストケース毎の初期化処理 (setup)と後処理 (teardown)はFixture機能を用いて実現できます。FixtureはC++のstruct
として定義し (class
でもいいですが、通常privateメンバを使う理由がないためstruct
)、そのコンストラクタ、デストラクタに初期化処理と後処理を記載します。また、Fixtureクラスのメンバ変数は各テストケースの中から参照することができます。
テスト関数の定義時はBOOST_AUTO_TEST_CASE
の代わりにBOOST_FIXTURE_TEST_CASE
を使用し、Fixtureクラスを第二引数に指定します
#define BOOST_TEST_MODULE test_example #include <boost/test/included/unit_test.hpp> struct TestFixture { int i; int j; TestFixture(): i(0), j(1) { BOOST_TEST_MESSAGE("setup "); } ~TestFixture(){ BOOST_TEST_MESSAGE("teardown"); } void setup() { BOOST_TEST_MESSAGE("optional setup"); } void teardown() { BOOST_TEST_MESSAGE("optional teardown"); } }; BOOST_FIXTURE_TEST_CASE(test_fix1, TestFixture) { BOOST_TEST(i == 0); BOOST_TEST(j == 1); i++; } BOOST_FIXTURE_TEST_CASE(test_fix2, TestFixture) { BOOST_TEST(i == 0); BOOST_TEST(j == 1); }
% clang++ test.cc -o test % ./test --log_level=message Running 2 test cases... setup optional setup optional teardown teardown setup optional setup optional teardown teardown *** No errors detected
パラメータテスト
パラメータテストはBOOST_PARAM_TEST_CASE
マクロで登録しますが、登録はテストスイート初期化関数 (init_unit_test_suite()
)から行う必要があります。パラメータはイテレータとして定義、開始と終了のポインタを登録します
#include <boost/test/included/unit_test.hpp> #include <boost/test/parameterized_test.hpp> using namespace boost::unit_test; int increment(int i) { return i + 1; } void test_increment(std::pair<int, int> param) { BOOST_TEST(increment(param.first) == param.second); } test_suite* init_unit_test_suite(int, char**) { // 入力値と期待値のペア std::vector<std::pair<int, int>> params = {{1, 2}, {10, 11}, {100, 101}}; framework::master_test_suite().add( BOOST_PARAM_TEST_CASE(&test_increment, params.begin(), params.end())); return 0; }
テンプレートのパラメタ化
またBOOST_AUTO_TEST_CASE_TEMPLATE
マクロにより、テンプレートのパラメータ化も可能です。テストするテンプレートの値を tuple<param1, param2, param3, ..>
として定義し、マクロに入力します
template<class T> T min(const T& a, const T&b) { return a > b? b : a; } typedef std::tuple<int, double> test_types_tuples; BOOST_AUTO_TEST_CASE_TEMPLATE(test_min_fn, T, test_types_tuples) { T a = 2; T b = 3; BOOST_TEST(min(a, b) == a); }
最近のコメント