3:型をパラメータ化したテスト
...ちょっと待って。ここまででテストしたのはStackCalc<int>なんだけど、StackCalc<char>とかStackCalc<long>はちゃんと動くのでしょうか。ありとあらゆる型Tに対してStackCalc<T>が正しく動くのを確かめるのは無理なことは分かっちゃいるけど、intの場合だけテストしてOKとするのも気が引けます。今回のケースでは型がなんであれpush/popといったスタック操作に変わりはないけれど、テンプレートの特殊化やってたりするとテストしないわけにはいかんでしょう。それじゃってんでStackCalcTest_int, StackCalcTest_longなどなどのフィクスチャを用意し、代わり映えのしないテストをひたすらコピペで量産するのも能がない。googletestは一連のテストを型を取り換えつつ何度も実行することができます。
templateでフィクスチャを用意し、TYPED_TEST_CASE_P(フィクスチャ名);の一行をオマジナイに追加します:
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されています。
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());
}
これらテストを型可変のテストとして登録し:
REGISTER_TYPED_TEST_CASE_P(StackCalcTest, initialize, push);
最後に、差し替える型のリストをgoogletestに教えてあげます。
// char, int, long をそれぞれ型Tとして // StackCalcTest<T> を作り、テストする。 typedef testing::Types<char, int, long> StackCalcTestTypes; INSTANTIATE_TYPED_TEST_CASE_P(Typed, StackCalcTest, StackCalcTestTypes);
すごいねgoogletest、こんなことができちゃうのね。

