PHPでTAP(Test Anything Protocol)を使う

TAP(Test Anything Protocol)とは、テストを簡潔に記述するための書き方(プロトコル)のことです。

プロトコルというと難しそうですが、実際はとても簡単。標準出力に、以下のような出力を行うプログラムを作成すればよいのです。

要点は
(1) 最初の行に、テストの件数を表示する
(2) 2行目以降に、テスト結果(ok/not ok)・テスト番号・説明を表示する
以上。

なお、2行目以降の必須項目はテスト結果(ok/not ok)だけです。
テスト番号は無くてもエラーにはならないものの、あったほうがよい(実行予定テストの総数と、実際に走ったテストの総数が異なっている時に警告が出る)。
説明は、後で読む人のためにも書いておいたほうがよいです。

それでは実際に書いてみます。

tap.php

fizzbuzz.php

fizzbuzz.t


TAPに従って書かれたテストを実行するには、proveというコマンドを使います。Perlの実行環境があるなら、インストールされているはず(Mac OS Xには標準で入っていますし、大抵のLinix/Unixには入っているでしょう)。

「prove fizzbuzz.t」を実行すると、「fizzbuzz.t .. Failed 7/15 subtests」と表示されます。15回のテストのうち、7回失敗したということです。「php fizzbuzz.t」を実行してみると、以下のような表示がされます。

not ok 3 – 三の倍数
# got:      3
# expected: fizz

最初のfizzbuzz.phpでは、fizzbuzzのロジックを組み込んでいなかったので、テストにこけるのは当たり前。fizzbuzz.phpの中身を差し替えましょう。

fizzbuzz.php

今度は、fizzbuzzのロジックをちゃんと組んであるので、テストに通るはずです。再度「prove fizzbuzz.t」を実行すると…「fizzbuzz.t .. ok」と表示されました!

このように、TAPを利用したテストは、*Unit等を使用したテストに比べ、(1) テストが簡単に書ける (2) 導入が非常に簡単である という特徴があります。

本格的なプロジェクトであれば、PHPUnit等のテスティングフレームワークを導入したほうがいいと思いますが、小規模なスクリプトのテストならTAPで十分でしょう。

<参考>

「同じコード」の同じって何さ – TAPのススメ
:tap.phpは、こちらのtap.rbのロジックをPHPで書き直し + 一部改変したものです。
TAP Specification:TAPの仕様

コメントを残す