テスト駆動開発とデバッグコード
先日、Railsによる業務システムの開発についてセミナーをしまして、後日、出席者の方々からメールで質問をいただきました。
セミナーの主要テーマの一つがテスト駆動開発のメリットだったのですが、私が「デバッグコードを埋め込まずに済む」と話した点について、その意図・詳細を尋ねられた方がいらっしゃいました。
私は性格にムラがあるので、テスト駆動開発の原則に従うときと従わないときがあるのですが、ちゃんとテストを書いてからコーディングしているときは、アプリケーションのソースコード本体にデバッグコードを埋め込む(たとえば、変数の値をログに出力してみる)ことが少なくなる傾向があります。
これは、なぜでしょうか。
それは、テストスクリプトとデバッグコードは目的がよく似ているからです。
あるコントローラのテストスクリプトを思い浮かべてください。このスクリプトはおおよそ次のような処理を行います。
- アプリケーションを特定の状態にセットする。
- 特定のHTTPリクエストを投げる。
- その結果、コントローラのインスタンス変数が特定の値を持つことやHTTPレスポンスが特定の条件を満たすことを確認する。
デバッグコードの目的は、処理の過程で変数がどのように変化していくのかを見ることです。テストスクリプトの目的の一つは、処理の結果で変数がどうなったかを見ることです。同じではありませんが、よく似ています。
テストスクリプトがデバッグコードよりも優れているのは、アプリケーションが特定の状態にあるという前提条件を作り出して、処理の結果を確認しているということです。すべてのテストスクリプトが成功するのに、アプリケーションはうまく動作しないのであれば、まだテストしていない条件が存在することを示唆しています。テストスクリプトはバグが発生する条件を絞り込んでくれるのです。
テスト駆動開発では、テストスクリプトを書いてから、アプリケーション本体のソースコードを書いていくわけですが、実際にはコーディングが順調に進まない場合もあります。このような時、ついデバッグコードをアプリケーション本体に埋め込みたくなります。しかし、もっと確実な方法は、今コーディングの対象になっているアクションやメソッドの一部(怪しい部分)を切り出して別のメソッドにし、まずこの小さなメソッドについてテストスクリプトを書くことです。このメソッド内にバグが発見されればそれでいいし、発見されなければ元のアクションやメソッドに戻って更に調べていきます。
このような訳で、テスト駆動開発ではデバッグコードの出番はあまりありません。更に言えば、デバッガーもほとんど不要です。
--
黒田努
(2008/04/07)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- Rails はエンタープライズの世界で主流になるか (2008/03/29)
- Rails 2.0 ベンチマーク (2008/03/30)
- テスト駆動開発とデバッグコード (2008/04/07)
- Git or Mercurial (2008/04/22)
- RESTful Ruby on Rails -- その美しさと難しさ (2008/04/23)
- RESTful Ruby on Rails -- 単数と複数 (2008/04/24)
- Rails のソースコードを読む (2008/05/02)
- sudo: no passwd entry for app! (Capistrano 2.3.0) (2008/05/12)
- Rails on GlassFish (2008/06/18)
- 「Ruby は型宣言がないけど、ちゃんとしたシステムに使えるのか」という質問にどう答えるか (2008/11/23)
- 「Ruby はスクリプト言語だけど、遅くないですか」という質問にどう答えるか (2008/11/24)
- どのプログラミング言語が将来的に有望か (2009/01/10)
- どのフレームワークが将来的に有望か (2009/01/11)
- フレームワーク対 CMS (2009/01/12)
- Rails 2.3 で spawner/reaper は DEPRECATED に (2009/03/25)
- db/seeds.rb (2009/06/08)
- LESSとSass (2009/08/03)
- Rails 2.3.4 と I18n (2009/08/15)
- RubyGems のアップデート(上書きインストール) (2010/02/03)
- クリエイティブ・コモンズの Rails 教材 (2010/03/08)
- Yet Another Ruby Reference (2010/03/12)
- Rails で MongoDB を使ってみた (2010/03/23)
- Rails で MongoDB を使ってみた(2) (2010/03/25)
- 祝 Ruby on Rails 3.0 beta2 リリース (2010/04/02)
- Rails 3.x 時代のテストフレームワーク (2010/04/24)
- 続・Rails 3.x 時代のテストフレームワーク (2010/05/06)
- Test::Unit と RSpec と Shoulda (2010/05/06)
- Windows + Rails + MySQL 5.1 (2010/07/20)

