最近TDD周りが盛り上がっておりますが、たまたまチームメンバー向けにturnip勉強会を開催することになりアジェンダを作ってたところ、我ながらいいこと書いた気になったのでついでにブログにも記しておきます。

背景

5年ほど稼働しているサービスですが自動テストがほとんどなくて、毎週のようにリリースはあるけど修正箇所と関係なさそうなアクションは一切テストしてない状態です。これはまずいということでとりあえずturnipをがーっと書いたので、他のメンバーにもテストを追加してもらえるようにざっくり考え方を共有しようという感じです。対象はjavaとかphpとかでできたWebサービスです。

SPONSERD LINK

その1

例えば、テスト漏れによるバグが発覚するとする。

  • どういうテストをしていたら防げた?
     → それをそのままテストコードにする
  • 次から同じバグは起こらなくなることが自動テストで担保される
  • 不安がなくなる!

その2

例えば、色んなアクションから呼ばれる共通関数をリファクタリングしたとする。

  • リリース前に必ずテストしておきたいアクションはどれ?
    そのアクションはどうなってたらリリースしていい?
     → それをそのままテストコードにする
  • リファクタリングによる影響がないことが自動テストで担保される
  • 不安がなくなる!

その3

例えば、フルスクラッチで全部railsに書き換えるとする。

  • どんなアクションが、どんなパラメータを受け取った時に何を返せばいい?
     → それをそのままテストコードにする
  • 今と同じ動作が自動テストで担保される
  • 不安がなくなる!

まとめ

どんなアプリも、ゴールは「その3」の状態。フルスクラッチで作りなおした時にできててほしいこと=そのアプリでテストすべきこと。
それが自動で担保されるなら、masterにpushした瞬間に自動でテスト流して自動でデプロイしてもいい。
それでバグが出たら、それはテストケース漏れなので自動でやろうが手動でやろうがそのバグは出る。

雑記

DHHが死んだと言っているTDDというのはユニットテストかつテストファーストという意味なのかなーとなんとなく思っています。Capybaraは素晴らしいみたいなことも書いてあった気がするので、まずはturnipなりcucumberなりで一番外側のテストを書いといて、より細かくテストした方が安心して開発できるっていう部分だけユニットテストを書くというのが今の自分の方向性です。

FuelPHPで個人的にサービス作ってる時に思いましたが、それなりにフレームワークに乗っかっててそれなりにORM使ってて大して特殊なことしてないアプリなら、このURL叩いてこの結果返ってきててNoticeとかWarningとかが入ってなければそれでいいやん。みたいな。