関連のないコードを同じ場所に追記しまくってる
DBに依存したテスト
→これらは死亡フラグ
UnitTestとは単体テストのこと。
xUnit PHPUnit系
いろいろなパターンの引数を渡してテストしてれぅ
単体でのテストが出来ればよい
呼んでるメソッドのさき のただしさは気にせんでもよい
デメリット
テストを作るのに時間がかかる
テストのためのクラス設計を求められる
必ずしも全てバグを引き出せるわけではない。
UnitTestを意識してクラス設計する必要がある
故に既存のコードをテストする必要がある
テストのためのクラス設計の指針
- 強い依存を徹底的に排除しなければならない(クラス間、外部システム)
- 複雑度を下げる
モック
- そのクラスのように振る舞うダミー
- ダミーで入力を検証する
- ダミーで出力を固定する
モックを使うということはオブジェクトを差し替えるということ
差し替えられないもの
- メソッド内でnew
- staticメソッドの呼び出し
- 組み込み関数
- finalなクラス
クラス間の依存の排除
- コンストラクタやメソッドの引数でオブジェクトを渡す(ファクトリを渡すのも可)
- セッタで上書き
依存の削除
プロキシパターン
複雑度を下げる
同じタイミングで実行されるからと言って関係のないコードを同じ場所に書かない
ifの入れ子になったらメソッドを分割する
ループの中は別メソッドにする (走査と操作は分ける)
ざっくばらんなまとめ
- そのクラスに関連するオブジェクトはメンバ変数にする
- メンバ変数はセッタで上書き可能にする
- メソッドは小まめに分ける
テストしない理由
- 時間がない (テストの書けないコードは書かない)
- 上司に理解がない (理解を得る必要はない)
- あとで書く (絶対後で書かない)
- 複雑すぎてテストが書けない (手動でもテストできませんよ)