あらためてTDD(テスト駆動開発)について考える機会のあった@HIROCASTERでございませう。
プログラマーであれば「動作する綺麗なコード」を書き続けたいでしょう。それを実現するスキルとして、テスト駆動開発があります。このテスト駆動開発を身につけるには、実際に体験することが、もっとも有効です。
ですが、新しいことに挑戦するためには、それなりの苦労や努力が必要です。それを乗り越えるための動機になるようなことをお伝えしたいと思います。
ケント ベック、Kent Beck、長瀬 嘉秀、テクノロジックアート |
TDDがアジャイル開発では前提
ここまでに説明した、アジャイル開発を支えるエンジニアリングのプラクティスをまとめておこう。
- ユニットテスト
- リファクタリング
- テスト駆動開発(TDD)
- 継続的インテグレーション
これら4つを実践することなしにアジャイル開発を成功させることはかなり難しい。たちまち「書いて直す」だけの日々に逆戻りすることになるだろう。
アジャイルサムライでは成功させることはかなり難しいと甘い表現をされているが、ほぼ不可能であるといえる。
プラクティスとは習慣である。つまり、やることが当たり前なのである。やるべきことなのです。
テスト駆動開発を推し進めれば、必然とここにあげられている4つのプラクティスを実践することになる。
注意しなければいけないことは、テスト駆動開発をおこなうこと事態ががアジャイルソフトウェア開発ではありません。
アジャイルにソフトウェアを開発するためにエンジニア一人一人に求められるスキルやプラクティスとして、テスト駆動開発があるのである。
Jonathan Rasmusson、西村 直人、角谷 信太郎、近藤 修平、角掛 拓未 |
TDDはスキル
テスト駆動開発はハッカーのための技術ではない。バグも生み出さずにコードが書けるハッカーにとっては、テスト駆動開発は不要です。
むしろ、テスト駆動開発は普通のプログラマーが学んで身につけるスキルなのです。学んで実践すれば必ず身につくスキルなんです。
テスト駆動開発はチームや組織が得るものではなく、各個人が身につけるべきプログラマーとしての躾です。
挨拶や一般常識の躾は会社でも教えてくれることはあるだろうが、基本的には自ら学び身につけておくものとされています。それと同等です。
学ぶ機会を得ようと思えばあるはずなので、テスト駆動開発のイベントなどには率先して参加してみるべきでしょう。
TDDBC(Test-Driven Development BootCamp)というイベントでは1日以上かけて、日本のテスト駆動開発の第一人者である和田卓人氏を中心として、全国各地でおこなわれている。2011年に私も東京でホストした。
Agile渋谷でもペアプログラミングのイベントなども開催しており、TDDBCより座学はシッカリおこなってませんが、短い時間で手を動かして、テスト駆動開発を体験することを数多くおこなっています。要望を投げてくれれば、開催にむけて協力してくれるメンバーは数多くいるはずです。
世界的に見れば、ソフトウェアにテストがあることは常識
オープンソースの世界を見れば、自動テストが書ける能力があるというのは常識になりつつあります。現在、多くの有名なソフトウェアが基本的にはテストコードを含めたパッチでなければ、取り込んではくれません。
テスト駆動開発の目的は「動作する綺麗なコード」
TDDの皮肉の1つは、TDDがテスト技法ではない(カニンガム考案)ことである。TDDは分析技法および設計技法であり、実際には開発のすべてのアクティビティを構造化するための技法である。
なんか難しいこと書いてありますよね。簡単に理解しておきたことをピックアップしましょう。
- テスト駆動開発はテスト技法ではない
- テスト駆動開発は分析技法、設計技法である
- テスト駆動開発は開発行為を促進するための技法である
テスト駆動開発をしているからといって、ソフトウェアテストが完璧ということではありません。これは別途テストの専門家がテストをおこなうべきであるので、それはそちらに任せましょう。
「動作する綺麗なコード」を得ることが目的で、それを達成すると副次的に得られるものが数多くあるということです。何が得られるのか、少し学んでみませんか?
プログラマーのためのプログラマーによるテスト
プログラマーのためのプログラマーによるテスト。これをデベロッパーテスティングと呼びます。これについては和田卓人氏がオブジェクト倶楽部にて過去に発表した資料が参考になります。
結局の所、テスト駆動開発はプログラマーのためのテストです。書き上げた製品コードの分析や設計が優れているか?より優れた形に変化できるか?を確認・変更するためのテストコードであり、結果として高品質なコードを生産できます。
そして、この行為は自動テストのコードがあるため、あらゆるソフトウェア開発の行為を促進していく材料になります。例えば自動テストのコードがあることによって、継続的インテグレーションが可能になったり、テスト駆動開発によって密結合せずにコードが組み立てられていれば、変更修正が容易になります。
まとめ
アジャイルソフトウェア開発が海を越えた世界でおこなわれている、憧れの開発手法であったのは過去の話です。
21世紀にプログラマーとして生き残るためには、テスト駆動開発は必須のスキルとなりました。
次回はテスト駆動開発というスキルを、どのように身につけるかいくつか具体的な方法を書く予定です。
テスト駆動開発について、質問や疑問、こういった記事を書いて欲しいという要望があれば、Twitterかこちらに投げてください。喜んで、記事を書きたいと考えています。
ケント ベック、Kent Beck、長瀬 嘉秀、テクノロジックアート |
Christian Johansen、長尾高弘 |