techtalk

PHPUnitのレポート表示でテストケースの注釈を表示させる方法
AddThis Social Bookmark Button  Date:2008年06月24日  Category:雑記  Author:伊丹

PHPUnitPhingを併用することでユニットテストの結果レポートをHTML形式で生成することが出来ますが、テストメソッドの名前に注意しないと何のテストを実施したのか分からなくなってしまいます。

例えば、PHPUnitポケットガイドのArrayTestを参考に作成したテストケースを実行してレポートを見てみます。(画像クリックで拡大)

通常のレポート出力

極端な例ですが、3番目のテストメソッドが「test0001」という無意味な名前になっているため何のテストなのか分かりません。ただ、テスト項目が増えた場合、テストメソッドの名前だけで区別させるのは大変かもしれません。

そこで、テストメソッドのコメントにテストケースの注釈を記述して、それをレポートに表示させるようにPHPUnitを改造してみました。各テストメソッドのコメントに@testというタグでテスト内容を簡潔に記述します。

  1.  
  2. <?php
  3. require_once 'PHPUnit/Framework.php';
  4.  
  5. class ArrayTest extends PHPUnit_Framework_TestCase
  6. {
  7.         /**
  8.          * @test 初期化後の配列のサイズは0
  9.          */
  10.         public function testNewArrayIsEmpty()
  11.         {
  12.                 $fixture = array();
  13.                 $this->assertEquals(0, sizeof($fixture));
  14.         }
  15.  
  16.         /**
  17.          * @test 配列に1つの要素を正しく追加できる
  18.          */
  19.         public function testArrayContainsAnElement()
  20.         {
  21.                 $fixture = array();
  22.                 $fixture[] = 'Element';
  23.                 $this->assertEquals(1, sizeof($fixture));
  24.         }
  25.  
  26.         /**
  27.          * @test ダミーのテスト (常にエラーになる...)
  28.          */
  29.         public function test0001()
  30.         {
  31.                 $this->fail('ERROR ERROR ERROR!!');
  32.         }
  33. }
  34. ?>
  35.  


出力結果は下記のようになります。以前の状態よりもテスト内容が把握しやすくなったのではないでしょうか。(画像クリックで拡大)

@testアノテーションでコメントを表示)

さて、@testアノテーションを使うためにはPHPUnitに手を加えます。
試される場合は自己責任でお願い致します。

  1.  
  2. --- PHPUnit/Util/Log/XML.php.orig       2008-06-18 16:37:56.000000000 +0900
  3. +++ PHPUnit/Util/Log/XML.php    2008-06-24 14:54:46.000000000 +0900
  4. @@ -387,6 +387,11 @@
  5.                  if ($class->hasMethod($methodName)) {
  6.                      $method = $class->getMethod($test->getName());
  7.  
  8. +                    if (preg_match('/@test[\s]+(.+)/', $method->getDocComment(), $matches)) {
  9. +                        $testCase->setAttribute('test', $matches[1]);
  10. +                    }
  11. +
  12.                      $testCase->setAttribute('class', $class->getName());
  13.                      $testCase->setAttribute('file', $class->getFileName());
  14.                      $testCase->setAttribute('line', $method->getStartLine());
  15. diff -ur PHPUnit/TextUI/TestRunner.php.orig PHPUnit/TextUI/TestRunner.php
  16. --- PHPUnit/TextUI/TestRunner.php.orig  2008-06-02 13:10:50.000000000 +0900
  17. +++ PHPUnit/TextUI/TestRunner.php       2008-06-20 14:44:40.000000000 +0900
  18. @@ -746,7 +720,7 @@
  19.          $arguments['excludeGroups']              = isset($arguments['excludeGroups'])              ? $arguments['excludeGroups']              : array();
  20.          $arguments['groups']                     = isset($arguments['groups'])                     ? $arguments['groups']                     : array();
  21.          $arguments['logIncompleteSkipped']       = isset($arguments['logIncompleteSkipped'])       ? $arguments['logIncompleteSkipped']       : FALSE;
  22. -        $arguments['reportCharset']              = isset($arguments['reportCharset'])              ? $arguments['reportCharset']              : 'ISO-8859-1';
  23. +        $arguments['reportCharset']              = isset($arguments['reportCharset'])              ? $arguments['reportCharset']              : 'UTF-8';
  24.          $arguments['reportHighlight']            = isset($arguments['reportHighlight'])            ? $arguments['reportHighlight']            : FALSE;
  25.          $arguments['reportHighLowerBound']       = isset($arguments['reportHighLowerBound'])       ? $arguments['reportHighLowerBound']       : 70;
  26.          $arguments['reportLowUpperBound']        = isset($arguments['reportLowUpperBound'])        ? $arguments['reportLowUpperBound']        : 35;
  27.  


また、phingのスタイルシートにも変更を加えます。

  1.  
  2. --- lib/php/data/phing/etc/phpunit2-frames.xsl.orig    2008-06-24 15:00:04.000000000 +0900
  3. +++ lib/php/data/phing/etc/phpunit2-frames.xsl 2008-06-24 15:12:40.000000000 +0900
  4. @@ -598,15 +598,17 @@
  5.          <xsl:choose>
  6.              <xsl:when test="failure">
  7.                  <td>Failure</td>
  8. -                <td><xsl:apply-templates select="failure"/></td>
  9. +                <td><xsl:value-of select="@test"/>
  10. +                <xsl:apply-templates select="failure"/></td>
  11.              </xsl:when>
  12.              <xsl:when test="error">
  13.                  <td>Error</td>
  14. -                <td><xsl:apply-templates select="error"/></td>
  15. +                <td><xsl:value-of select="@test"/>
  16. +                <xsl:apply-templates select="error"/></td>
  17.              </xsl:when>
  18.              <xsl:otherwise>
  19.                  <td>Success</td>
  20. -                <td></td>
  21. +                <td><xsl:value-of select="@test"/></td>
  22.              </xsl:otherwise>
  23.          </xsl:choose>
  24.          <td>
  25.  


本当は、PHPUnitに手を加えずにレポート出力だけをカスタマイズできればベストだったのですが、なかなか情報が見つからず断念しました。しかし、情報がなければ自分でソースを好きにカスタマイズできるのがオープンソースの良いところですね。

では、今回はこの辺で。

←WordPressのプラグインを作ってみました Topに戻る FlashDevelopで作ってみた(1) ニコニコ風タグクラウド→
カテゴリー
全て
Flash
PHP
雑記