Perlには、proveコマンドが有り、テストコードが出力した結果を集約してレポートを作成してくれます。
この時、proveコマンド(正確にはそのバックエンドで動いている各種Test::Harnessモジュール群)と、各テストコードの結果を結びつけるプロトコルがTAP(Test Anything Protocol)です。
プロトコルと言っても、正式な規格書は無く、「Test::Harness」モジュールの動作自体が規格である、という面が強いようです。ただし、内容はそんなに複雑ではなく、最初にテスト項目数を宣言し、それに続いてテスト項目毎に「ok」又は「not ok」を出力するだけです。
実際の例です。以下のコードをエディタに打ち込んで、「Sample.t」の名前で保存します。
#!/usr/bin/perl
print "1..2\n";
print "ok 1\n";
print "not ok 2\n";
次に作ったファイルをproveコマンドへ引き渡します。
$ prove Sample.t
Sample.t .. Failed 1/2 subtests
Test Summary Report
-------------------
Sample.t (Wstat: 0 Tests: 2 Failed: 1)
Failed test: 2
Files=1, Tests=2, 0 wallclock secs ( 0.02 usr + 0.01 sys = 0.03 CPU)
Result: FAIL
proveコマンドが、テストコード「Sample.t」のテスト結果をサマリーしてくれています。
標準出力に出力されたTAPに関係する出力を拾って、集計してくれているのです。実際のテストでは当然テスト結果によって、okとnot okを出力し分ける事で、個々のテスト結果を出力します。
ではproveコマンドの出力パターンを見てみましょう。
パターン1:テスト成功
#!/usr/bin/perl
print "1..2\n";
print "ok 1\n";
print "ok 2\n";
結果は以下の通り。テストは無事成功です。
$ prove test.t
test.t .. ok
All tests successful.
Files=1, Tests=2, 0 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU)
Result: PASS
パターン2:テストは成功、ただしテストコードは正常終了しない
#!/usr/bin/perl
print "1..2\n";
print "ok 1\n";
print "ok 2\n";
die;
結果は以下の通り。テストは無事成功しましたがテストコードが正常終了以外のexit code(この場合は255)を返したので、テスト全体としては失敗。wait statusと呼ばれる子プロセスが親プロセス(この場合はprove)へ返す値が正常終了を示す値ではなかったので、テスト失敗です(wstatの0xff00の前半がtest.tが返したexit codeを示す)。
$ prove test.t
test.t .. 1/2 Died at test.t line 8.
test.t .. Dubious, test returned 255 (wstat 65280, 0xff00)
All 2 subtests passed
Test Summary Report
-------------------
test.t (Wstat: 65280 Tests: 2 Failed: 0)
Non-zero exit status: 255
Files=1, Tests=2, 0 wallclock secs ( 0.02 usr + 0.01 sys = 0.03 CPU)
Result: FAIL
パターン3:テストは失敗、ただしテストコードとしては正常終了
#!/usr/bin/perl
print "1..2\n";
print "ok 1\n";
print "not ok 2\n";
テスト項目が2件有って、1件失敗した事、失敗したテスト項目番号が2番である事が分かります。
$ prove test.t
test.t .. Failed 1/2 subtests
Test Summary Report
-------------------
test.t (Wstat: 0 Tests: 2 Failed: 1)
Failed test: 2
Files=1, Tests=2, 0 wallclock secs ( 0.02 usr + 0.01 sys = 0.03 CPU)
Result: FAIL
まずはテストコードが「Dubious, test returned 255」を出力した時は、モジュールか、テストコードにコンパイルエラーが有るか、どこかにevalでトラップされない素のdieが有るか疑いまいしょう。

コメントする