XP祭り関西2011に参加してきた

昨年に続き、XP祭り関西2011に参加してきた。寒い日だったけれど会場はやる気ある人の熱気が感じられ、XP関係のイベントはどうしていつもこんなに雰囲気が明るいのかと不思議になる。他のソフトウェア関係のイベントとは雰囲気が少々異なるように思う。

初期費用ゼロ円という永和マネジメントシステムのサービスの話(木下史彦さん)や、大規模開発に向けたチケット駆動開発の話(あきぴーさん)、コンテキストの違いを面白おかしく説明してくれた話(森崎修司先生)も良かったけれど、今回は何と言ってもユニットテストに関する井芹洋輝さんの講演が素晴らしかったので、その内容を紹介したい。

以下、講演内容のメモより抜粋。

  • ユニットテストの使い方としては軽快なチェックが目的。リスクや不安を取り除き安心出来るまでテストを行う。
  • ユニットテスト利用の例
    • リファクタリング:テストでチェックしつつリファクタリングを行う。
    • 学習テスト:テストコードで実動作を確認し、ドキュメント資産として残す。
    • デバッキングテスト:テストでバグを特定し、その修正をテストで検証する。
  • プログラミングとユニットテストは一体化している。ユニットテストの継続活用が課題。
  • 保守性の悪いテストの例
    • 可読性の悪いテスト(何を検査しているのか分からない)
    • 変更性の悪いテスト(テストコードが製品コードの変更コストを増大させてしまう)
  • ユニットテストで運用コストを下げて、継続活用する方策は?
  • 保守性を支える原則
    1. 変更に対する堅牢性に優れる
    2. 可読性に優れる
    3. 独立性に優れる(構造的、時間的)
    4. 自己完結している(他に依存しない)
    5. 完全自動化している(手動操作不要)
    6. 細粒度なテストケース
  • ユニットテスト作り込みののアプローチ
    1. 実装の工夫:コードの共通化、可読性の向上。
    2. 構造設計の工夫:外部インターフェースに依存するテストの分離、DIでモックを導入する。
    3. 設計の工夫:テスト技法を学ぶ、仕様・コード構造の両面から最適な技法を使い分ける。
  • ユニットテストはプログラミングそのもの。テストコードは単なるAssertionのリストではない。

実際のソースコードの実例と共に数々のテクニックが紹介され、開発現場で生み出されたノウハウが満載の講演だった。テストコードを書く上で「テストしやすい設計を行う」ことはいつも考慮してきたつもりだけど、講演の中ではその考え方をさらに先へ進めて、対象となる製品コード同様に設計コードを重視し、ソフトウェアテストと同じようなテスト設計の考え方を導入していた。これは凄い。

例えば、ズームイン・アウトによる設計視点の切り替え、仕様・コード双方からの構造設計の検討など、ソフトウェアテストの領域で得られた知見を活用してユニットテストのコード設計を高度化させていく考え方は見事で、大いに参考になった。テストコードも立派な成果物であり、単にテストのためだけに存在するものでもないし、テストが終われば捨ててしまって良いものではないのだ。高品質なコードを短期間で作り上げて、しかもそのコードを長期に渡って保守していくためには、製品コードのみならずテストコードにも高度な設計技法が求められる時代になってきたようだ。

講演の中で紹介された本はこちら。和訳本は出ていないようだが、有志による読書会が行われているらしい。

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))

読む価値はある。筆者は間違いなくテストを書く事と真剣に向き合っている。本書でしか読めないパターンも多い。Mock Object、Stub、Test Spy の違い。Slow Test に立ち向かうための Fixture 。種々の Result Verification 手法などお腹いっぱいの内容。

xUnit Test Patterns - higepon blog

また、テスト技法を学ぶための本として紹介された本はこちら。いずれも、テストを専門に行う人には有名な本だけど、開発者も戦略的なテストコードを書くために必要になってくるだろう。

ソフトウェアテスト技法ドリル―テスト設計の考え方と実際

ソフトウェアテスト技法ドリル―テスト設計の考え方と実際

はじめて学ぶソフトウェアのテスト技法

はじめて学ぶソフトウェアのテスト技法