勉強日記

チラ裏

The Clean Coder ch5 Test Driven Development

www.oreilly.com


Test Driven Development

  • TDDはXP由来
  • だが、スクラム等、他のアジャイル方法論のほとんどでも取り入れられている
  • アジャイルでも取り入れられる
  • 著者ボブおじさんがKent Beck (TDDの走り)と働いて衝撃を受けたという話
    • 当初TDDに対して懐疑的だった
    • 30秒周期でコードを実行する

The Jury Is In

  • 過去何年にもわたり、TDDに関するさまざまな議論や記事が展開されてきた
  • 結論、TDDは機能する
  • TDDは(プロとして)当たり前のこと
    • すべてのコードが動くかわからないのはプロとしていかがなものか
    • 変更を加えるたびにテストせずして、そのコードが動くとどうしてわかるだろうか(いやわからない)
    • カバレッジな自動テストなくして、変更を加えるたびごとにどうやってテストできようか(いやできない)
    • TDDを実践せずして、高カバレッジな自動テストをどうやって得られようか(いや得られない)

The Three Laws of TDD

  • TDD三原則
    • 落ちるテストコードを先に書かずにプロダクションコードを書くの禁止
    • テストコードも一度にたくさん書くの禁止。実行して落ちるのに十分なぶんだけ書く
    • 今落ちているテストを通す以上のプロダクションコードを書くの禁止
  • これらにより、開発サイクルが30秒そこらに制限される
  • テストとプロダクションコードは抗体と抗原のような一対のもの

The Litany of Benefits

Certainty

  • 著者がメンテナを務めるFitNesseの話
  • カバレッジ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
    • 結末、最終的結果