前回と前々回でNUnitによる単体テストについて書きましたが、 実施したテストケースが十分かどうかについては何もわかりません。 理想は全ての場合についてテストする事ですが、これは不可能な場合のほうが多いです。 例えば、前回取り上げたbmi関数で全ての入力を試す事は無理です。 そこで、代表値をピックアップしてテストする事になります。
そのため、テストで全然実行されていない部分も出てくると思います。 この検出を支援するのがカバレッジツールと呼ばれるものです。 以下、NET用のものとして、PartCoverを紹介します。
まず、こちらからダウンロードしてインストールして下さい。 インストールが完了したら、スタートメニューから [すべてのプログラム]-[Gubka Bob]-[PartCover .NET 2]-[PartCover Browser]で起動します。 起動したら、[file]メニューの[Run Target...」を選択して、以下のようなダイアログを表示します。
これでカバレッジを収集するターゲットに関する指定を行います。 今回は具体例として、NUnitからBmiTestを実行してテスト対象のBMI_MVM内のプログラムのカバレッジを収集します。なお、BMIプロジェクトは、D:\FC2_example\BMI 配下にあるものとしていますので、この部分はご自分の環境に読み替えて下さい。
「Executable File」には、実行するプログラムを指定します。 今回の場合、NUnitの実行形式を指定して下さい。 Browseボタンをおして、NUnitのインストールディレクトリのnunit.exeを選択します。
「Working Direcotry」には、作業ディレクトリを指定します。 先ほどの「Executable File」を指定した時にNUnitのディレクトリになっていると思いますが、 BMITestのディレクトリに変更して下さい。
「Working Arguments」には、プログラムへの引数を指定します。 通常、/configでプロジェクトファイルを指定する必要があります。 今回は、BMITestのプロジェクトファイルを指定するので、 /config=D:\FC2_example\BMI\BMITest\BMITest.fsproj になります。
「Rules」には、カバレッジ対象となるものを指定します。 「±[アッセンブリ名]クラス名」の形式で1行に1つづつ指定します。+を指定した場合は対象として追加となり、-がついたものは除外となります(注: +と-は半角)。 アッセンブリ名とクラス名にはワイルドカード*を使用できます。 今回は、対象としたいものの最初がBMIで始まっているので、「+[BMI*]*」と指定しています。
以上の設定が終わったら、「Save」ボタンで設定を保存しておきます。 次回からは、このダイアログの「Load」ボタンで設定を読み込む事が出来ます。
それでは実行してみましょう。「Start」ボタンをクリックします。 NUnitが起動したと思います。 前回の設定で起動されるのでBMITestがテスト対象になっていると思いますが、 そうでなければこれを指定して下さい。 NUnitの「Run」ボタンを押してテスト実行します。 実行が完了したらNUnitを終了します。 PartCastに各アッセンブリ毎にカバレッジ率が表示されます。 前回のテスト内容だと、BMI_MVMでカバレッジは7%となってしまいました。
左側のツリーの「BMI_MVM」−「Bmi」−「Model」とクリックしてみました。 また、メニューバーの「Views」−「View Coverage Details」でソースを出してみました。
BmiModel.fsのmとcmの相互変換用に定義した関数について、 テストしていなかったのがわかります。 このテストケースをBMIModelTest.fsに追加して再実行して、 カバレッジ率を上げてみて下さい。
今回はテストの網羅性をチェックするツールとしてPartCoverを取り上げてみました。 ソースの日本語が文字化けするとか、中間言語レベルでの解析結果のため F#のソースと一致しない部分が出るのでカバレッジ率100%にするのが難しい等の問題もあります (一番の問題はちゃんとしたマニュアルがないことですけど)。 それでも、今回のようにテストし忘れの検出には、十分使えるのではないでしょうか。



