HudsonでPHPのユニットテスト

Hudsonを使い始めたときから、いつかPHPの開発でも使いたいなぁとか思いつつ、Phing Pluginをコミットしてずっと忘れていました。

PHPの試験環境はJavaの影響を受けてかなり良くなってきています。Antに対応するPhingJunitに対応するPHPUnitCheckStyleに対応するPHP_CodeSnifferなどがあります。
今日は、手始めにPhingとPHPUnitで単体試験の自動化をやってみたいと思います。

Phingの準備

Phingのインストール

Phingをインストールするを参考にしてインストールします。Hudsonを実行するユーザーで動くことを確認しておきます。

Phingプラグインのインストール

[Hudsonの管理] - [プラグインの管理] - [利用可能]の一覧表示から"Phing Plugin"をチェックして、インストール、再起動します。



ソースの準備

今回は簡単に以下のソース(StringUtil.php)を試験対象にします。

<?php
class StringUtil {

    private function __construct() {
        //
    }

    public static function toupper($str) {
        return mb_strtoupper($str, 'UTF-8');
    }
}

テストコードの準備

phpunit --skeleton StringUtilStringUtilTest.phpを作って、テストメソッドを追加します。

    /**
     * 成功するテスト
     */
    public function testToupper1() {
        $this->assertEquals("AAA", StringUtil::toupper("aaa"));
    }

    /**
     * 失敗するテスト
     */
    public function testToupper2() {
        $this->assertEquals("AAa", StringUtil::toupper("aaa"));
    }

    /**
     * 成功するテスト
     */
    public function testToupper3() {
        $this->assertEquals("あああ", StringUtil::toupper("あああ"));
    }

build.xmlの作成

Phingで試験を行うには、JUnitと同様にbuild.xmlが必要です。ここでは簡単にPHPUnitを実行してテスト結果をXMLファイルに出力するようにします。このXMLファイルはJUnitが出力するXMLに準拠しているようなので、HudsonでもJUnitと同様に結果を確認できそうです。

<?xml version="1.0" encoding="utf-8" ?>
<project name="StringUtil" basedir="." default="test">
  <target name="test">
    <delete dir="reports" includeemptydirs="true" />
    <mkdir dir="reports" />
    <phpunit
      haltonfailure="false"
      printsummary="true"
      >
      <formatter todir="reports" type="xml" outfile="unitreport.xml" />
      <batchtest>
        <fileset dir="src">
          <include name="**/*Test.php" />
        </fileset>
      </batchtest>
    </phpunit>
  </target>
</project>


ここまでできると、Javaと同様にHudsonにフリースタイルでプロジェクトを作成して設定すれば自動化できます。

Phingの設定

ビルドの手順の追加からPhingの呼び出しを選択して、以下のように設定します。(ワークスペースphpディレクトリにbuild.xmlがあります)



テスト結果の集計の設定

ビルド後の処理Junitテスト結果の集計を設定します。




以上で準備ができたのでビルドを実行すると、グラフやテスト結果を見ることができます。







xdebugを使えばコードカバレッジもとれて、出力もCloverと互換性があるようなので、十分使えるのではないでしょうか。