PHPUnitとPhingを併用することでユニットテストの結果レポートをHTML形式で生成することが出来ますが、テストメソッドの名前に注意しないと何のテストを実施したのか分からなくなってしまいます。
例えば、PHPUnitポケットガイドのArrayTestを参考に作成したテストケースを実行してレポートを見てみます。(画像クリックで拡大)
極端な例ですが、3番目のテストメソッドが「test0001」という無意味な名前になっているため何のテストなのか分かりません。ただ、テスト項目が増えた場合、テストメソッドの名前だけで区別させるのは大変かもしれません。
そこで、テストメソッドのコメントにテストケースの注釈を記述して、それをレポートに表示させるようにPHPUnitを改造してみました。各テストメソッドのコメントに@testというタグでテスト内容を簡潔に記述します。
<?php
require_once 'PHPUnit/Framework.php';
class ArrayTest extends PHPUnit_Framework_TestCase
{
/**
* @test 初期化後の配列のサイズは0
*/
public function testNewArrayIsEmpty()
{
$this->assertEquals(0, sizeof($fixture));
}
/**
* @test 配列に1つの要素を正しく追加できる
*/
public function testArrayContainsAnElement()
{
$fixture[] = 'Element';
$this->assertEquals(1, sizeof($fixture));
}
/**
* @test ダミーのテスト (常にエラーになる...)
*/
public function test0001()
{
$this->fail('ERROR ERROR ERROR!!');
}
}
?>
出力結果は下記のようになります。以前の状態よりもテスト内容が把握しやすくなったのではないでしょうか。(画像クリックで拡大)
さて、@testアノテーションを使うためにはPHPUnitに手を加えます。
試される場合は自己責任でお願い致します。
--- PHPUnit
/Util
/Log/XML
.php
.orig
2008-06-18 16:37:56.000000000 +0900
+++ PHPUnit
/Util
/Log/XML
.php
2008-06-24 14:54:46.000000000 +0900
@@ -387,6 +387,11 @@
if ($class->hasMethod($methodName)) {
$method = $class->getMethod($test->getName());
+ if (preg_match('/@test[\s]+(.+)/', $method->getDocComment(), $matches)) {
+ $testCase->setAttribute('test', $matches[1]);
+ }
+
$testCase->setAttribute('class', $class->getName());
$testCase->setAttribute('file', $class->getFileName());
$testCase->setAttribute('line', $method->getStartLine());
diff -ur PHPUnit/TextUI/TestRunner.php.orig PHPUnit/TextUI/TestRunner.php
--- PHPUnit/TextUI/TestRunner.php.orig 2008-06-02 13:10:50.000000000 +0900
+++ PHPUnit/TextUI/TestRunner.php 2008-06-20 14:44:40.000000000 +0900
@@ -746,7 +720,7 @@
$arguments['excludeGroups'] = isset($arguments['excludeGroups']) ?
$arguments['excludeGroups'] : array();
$arguments['groups'] = isset($arguments['groups']) ?
$arguments['groups'] : array();
$arguments['logIncompleteSkipped'] = isset($arguments['logIncompleteSkipped']) ?
$arguments['logIncompleteSkipped'] : FALSE;
- $arguments['reportCharset'] = isset($arguments['reportCharset']) ?
$arguments['reportCharset'] : 'ISO-8859-1';
+ $arguments['reportCharset'] = isset($arguments['reportCharset']) ?
$arguments['reportCharset'] : 'UTF-8';
$arguments['reportHighlight'] = isset($arguments['reportHighlight']) ?
$arguments['reportHighlight'] : FALSE;
$arguments['reportHighLowerBound'] = isset($arguments['reportHighLowerBound']) ?
$arguments['reportHighLowerBound'] : 70;
$arguments['reportLowUpperBound'] = isset($arguments['reportLowUpperBound']) ?
$arguments['reportLowUpperBound'] : 35;
また、phingのスタイルシートにも変更を加えます。
--- lib/php/data/phing/etc/phpunit2-frames.xsl.orig 2008-06-24 15:00:04.000000000 +0900
+++ lib/php/data/phing/etc/phpunit2-frames.xsl 2008-06-24 15:12:40.000000000 +0900
@@ -598,15 +598,17 @@
<xsl:choose>
<xsl:when test="failure">
<td>Failure</td>
- <td><xsl:apply-templates select="failure"/></td>
+ <td><xsl:value-of select="@test"/>
+ <xsl:apply-templates select="failure"/></td>
</xsl:when>
<xsl:when test="error">
<td>Error</td>
- <td><xsl:apply-templates select="error"/></td>
+ <td><xsl:value-of select="@test"/>
+ <xsl:apply-templates select="error"/></td>
</xsl:when>
<xsl:otherwise>
<td>Success</td>
- <td></td>
+ <td><xsl:value-of select="@test"/></td>
</xsl:otherwise>
</xsl:choose>
<td>
本当は、PHPUnitに手を加えずにレポート出力だけをカスタマイズできればベストだったのですが、なかなか情報が見つからず断念しました。しかし、情報がなければ自分でソースを好きにカスタマイズできるのがオープンソースの良いところですね。
では、今回はこの辺で。