テスト駆動開発,それはエンジニアの精神安定剤。
はじめに
はじめまして,エンジニアの遠藤和真です。
地方公立高校から東大に合格し,東大で修士号(工学)を取得しました。
新卒で就職したばかりですが,大学在学中からエンジニアとしてインターンをしていたり,研究でもシステム開発をしていたので,エンジニア歴は5~6年になります。
この記事で,テスト駆動開発の魅力をよく理解できていないエンジニアや開発に携わる方に,テスト駆動の魅力が少しでも伝わればと思います。
参考書籍としてKent Beck著「テスト駆動開発」を用い,この本の引用と個人的意見を交えていく形で進めていきます。
テスト駆動開発(TDD)とは
テスト駆動開発は,英語では”Test-Driven Development”といいます。
これは読んで字のごとく,開発において,テストを先に書こうということです。
まだこれだけではどういうメリットがあるのかは見えてきませんね。
TDDには2つのシンプルなルールがあります。
それが
- 自動化されたテストが失敗した時のみ新しいコードを書く
- 重複を除去する
です。
自動化されたテストとありますが,テスト自動化はTDDの要です。TDDの中では何かコード(テストコードも含む)に変更があるたび,常にテストを行います。これはRegression Testと呼ばれるような性質を持つテストです。
さて,このルールだけでは少し見えてきづらいですが,実際の作業プロセスとしては,以下の3項目のサイクルになります。
- レッド
- グリーン
- リファクタリング
まず,テストを書きます。このテストは当然失敗します。多くのテストフレームワークではテスト失敗は赤色で表現されるため,テスト失敗はしばしば単に「レッド」と表現されます。
そして,テストが通るようなコードを書きます。テスト成功はレッドと同様の理由で単に「グリーン」と呼ばれます。この段階ではテストが通りさえすれば「きたない」コードを書いても構いません。たとえば,関数のユニットテストであればテストデータに即した値をreturnするだけのコードを書いてもOKです。
そして最後にリファクタリングをします。すなわち,グリーンを常に確認しつつ,「きれいな」コードに仕上げます。
これを繰り返していくのがTDDの作業プロセスです。これによりKent曰く「動作するきれいなコード」を作り上げることができます。
テスト駆動開発(TDD)のメリット
KentはTDDを「プログラミング中の不安をコントロールする」手法であると述べています。
僕もTDDで開発を始めてから,このことを日々実感しています。TDDが開発時の精神安定剤として機能するのです。この点がTDDの最大のメリットだと思います。
そしてこれにより開発のスピードが上がるというような副次的なメリットもあります。
こんな疑問を持つ方もいらっしゃるかもしれません。
「それってTDDのメリットではなくテスト自動化のメリットでは?」
これについては,先ほどのレッド・グリーン・リファクタリングというプロセスで考えてみると,リファクタリングの前にグリーンを出すという部分が鍵になります。
すなわち,TDDではなく,例えば「開発→テストコード作成→テスト自動化しつつリファクタリング」というプロセスで開発をするとなると,「開発」の段階では自分のみを信じて開発をすることになります。もちろん自分を信じて疑わない方もいらっしゃることと思いますが,実際なかなかそうもうまくいかないものです。
一方TDDでは,この「開発」をすべて「リファクタリング」として行います。なぜなら,既にグリーンだからです。よって「開発」部分を自分のみを信じて行うのではなく,グリーンであることを確認しながら開発することができるのです。これがTDDが精神安定剤である所以です。
最後に
いかがだったでしょうか。このTDDの魅力は,やってみるととても実感することができます。ぜひ一度試してみることをおすすめします。TDDに興味を持たれた方はぜひKent Beck氏の「テスト駆動開発」を一読されることをおすすめします。さらにはTDDをさらに進めたBDDについて調べてみても面白いと思います。たとえばRubyのテストフレームワークであるRSpecはBDDの思想を元に作られています。
この記事で1人でも精神安定が得られるエンジニアが増えてくれたら嬉しいです。
最後まで読んで頂きありがとうございました!
Discussion