テストのための設計

http://www.threeriversinstitute.org/AbstractVsConcreteParameters.html
Kent Beckによる設計論。テストしやすいソフトウェアのデザインについて。
流し読みで要約。

  • テストしやすいソフトウェアは"Contorollable"だ
    • Controllabilityとは、オブジェクトが動作するコンテキストを簡単に構築できること
  • パラメータを具体的なものにするとControllabilityが増すケース
    • 例:死亡表から、男性・非喫煙者のデータを取ってくる機能のテスト
    • 死亡表から検索するというメソッドのパラメータとしてCustomerオブジェクトを渡していると、テストのために完全なCustomerオブジェクトを作成しないといけない。
    • パラメータを変更して、必要な情報だけ(性別・喫煙者かどうか)を具体的なプロパティで渡すようにすると、テストのために完全なオブジェクトを作成する必要がなくなる。→controllable
  • パラメータを抽象的なものにするとControllabilityが増すケース
    • 例:サーバーとソケット通信する機能のテスト
    • IPアドレスとポート番号を生で渡していたら、多数のテストケースの条件をシミュレーションするテスト用サーバーを作らないといけない。めちゃめちゃ大変。
    • IPアドレスとポート番号の両者をラップして抽象化したSocketConnectionオブジェクトを渡すようにすると、ダミーな通信を確立するとかいうことができるので、テスト環境の作成が楽になる。→controllable
  • まーこの両者ってトレードオフだよね
    • 前者は「コストを下げることによるControllability」であるのに対し、後者は「柔軟性を高めることによるControllability」であるという違いがある。
    • どっちを優先した方がよいか、設計を議論するときのヒントとして使ってください。柔軟性がいらなかったら前者、必要だったら後者とか。