Thursday, December 22, 2011

phpt 形式による回帰テスト

php でのテストツールとして、単純に出力結果と比較する .phpt 形式というフォーマットがあります。

PHPT - Test File Layout
http://qa.php.net/phpt_details.php

以下は php の配布ソースに含まれている tests/basic/001.phpt です。

--TEST--
Trivial "Hello World" test
--FILE--
<?php echo "Hello World"?>
--EXPECT--
Hello World

このような .phpt 形式のファイルを pear コマンドを使ってテストできます。

$ pear run-tests tests/basic/001.phpt
Running 1 tests
PASS Trivial "Hello World" test[tests/basic/001.phpt]
TOTAL TIME: 00:00
1 PASSED TESTS
0 SKIPPED TESTS

# ディレクトリ指定でまとめて行うこともできます。
$ pear run-tests tests/basic
...

テストに失敗した場合には .phpt ファイルと同じディレクトリに .diff .exp .log .out .php という結果ファイルと、カレントディレクトリに run-tests.log というファイルが作成されます。

$ pear run-tests path/to/fail/001.phpt
Running 1 tests
FAIL Trivial "Hello World" test[path/to/fail/001.phpt]
...

$ ls .
run-tests.log

$ ls path/to/fail/001.*
001.diff 001.exp 001.log 001.out 001.php 001.phpt

テストをパスするように修正し、再度 run-tests を実行するとこれらの結果ファイルは削除されます。

つまり .phpt ファイルと同名のこれらと同じ拡張子のファイルを作成していると、成功時は削除、失敗時は上書きされてしまうので注意しましょう。

EXPECT セクションの記述が面倒ですが、*.diff *.log を確認しながら、テスト対象のコーディングを行っていき、実装完了後に、*.out の内容を EXPECT セクションに張り付ければよいです。

カレントディレクトリでテスト実行したのち、期待値との差分を確認するワンライナーです。

$ pear run-tests .; find . -name '*.diff' | xargs more