Test Driven Development
- TDDはXP由来
- だが、スクラム等、他のアジャイル方法論のほとんどでも取り入れられている
- 非アジャイルでも取り入れられる
-
著者ボブおじさんがKent Beck (TDDの走り)と働いて衝撃を受けたという話
- 当初TDDに対して懐疑的だった
-
30秒周期でコードを実行する
- それもコンパイル型言語(Java)を
The Jury Is In
- 過去何年にもわたり、TDDに関するさまざまな議論や記事が展開されてきた
- 結論、TDDは機能する
-
TDDは(プロとして)当たり前のこと
- すべてのコードが動くかわからないのはプロとしていかがなものか
- 変更を加えるたびにテストせずして、そのコードが動くとどうしてわかるだろうか(いやわからない)
- 高カバレッジな自動テストなくして、変更を加えるたびごとにどうやってテストできようか(いやできない)
- TDDを実践せずして、高カバレッジな自動テストをどうやって得られようか(いや得られない)
The Three Laws of TDD
-
TDD三原則
- 落ちるテストコードを先に書かずにプロダクションコードを書くの禁止
-
テストコードも一度にたくさん書くの禁止。実行して落ちるのに十分なぶんだけ書く
-
コンパイルは通す
- クラスや関数のシグネチャくらいは書く
- さもないとテストコードのコンパイルが通らない
-
- 今落ちているテストを通す以上のプロダクションコードを書くの禁止
- これらにより、開発サイクルが30秒そこらに制限される
- テストとプロダクションコードは抗体と抗原のような一対のもの
The Litany of Benefits
Certainty
-
著者がメンテナを務めるFitNesseの話
- 64,000行くらい
- うち単体テストが2,200件、28,000行くらい
- カバレッジ90%、90秒程度で終わる自動テストスイーツがある
- これが通れば、加えた変更が他の部分を壊していないことが「ほぼ確か」といえる
- どれくらい「確か」か?
- リリースできるくらいには!
ant release
コマンド一撃で受け入れテストまで終わる
Defect Injection Rate
-
FitNesseは1年間で20,000行追加、バグは17件だった
- ほとんどがうわべ上の(=ささいな?)もの
- 不具合埋め込みはとても少ないと言える
- 他にも不具合率が2倍、5倍、あるいは10倍減ったという報告がある
Courage
- ハチャメチャなコードを見つけたとする
-
綺麗にしたいが、何か壊しそうで怖くて触れない、となりがち
- 壊したら自分のせい
- 自動テストがあれば変更は怖くない
-
変更が怖くなくなれば、プログラマはコードを綺麗にするのである
- 綺麗なほうが理解しやすく、変更しやすく、拡張しやすいから
- シンプルになり、不具合も入りづらくなる
-
コードベースは腐っていくのではなく改善していくようになる
- 【補】Boy Scout Rule
Documentation
-
TDD三原則に則って書かれた単体テストはそれ自体がドキュメンテーションになる
- オブジェクトの生成方法
- 関数の(意味のある)呼び出し方
-
単体テストは最も低水準の設計資料
- あいまいでない
- 正確
- 読み手が理解できる
- 実行可能
Design
- 「テスト困難なまずい設計」を未然に防ぐ
- cf. テストを後から書こうとするとテスト困難だったりする
-
後から完全なテストを書くことはできない
- カバレッジを稼ぐことはできる
- が、問題解決後にテストを書くと、その問題に対して落ちるテストを欠いてしまう
The Professional Option
- TDDのメリットはここに挙げたとおり
- TDDを使わないのはアンプロフェッショナル
What TDD Is Not
-
従えば必ずうまくいくというものではない
- テストファーストでもまずいプロダクションコードは書けてしまう
- まずいテストも書けてしまう
- TDD三原則が非実践的・不適切なことも稀だがある
英語
-
absurd
- ばかげた、不条理な
-
dawn on
- …が…に理解され始める
-
the jury is out
-
結論がまだ出ていない
- 「陪審はまだ外で協議中である」
-
-
the jury is in
- ↑の逆。「結論はもう出ている」ということか
-
rant
- ギャーギャーわめく
-
The bottom line is…
- 結論は…である
-
strident
- 執拗な
-
unilateral
- 片側だけの
-
antibody
- 抗体
-
antigen
- 抗原
-
litany
- 連祷
- 長々とした説明
-
cosmetic
- 表面的な
-
upshot
- 結末、最終的結果