TAP(Test Anything Protocol)

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が有るか疑いまいしょう。


→Perl To The Peopleのインデックスページへ戻る

トラックバックURL

このエントリーのトラックバックURL:
http://ash.roova.jp/mt/mt-tb.cgi/84

コメントする