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メソッドに何かを描き足したりする必要が出てきそうだ。
残念。