テスト駆動開発とデバッグコード

2008/04/07

先日、Railsによる業務システムの開発についてセミナーをしまして、後日、出席者の方々からメールで質問をいただきました。

セミナーの主要テーマの一つがテスト駆動開発のメリットだったのですが、私が「デバッグコードを埋め込まずに済む」と話した点について、その意図・詳細を尋ねられた方がいらっしゃいました。

私は性格にムラがあるので、テスト駆動開発の原則に従うときと従わないときがあるのですが、ちゃんとテストを書いてからコーディングしているときは、アプリケーションのソースコード本体にデバッグコードを埋め込む(たとえば、変数の値をログに出力してみる)ことが少なくなる傾向があります。

これは、なぜでしょうか。

それは、テストスクリプトとデバッグコードは目的がよく似ているからです。

あるコントローラのテストスクリプトを思い浮かべてください。このスクリプトはおおよそ次のような処理を行います。

  • アプリケーションを特定の状態にセットする。
  • 特定のHTTPリクエストを投げる。
  • その結果、コントローラのインスタンス変数が特定の値を持つことやHTTPレスポンスが特定の条件を満たすことを確認する。

デバッグコードの目的は、処理の過程で変数がどのように変化していくのかを見ることです。テストスクリプトの目的の一つは、処理の結果で変数がどうなったかを見ることです。同じではありませんが、よく似ています。

テストスクリプトがデバッグコードよりも優れているのは、アプリケーションが特定の状態にあるという前提条件を作り出して、処理の結果を確認しているということです。すべてのテストスクリプトが成功するのに、アプリケーションはうまく動作しないのであれば、まだテストしていない条件が存在することを示唆しています。テストスクリプトはバグが発生する条件を絞り込んでくれるのです。

テスト駆動開発では、テストスクリプトを書いてから、アプリケーション本体のソースコードを書いていくわけですが、実際にはコーディングが順調に進まない場合もあります。このような時、ついデバッグコードをアプリケーション本体に埋め込みたくなります。しかし、もっと確実な方法は、今コーディングの対象になっているアクションやメソッドの一部(怪しい部分)を切り出して別のメソッドにし、まずこの小さなメソッドについてテストスクリプトを書くことです。このメソッド内にバグが発見されればそれでいいし、発見されなければ元のアクションやメソッドに戻って更に調べていきます。

このような訳で、テスト駆動開発ではデバッグコードの出番はあまりありません。更に言えば、デバッガーもほとんど不要です。
--
黒田努