Web的な何か

JavaとかPHPとかやってます。最近はAndroidばっかやってます。

PHPUnit 覚え書き

PHPUnitを使う機会ができたのでまずPHPUnitについて調べてみた。


PHPUnitって何だろう
PHPのテスト用ツールで単体テストを行うことができる。
作成したクラスからPHPUnit内のクラスを通してテストフォルダにテスト用のクラスを作成し、それを実行することで正常に動作できているかどうかを確認することができる。

単体テスト:
クラスやメソッド単位で動作を確認していく作業のこと。


インストール自体は簡単で以下の2行記述するだけで可能。

pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit

インストール処理が終了したら以下のコマンドでバージョンを確認して、表示されていたらインストール完了。

phpunit --version


テスト用スクリプトの作成
今回作ってみたスクリプトはこんな感じ

<?php
class hoge{
    /**
     * @assert ("あ-い-う") == "あ, い, う"
     * @assert ("あ-い-う") == "あいう"
     * @assert ("a-b") == "a, b"
     */
    public function trial($str)
    {
        //ハイフンで区切られた文字をカンマで区切る
        $str = str_replace("-", ", ", $str);
        return $str;
    }
}
?>

動作は"trial"という名前の関数を用意して、-(ハイフン)で区切られた文字をカンマに変換する処理が書かれている。

"@assert"と書かれている部分はテストする項目で、例えば関数trialの$strの引数に"あ-い-う"が入った時に、出力が"あ, い, う"と表示されるかどうか、といった処理がテストの時に行われる。


assertの記述を二通りほど見つけた

  1. /* プログラムのコメント内 @assert {テスト内容} */
  2. assertEquals()


PHPUnitを通して作成されたテスト用スクリプトはこんな感じ。

<?php

require_once dirname(__FILE__) . '/../index.php';

/**
 * Test class for hoge.
 * Generated by PHPUnit on 2012-02-14 at 17:30:53.
 */
class hogeTest extends PHPUnit_Framework_TestCase {

    /**
     * @var hoge
     */
    protected $object;

    /**
     * Sets up the fixture, for example, opens a network connection.
     * This method is called before a test is executed.
     */
    protected function setUp() {
        $this->object = new hoge;
    }

    /**
     * Tears down the fixture, for example, closes a network connection.
     * This method is called after a test is executed.
     */
    protected function tearDown() {
        
    }

    /**
     * Generated from @assert ("あ-い-う") == "あ, い, う".
     *
     * @covers hoge::trial
     */
    public function testTrial() {
        $this->assertEquals(
                "あ, い, う", $this->object->trial("あ-い-う")
        );
    }

    /**
     * Generated from @assert ("あ-い-う") == "あいう".
     *
     * @covers hoge::trial
     */
    public function testTrial2() {
        $this->assertEquals(
                "あいう", $this->object->trial("あ-い-う")
        );
    }

    /**
     * Generated from @assert ("a-b") == "a, b".
     *
     * @covers hoge::trial
     */
    public function testTrial3() {
        $this->assertEquals(
                "a, b", $this->object->trial("a-b")
        );
    }

}

?>

これをNetbeansなどで動作させると二番目に書かれた「@assert ("あ-い-う") == "あいう"」の項目だけエラーが表示される。思ったよりも便利そう。