SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Google製のC++ Unit Test Framework「Google Test」を使ってみる

4:値をパラメータ化したテスト

 googletestのすごいトコをもう一つ。例えば足し算のテスト:

list-13
class StackCalcTest : public testing::Test {
public:
  StackCalcTest() : sc(5) {}
protected:
  StackCalc<int> sc;
};

TEST_F(StackCalcTest,add) {
  sc.clear().push(0).push(0).add();
  EXPECT_EQ(0, sc.top());
  sc.clear().push(-1).push(2).add();
  EXPECT_EQ(1, sc.top());
}

 こんなカンジでテキトーな値の組を(x,y)として、ちゃんとx+yを求めてくれるかテストします。ここんとこ、もっとたくさんのテストを楽に書きたい、例えば{-3, -2, ... 2, 3}と{-2, 0, 3}からそれぞれ1つずつ選んだ組(x, y)についてテストしたい、と。あるいはフィクスチャのSetUp()でいろんなパターンで初期化し、正しく動くことを確認したいとか。intの2つ組をコロコロ取り換えて足し算のテストをやってみましょう。

 まずフィクスチャの基底クラスにtesting::WithParamInterface<パラメータ型>を追加します。

list-14
class StackCalcTest : public testing::Test, public testing::WithParamInterface<tuple<int,int>> {
public:
  StackCalcTest() : sc(5) {}
  virtual ~StackCalcTest() {}
protected:
  virtual void SetUp() {}
  virtual void TearDown() {}
  StackCalc<int> sc;
private:
};

 TEST_P(フィクスチャ名,テスト名) { ... }でテストを書きます。値パラメータはGetParam()で取り出すことができるので:

list-15
TEST_P(StackCalcTest,add) {
  int x = get<0>(GetParam());
  int y = get<1>(GetParam());
  sc.push(x).push(y).add();
  ASSERT_EQ(x+y, sc.top());
}

 値パラメータを生成する部分は:

list-16
INSTANTIATE_TEST_CASE_P(Operations, StackCalcTest,
                        testing::Combine(testing::Range(-3,4),testing::Values(-2,0,3)));

 testing::Range(-3,4)は-3以上4未満つまり{-3,-2,-1,0,1,2,3}、testing::Values(-2,0,3)は{-2,0,3}、そしてtesting::Combine()は与えられた集合の直積(デカルト積)すなわち各集合から要素を1つずつ選んで得られるすべての組を生成します。この例では足し算のテストが7*3=21通り行われます。GetParam()はフィクスチャ内のSetUp()でも使えるので、さまざまな前準備を仕掛けてテストできます。

おわりに

 以上、googletestの使い方をざっくりと紹介しました。googletestには他にもさまざまな機能が盛り込まれています(サンプル・コードには出力部を差し替えてHTML形式のレポートを吐かせるサンプルを納めてあります)。

 単体テストって正直メンドくさいんですよね。決して難しいわけじゃない、むしろif文すらろくに出てこないような単調でのっぺりしたテストが淡々と並びます。テスト・コードは疑う余地のないほどに単純じゃなきゃいけないのですよ。テスト・コードはテストできない、テストしなきゃならんよな、ややこしいテスト・コードでは検証結果が信じられませんから。

 googletestはそこんとこ分かってらっしゃる。テスト・コードがなるだけ単純に/簡単に/短く書けるよう、さまざまな気配りが詰め込まれているように思えます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6656 2012/08/02 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー