Boost.Testの使い方初歩

Boost.Testの初歩の使い方


参照ページ


単体テストケース

<boost/test/included/unit_test.hpp>をincludeする前に#define BOOST_TEST_MODULE test-nameでモジュール名を定義し、後はBOOST_AUTO_TEST_CASE()マクロでテスト関数を定義していきます。BOOST_TEST_MODULEBOOST_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);
}

おすすめ