PHPUnitの現実的な使い方を考える

かくかくしかじかあったが、PHPUnitは頗る調子よく動いている。
そもそもxUnit系に真剣に取り組むのは今回が初めてで、胸ときめいている。

PHPUnitの使用例を見ていると、大体にして「add(1,1)」のような単純な数式テストが多く、少しの不安があった。
文字列は、ましてやマルチバイト文字列はうまく動作してくれるのか?

たとえばモバイル向けのあるクラスを作っているとする。
ここのあるフィルタメソッドは、渡された文字列に対して以下のような作用をする。

  • Shift_JIS形式にコンバートする
  • 全角カタカナ,英数を半角カタカナにする

上記クラスの実相例を以下の通りとする。
ソースコードUTF-8で記述している。
また渡される文字列のエンコード方式がわからないとし、エンコード状態の取得はmb_detect_encoding()に委ねることにした。

class cls {
    /**
     * @assert ("AAカナ1") == mb_convert_encoding("AAカナ1","SJIS","UTF-8")
     */
    public function filter ( $str )
    {
        // ShiftJIS化
        $str = mb_convert_encoding($str, 'SJIS', mb_detect_encoding($str));
        // 半角英数カナ化
        $str = mb_convert_kana($str, 'ak', 'SJIS');
        return $str;
    }
}

@assertはご存じのように、phpunitのスケルトン作成機能で用いるアノテーションだ。
@assertはソースコードに書いているので、@assert定義した文字列のエンコードがそのままテストデータで用いられる。
今回の場合はUTF-8ソースコード記述を行っているので、比較対象をmb_convert_encoding()によってShiftJISに変換している。

これで望みどおりの結果が出た。
なお

phpunit --skeleton ファイル名

を毎回入力するのが面倒だったので、.bashrcに

alias mkunit='phpunit --skeleton '

しておいた。

ケルトン作成機能は思いのほかうまく動いてくれるので、できる限りすべて@assert定義でひな形を作るというやり方で統一したいのだが、どうしても後々setUpメソッドに何かを描き足したりする必要が出てきそうだ。
残念。