読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

ユニットテストに入れるためのクラス設計 #phpcon2012

PHPカンファレンス 2012

関連のないコードを同じ場所に追記しまくってる
DBに依存したテスト
→これらは死亡フラグ

UnitTestとは単体テストのこと。

xUnit PHPUnit
いろいろなパターンの引数を渡してテストしてれぅ

単体でのテストが出来ればよい
呼んでるメソッドのさき のただしさは気にせんでもよい

デメリット

テストを作るのに時間がかかる
テストのためのクラス設計を求められる
必ずしも全てバグを引き出せるわけではない。

UnitTestを意識してクラス設計する必要がある
故に既存のコードをテストする必要がある

テストのためのクラス設計の指針

  • 強い依存を徹底的に排除しなければならない(クラス間、外部システム)
  • 複雑度を下げる

モック

  • そのクラスのように振る舞うダミー
  • ダミーで入力を検証する
  • ダミーで出力を固定する

モックを使うということはオブジェクトを差し替えるということ

差し替えられないもの

  • メソッド内でnew
  • staticメソッドの呼び出し
  • 組み込み関数
  • finalなクラス

クラス間の依存の排除

  • コンストラクタやメソッドの引数でオブジェクトを渡す(ファクトリを渡すのも可)
  • セッタで上書き

依存の削除

プロキシパターン

複雑度を下げる

同じタイミングで実行されるからと言って関係のないコードを同じ場所に書かない
ifの入れ子になったらメソッドを分割する
ループの中は別メソッドにする (走査と操作は分ける)

ざっくばらんなまとめ

  • そのクラスに関連するオブジェクトはメンバ変数にする
  • メンバ変数はセッタで上書き可能にする
  • メソッドは小まめに分ける

テストしない理由

  • 時間がない (テストの書けないコードは書かない)
  • 上司に理解がない (理解を得る必要はない)
  • あとで書く (絶対後で書かない)
  • 複雑すぎてテストが書けない (手動でもテストできませんよ)

アライドアーキテクツ エンジニアブログ