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);
}
最近のコメント