昨日、C言語用の単体テストフレームワークである Cutterの1.0.3がリリースされま した。
実は、Cutter-1.0リリースから3回リリースしていま す。1.0.0以降はマイクロバージョンだけを上げていますが、新しく 追加された機能はマイクロとは思えません。例えば、Windows (MinGW)でのビルド に対応、GStreamer のサポートなどといった機能が含まれていました。過去のリリースに ついてはNEWS を見てください。
Cutterとは
Cutterはテストの書きやすさ・テスト結果からのデバッグのしやす さを重視したC言語用の単体テストフレームワークです。今回のリリー スからCutterの機能を説明したページを用意 しました。
データ駆動テスト対応
同じテストを条件を変えて実行したい時があります。例えば、以下 のような場合です。
- 複数の入力パターンがあり、それらを網羅的にテストする場合
- 複数のバックエンドを抽象化し、どのバックエンドを利用して いる場合でも同じインターフェイスで扱えるライブラリをテス トする場合(Cでのcairo、Perl/Ruby/GaucheなどでのDBI、 RubyでのActiveRecordなど)
このような場合、必要な分だけテストコードをコピー&ペーストして テストを作成するよりも、以下のように書けるとテスト記述・管理 のコストを下げることができます。
- テストは1つだけ用意
- テスト条件、つまり、入力データを複数用意
- 各入力データに対してそれぞれテストを実行
このようなテストの方法をデータ駆動テストと呼びます。
データ駆動テストではデータの用意の仕方にはいくつかの方法があ り、それぞれ利点があります。
-
データベースに保存された入力データを利用
-
大量のデータを用意したり、データを一括変更できるなどデー タ管理機能が豊富
-
CSVなど表形式の入力データを利用
-
Excelなどを利用して入力データを用意することができる
-
プログラム内で入力データを生成
-
動的にデータを用意するので、柔軟にデータを生成すること ができる。例えば、文字'a', 'b', 'c'を使って作られる長さ が3の文字列すべて("abc", "acb", ...)、などというデータ を用意できる。
Cutterでは今回のリリースで、最後の「プログラム内で入力データ を生成」する方法をサポートしました。使い方は以下の通りです。
- data_XXX(void)を定義
- data_XXX()中でcut_add_data()を使ってデータを登録
- test_XXX(const void *data)を定義
- dataにはcut_add_data()で登録したデータの1つが渡る
今までどおり、関数を定義するだけでよく、他のC言語用の単体テ ストフレームワークにあるような「登録処理」のようなことは必要 ありません。Cutterが自動で見つけてくれます。
コードにすると以下のようになります。
void
data_XXX(void)
{
cut_add_data("データ1の名前", data1, data1_free_function,
"データ2の名前", data2, data2_free_function,
"データの例", strdup("test data"), free,
...)
}
void
test_XXX(const void *data)
{
/* dataはdata_XXX()で登録した「data1」か「data2」
か「strdup("test data")」。test_XXX()はそれぞれに対
して1回ずつ、計3回呼ばれる。
*/
cut_assert_equal_string("test data", data);
}
具体例は cut_add_data() を見てください。
まとめ
Cutter 1.0.3ではデータ駆動テストをサポートし、より簡単にテス トがかけるようになりました。