テストを操作とパラメータに分ける
自動化されたテストを作成する際には「どれくらいテストを再利用出来るのか?」が重要になります。皆さんがxUnit系のテスティングフレームワークを使い出した時には下記のようにテストを書くと思います。
TEST(TestCaseHoge, TestFoo) {
ASSERT_TRUE( FuncFoo(0) );
ASSERT_TRUE( FuncFoo(1) );
ASSERT_FALSE( FuncFoo(-1) );
}
FuncFooに対して三つのパラメータをテストしています。この場合はひとつの関数に3つのパラメータなのでスッキリしていますが、開発が進むと、だんだん次のようになって行きます。
TEST(TestCaseHoge, TestFoo) {
bool f;
int b;
float z;
f = FuncFoo(0);
ASSERT_TRUE( f );
b = FuncBar(0);
ASSERT_EQ( 0,b );
z = FuncBaz( f,b )
ASSERT_EQ( 0.0f,z );
f = FuncFoo(-1);
ASSERT_FALSE( f );
b = FuncBar(1);
ASSERT_EQ( 1,b );
z = FuncBaz( f,b )
ASSERT_EQ( 1.0f,z );
.
.
.
}
もうゴチャゴチャして危険な感じがしてきました。もう、こうなくるとテストを書きたくなくなります。
しかし、よく見ると二番目の複雑なテストも三つの関数の呼び出しに対して、すべて同じように二つのパラメータを与えているだけです。これは次のようにまとめられます。
AllFunc(int arg1,int are2,bool test1,int test2,float test3)
{
bool f;
int b;
float z;
f = FuncFoo(arg1);
ASSERT_EQ( test1,f );
b = FuncBar(arg2);
ASSERT_EQ( test2,b );
z = FuncBaz( f,b )
ASSERT_EQ( test3,z );
}
TEST(TestCaseHoge, TestFoo) {
AllFunc( 0,0,true,0,0.0f);
AllFunc(-1,1,true,1,1.0f);
.
.
.
}
あとは各テストに必要なパラメータを、テーブルで持ったり、スプレッドシートから読み込んでもいいでしょう。ここで重要なのは「テストに使用する操作」と「テストに使用するパラメータ」を分けて管理する事です。これによりテストがより再利用しやすくなります。
テストに使用するパラメータを自動生成する
テストは再利用しやすくなりましたが、やはりテストに使用するパラメータは、自分で用意しなければなりません。何も無い所からはパラメータを作成できないので、完全に自動生成は出来ないのですが、テストに使用するパラメータの数とその種類を設定するだけで、自動的にテストに使用するパラメータのバリエーションを作成してくれるツールがあります。
その「組み合わせテストケース作成ツール」と呼ばれるツールの中で、有名なソフトとして「PICT」があります。これ自体はコマンドラインツールでテキストファイルを入力してテキストファイルを出力するツールですが、「PICT」を使いやすくしたフロントエンドアプリケーションとして「PictMaster」も有名です。
このツールを使うと、次のようなパラメータの組み合わせを設定するだけで、実際にテストに使用するパラメータの組み合わせを作成してくれます。
テストしたいパラメータの組み合わせ
「パラメータ1」 (パターン1) 0, (パターン2)-1
「パラメータ2」 (パターン1) 0, (パターン2)1
テストに使用するパラメータの組み合わせ
「パラメータ1」0,「パラメータ2」0
「パラメータ1」0,「パラメータ2」1
「パラメータ1」-1,「パラメータ2」0
「パラメータ1」-1,「パラメータ2」1
これで、パラメータ自体も自動的に生成できるようになりました。
「PICT」はもともとはパラメータの組み合わせが爆発した時に、効率よくテストを間引くためのツールになります。何個のパラメータの組み合わせまでを網羅するのか、パラメータの種類同士でテストする必要のない組み合わせはどれなのか、を設定する事によって、効率よく組み合わせを間引くことができます。
テストケースの完全自動生成に向けて
ここまで来れば、自動的にテストケースを生成する目処が着いたのではないでしょうか?
環境を限れば、もっと便利にもっと自動的にテストケースを作成するツールは存在します。しかしゲーム制作に使用する環境では使えないツールがほとんどだと思います。
ただ環境が揃うのを待つよりは、全自動ではなくても、出来るところからテストケースの自動生成にチャレンジするのは良いのではないでしょか。