これは CCUnit を使い始めるにあたって、 理解の助けとなるような短いクックブックです。
[see also English documents]
CCUnit を使ったテストは自動的に実行することができます。 CCUnit のテストは簡単にセットアップすることができ、 一度テストを書いてしまえば、 いつでもプログラムの品質を信頼できるものに保つことができるでしょう。
簡単なテストを作るには、次のようにします。
値をチェックしたい場合は、 CCUNIT_ASSERT(bool) を呼び出して、 テストが成功するなら真を返すような真偽値を渡します。
ASSERT 関係のマクロは他にも ASSERT マクロにリストしてあります。
例えば、簡単な複素数のライブラリのテストを例にとってみましょう。 (ここで使用するサンプルプログラム は examples/complex ディレクトリにあります。) 複素数を初期化することができたかをテストしたり、 二つの複素数が等しいかをテストしたりします。
この二つのテスト関数をまとめてひとつのテストケースにして実行することができます。
必要なヘッダファイルをインクルードします。
まずテストケースにメモリを割り当てます。
そしてテストケースにテスト関数を登録します。 表明 (ASSERT) が失敗した時に表示するための関数名と関数の説明を一緒に指定しています。
テストケースを実行し、 結果を取り出します。
割り当てたメモリを解放し、 結果を返します。
ここまでのサンプルコードは、examples/complex ディレクトリの testComplex.c, runTestCase.c にあります。
コンパイルおよび実行するには、次のようにします。
テストケースが実行されると、 指定したテスト関数が呼び出されます。 これはまだあまり便利ではありません、 なぜなら、診断が表示されないからです。 通常はテストの実行 で結果を表示します。
テストを実行したときに、どうやってその結果を集めたら良いでしょうか。 テストケースはテスト関数の実行結果 TestFailure を TestResult に格納します。 同時にテストの実行状況を TestRunner に通知します。
一つテストケースを書いたら、 それを実行したいと思うでしょう。 CCUnit の TestRunner は、 テストケースをテストスーツにまとめて実行し結果を表示します。
TestRunner を使用するには、 例えば runTestCaseRunner.c でテストのためのファイルのヘッダをインクルードします。
まず TestSuite を作成し、 それに TestCase を登録します。
そして ccunit_runTestRunner(CCUnitTestRunner*, CCUnitTestSuite *) を実行します。
割り当てたメモリを解放します。 ただし、testCase は suite に登録してあるので、 suite を解放する時に一緒に解放されます。 そのため testCase はここで解放する必要がありません。 解放しようとすると Bus error などになりますので注意してください。
ここまでのサンプルコードは、examples/complex ディレクトリの runTestCaseRunner.c にあります。
コンパイルおよび実行するには、次のようにします。
TestRunner はテストを実行します。 もしすべてのテストがパスすれば、その情報のメッセージが表示されます。 上の例では、最初の「..」は実行したテストケースです。 実行する直前に「.」が出力されます。 全てのテストケースの実行が終了すると、 実行にかかった時間と実行したテストケースの数が表示されます。
どれかが失敗すれば、それについて以下のような情報が表示されます。
試しに testComplex.c のテストケースでわざと間違えてみましょう。
この例ではテストケースを 2 個実行して、 ひとつのテストケースで失敗していることがわかります。 最初の「 .F.」では、 ひとつ目のテストケースが失敗していることをあらわしています。
また上述のように、 失敗したファイル名、行番号、テストケースの名前 (complex new test)、 表明した条件の文字列 (1.1 == c10_1->imaginary) が表示されます。
これは大変単純なテストです。 通常、 たくさんの小さなテスト関数を作って、 同じようなデータの集まりを使ってテストを行うでしょう。 つまり各テスト関数共通のグローバル変数を使うことになります。
もし複数のテスト関数があるなら、 同じデータの集まりをいくつか使うのではないでしょうか。
テストは中身のわかっているデータの集まりを前提として実行される必要があります。 テストを書いていると、 実際にテストするコードよりも、 値をセットアップするコードを書く方に、 より時間をかけていることがよくあります。
例えば前節のサンプルコードでは、 いくつかの複素数を割り当てたり解放したりしています。
多くの場合、いくつかの異なったテストのために同じグローバル変数を使うことができます。 それぞれのテスト関数を実行する前に変数を初期化し、 値を調べることになるでしょう。 そしてテストが終わったら後始末することになります。
setUp と tearDown 関数はそのような場合に使用することができます。
もし各テストに共通のグローバル変数があれば、 次のようにすることになります。
グローバル変数を定義します。
複素数を割り当てる setUp 関数を書きます。
割り当てたメモリを解放する tearDown 関数を書きます。
テスト関数を書きます。
setUp と tearDown を登録します。 この時、関数の名前が setUp/tearDown で始まっていなければなりません。
テストケースを実行し、 結果を返します。
ここまでのサンプルコードは、examples/complex ディレクトリの testComplexSetup.c, runTestCaseSetup.c にあります。
コンパイルおよび実行するには、次のようにします。
前の節ではテストごとに毎回初期化を行っていました。 しかし、 一回だけ初期化を行って、 複数のテストを実行したい場合があります。 そしてテストが全て終わったときだけ後始末のコードを実行するような場合があります。
そのためにはテストケースに setUpBeforeClass, tearDownAfterClass 関数を登録します。 すると次のような順序でテスト関数が実行されます。
複数のテストを全部一度に実行することができるように準備するには、 どのようにしたらいいでしょうか? いくつかのテストを作ったら、 それらをスーツに整理します。
CCUnit はいくつもの TestFuncs を一緒に実行する TestSuite モジュールを提供します。 テストスーツを実行する方法はすでに前の方で示してあります。
二つ以上のテストを含む一つのスーツを作るには、次のようにします。
テストケースを二つ生成し、それぞれにテスト関数を登録します。
テストスーツを生成し、 テストケースを登録します。
テストランナーを生成しテストを実行します。
ここまでのサンプルコードは、examples/complex ディレクトリの runTestSuite.c, testComplexSetup.c, testComplexArith.c にあります。
コンパイルおよび実行するには、次のようにします。
TestSuites は TestCases を含むだけではありません。 TestSuites 自身を含むこともできます。 例えば、あなたはあなたのコードに TestSuite を作ることができ、 そして私は私のスーツ を作ることができます、 そして私達は両方ともを含んでいる TestSuite を作って、 一緒にそれぞれのスーツを実行することができるのです。
お気づきのように、 テストケースにテスト関数を登録したり、 テストスーツにテストケースを登録したりする作業は、 反復的で間違いやすいものです。
例えば testComplexSetup.c には test_complex_to_string() というテスト関数が定義されていますが、 今までの説明では無視されていてテストケースには登録されませんでした。
このような登録漏れをなくすために テストスーツの生成 の関数とコマンドは、 テストケースやテストスーツを登録する関数の実装を、 自動的に作成することができます。
そのためには、テストケースを書くファイルを次のように作ります。
最初に、テストスーツを宣言します。 これは javaDoc スタイルのコメント内にテストスーツの名前を記述します。 javaDocスタイルのコメントとは C スタイルのコメントブロックの開始が 二つのアスタリスク ** になっているものです。
次に、 テストケースを定義します。 テストケースは、 javaDoc スタイルのコメントに書かれたテストケースの名前の宣言と テストケースの終了の宣言で囲まれた、グローバル変数と関数の集まりです。 ひとつのファイルに複数のテストケースを定義できます。
テスト関数は名前が test で始まっていなければなりません。 また各テスト関数の前には javaDoc スタイルのコメントの中にテスト関数の説明を書くことができます。 コメントが書かれていなければ、 テスト関数の名前が関数の説明として登録されます。
特別なテスト関数として setUp, tearDown, setUpBeforeClass, tearDownAfterClass があります。 その名前からわかるように、 以前に説明したテストケースの機能の関数として働きます。 それぞれそのような名前で定義してください。
スーツ作成関数のコードを生成するには、 ccunit_makeSuiteツールを実行します。
自動的に作成される TestSuite を作成する関数は、 デフォルトでは ccunit_suite です、 しかし ccunit_makeSuite コマンドの -f オプションで別の名前に変えることもできます。
自動生成したコードを利用するには次のようにします。
生成した関数のプロトタイプを宣言します。 引数の char* name を忘れないようにしてください。
生成した関数を呼び出してテストスーツを取り出します。
テストランナーで実行します。
ここまでのサンプルコードは、examples/complex ディレクトリの runTestSuiteAuto.c, testComplexSetup.c にあります。
コンパイルおよび実行するには、次のようにします。
テストケースソースコードは次の疑似 BNF によってフォーマットされなくてはなりません。
以上で作成したサンプルプログラムは examples/complex ディレクトリにあります。
|
|
hosts this site. | Send comments to: CCUnit Developer |
CCUnitに対してSat Jul 13 2013 15:09:24に生成されました。
1.8.1.1
|