Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

NetBeans 6.7 Beta で PHPUnit

NetBeans 6.7 Beta をインストールしていじっていると、環境設定 > PHP に「PHPUnit スクリプト」という項目が!
というわけで試してみました。

環境設定

PHP5 は MacPortsで、PHPUnitpear でインストールしています。

sudo port install php5 +apache2 +mysql5 +pear +readline +pcntl +postgresql83 +sqlite
sudo pear channel-discover pear.phpunit.de
sudo pear install -a phpunit/PHPUnit

NetBeansの環境設定→PHP

を追加しましょう。

PHPUnitのサンプルプロジェクトをつくる

ファイル→新規プロジェクトでプロジェクトを作ります。プロジェクト名はまぁ適当に、phpunit_sample とかで。
最初から、index.php が作成されますが、削除します。そのかわりに、簡単なクラスを作成します。ソースファイル直下でCalc.phpで保存してみます。

<?php
class Calc {
    function add($a, $b) {
        return null;
    }
}
?>

テストケースの自動生成

Calc.php を保存したら次はテストを作ってみます。(TDD ではテストを書いてから実装しますが、今回はテストの自動生成のために逆の手順でやっています)
まず、テストを保存するフォルダを作ります。プロジェクトウインドウのphpunit_sampleプロジェクトで、右クリックして新規→フォルダを選び、testsというフォルダを作ります。(初回だけ)
次に、Calc.php を右クリックし、ツール→PHPUnit テストを作成を選びます。
ダイアログボックスが出てきますが、ここで先ほど作成した testsを選択します。(これも初回だけ)
そうするとCalcTest.phpが作成され、スクリプトのひな形がすでに作られた状態になります。

テストの実行

NetBeansPHPUnitが実行できます。
実行→プロジェクト (phpunit_sample) をテストを選ぶか、Shift + F6 でテスト実行です。

実行したところ、実はテスト項目がないらしいです。CalcTest.phpを調べてみると、

<?php
// 中略
class CalcTest extends PHPUnit_Framework_TestCase
{
    // 中略
    /**
     * @todo Implement testAdd().
     */
    public function testAdd()
    {
        // Remove the following lines when you implement this test.
        $this->markTestIncomplete(
          'This test has not been implemented yet.'
        );
    }
}
?>

という感じで、テストコードはまだありませんでした。ご丁寧に @todo までついています。「あ、あんたのためにひな形を生成したんじゃないんだからね。はやくテストを書きなさいよ!」というわけですね。どういうわけだ。

<?php
// 中略
class CalcTest extends PHPUnit_Framework_TestCase
{
    // 中略
    public function testAdd()
    {
        $this->assertEquals(5, $this->object->add(2, 3));
    }
}
?>

addメソッドは静的なユーティリティメソッドを想定してつくったので、Calc::add(...)でもよかったんですが、上のように書きました。テスト実行。

こんどはスカスカの実装をなおします。

<?php
class Calc {
    function add($a, $b) {
        return $a + $b;
    }
}
?>


テスト成功です。

おまけ

メソッド名は日本語もいけますし、第1回 PHPUnit入門:PHPUnit3で始めるユニットテスト|gihyo.jp … 技術評論社のように @test を使うと、テストメソッドに test をつけなくてもよくなるので、テストメソッドを日本語にして、結果をわかりやすく表示することもできます。

感想

テスト生成がすごく楽できそうな感じ。1点気になるのは、一部テストが失敗したときにすべてレッドバーにならないところです。

失敗の時は赤一色の方がいいのでこれは微妙。。。
他の IDE のことは分からないのですが、NetBeans + PHPUnit いかがでしょうか?