SHOEISHA iD

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

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

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

特集記事

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

3:型をパラメータ化したテスト

 ...ちょっと待って。ここまででテストしたのはStackCalc<int>なんだけど、StackCalc<char>とかStackCalc<long>はちゃんと動くのでしょうか。ありとあらゆる型Tに対してStackCalc<T>が正しく動くのを確かめるのは無理なことは分かっちゃいるけど、intの場合だけテストしてOKとするのも気が引けます。今回のケースでは型がなんであれpush/popといったスタック操作に変わりはないけれど、テンプレートの特殊化やってたりするとテストしないわけにはいかんでしょう。それじゃってんでStackCalcTest_int, StackCalcTest_longなどなどのフィクスチャを用意し、代わり映えのしないテストをひたすらコピペで量産するのも能がない。googletestは一連のテストを型を取り換えつつ何度も実行することができます。

 templateでフィクスチャを用意し、TYPED_TEST_CASE_P(フィクスチャ名);の一行をオマジナイに追加します:

list-10
template<typename T>
class StackCalcTest : public testing::Test {
public:
  StackCalcTest() : sc(5) {}
  virtual ~StackCalcTest() {}
protected:
  virtual void SetUp() { sc.throw_exception(); }
  virtual void TearDown() {}
  StackCalc<T> sc;
private:
};

TYPED_TEST_CASE_P(StackCalcTest);

 各テストはTYPED_TEST_P(フィクスチャ名,テスト名) { ... }とします。テストの中で差し替えられる型はTypedParamにtypedefされています。

list-11
TYPED_TEST_P(StackCalcTest,initialize) {
  ASSERT_EQ(0, sc.size());
  ASSERT_TRUE(sc.empty());
}

TYPED_TEST_P(StackCalcTest,push) {
  TypeParam val1(3);
  sc.push(val1);
  ASSERT_FALSE(sc.empty());
  EXPECT_EQ(1, sc.size());
  EXPECT_EQ(val1, sc.top());
  TypeParam val2(4);
  sc.push(val2);
  ASSERT_FALSE(sc.empty());
  EXPECT_EQ(2, sc.size());
  EXPECT_EQ(val2, sc.top());
}

 これらテストを型可変のテストとして登録し:

list-12
REGISTER_TYPED_TEST_CASE_P(StackCalcTest, initialize, push);

 最後に、差し替える型のリストをgoogletestに教えてあげます。

list-13
// char, int, long をそれぞれ型Tとして
// StackCalcTest<T> を作り、テストする。
typedef testing::Types<char, int, long> StackCalcTestTypes;
INSTANTIATE_TYPED_TEST_CASE_P(Typed, StackCalcTest, StackCalcTestTypes);

 すごいねgoogletest、こんなことができちゃうのね。

次のページ
4:値をパラメータ化したテスト

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

特集記事連載記事一覧

もっと読む

この記事の著者

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー