前書き
最近、テスト駆動開発の本を読み始め、個人の開発で実践してみています。
まだまだTDD初学者ではありますが、すでに多くの魅力を感じているので、それらを共有したいと思います。
※サンプルコードはあえて載せておりません。あまりシンプルな短いサンプルではTDDの魅力を表現できませんし、長いコードはブログが読みづらくなるだけですので・・・
TDDに触れたきっかけ
初めてTDDという言葉を目にした時から、どんなものか気になっていました。また、ユニットテストを書く意義がいまいち掴めておらず、開発の助けになるような有効なテストを書けるようになりたいな、と思っていたところ、先日読んだCleanCoderの本で、TDDを強く勧められていたので、勉強を始めようと思いました。すると、なんと、会社の本棚にこの本があったのです。これはすぐ読まねば。
- 元々興味があった
- 有効なテストを書きたかった
- CleanCoderで勧められていた
- 会社の本棚にあった
TDDってこんなことらしい
TDDとは、Test Driven Development(テスト駆動開発)の略です。
TDDでの開発手順を簡単に書くと、以下の通り。
- テストを書く
※テストはassertから書き始める(ゴールを第一に) - コンパイルを通すことだけを考える
- 汚いコードでもいいから、テストを通すことだけを考える
- コードを綺麗にする
- テストも綺麗にする
上記を繰り返すうちにコードも設計も綺麗になって、テストカバレージも高くなる、魔法のような開発手法です。
※詳しくは本を読んでみてください。
TDDの魅力 〜実装を助けるという視点〜
1. TDDに触れる前の自分の迷いが解消された
TDDに触れる前は、テストを書く意義がわかっていませんでした。何をどうテストしたら良いんだろう?これって、単なる実装のコピーじゃないの?といつも疑問に思いながら、漫然とテストコードを書いていました。
「何をテストしたら良いのかわからない」これが大きな障壁だったんじゃないかと思います。コードを実装した後に書くテストコードって実装ありきになるから、機能を担保するのではなく、実装の細部を担保したあまり意味のないテストばかりになってしまいます。(プロのテスターに怒られるかも?)
でも、TDDの場合、まずは必要な機能をテストコードに表現し、それから実装に入るので、テストコードが絶対に壊れてはいけない機能を守ってくれるようになります。そのおかげで、テストを書く意義がわからなかった僕の迷いは解消されました。
2. 自信を持ってリファクタを進められる
TDDでは、必要な機能を表現したテストに守られているので、リファクタで機能が壊れてしまうことはかなり減ります。
確かに、テストを書く能力の低い今では、リファクタで機能を壊してしまうこともあります。でもそれは、テスト力を鍛えるチャンスです。成長の糧を得られますし、以降はより強固なテストに守られて開発をすることができるようになります。
リファクタへの心理的抵抗も大きく減り、リファクタに挑戦しやすくなったように感じています。
3. 達成感を得られやすい
実装を進める中、画面で確認しづらい機能もたくさんあると思います。そういう機能って、手動ではなかなかテストしづらいし、全部の機能が組み上がるまで、ちゃんと動いているのかわからないことってよくあると思います。
ですが、TDDの場合、可能な限り全ての機能をテストファーストで書くので、テストを走らせるだけでグリーンの文字が成功を伝えてくれます。実践してみるとわかると思いますが、テストが動くたびに達成感を得られるようになります。
4. バグの対処をしやすい
TDDでは、バグが発生すると、まずはバグの内容をテストで表現し、それから実装の修正を行います。先にテストを書くステップが入るので、バグの根本原因に気付きやすくなります。
ここがおかしいかも、というぼんやりとした理解から、はっきりと具体的なテストに落とし込む過程で、バグの原因をちゃんと認識できるようになるためです。
5. バグに遭遇するたびにテストを書く力が磨かれる
バグにぶつかり、テストをブラッシュアップしていくうちにテストを書く力がついていきます。最初にテストを書く時に、この機能もテストに書くべきだったな、と気づけるのですが、これって仕様を把握する能力にもつながるので、とても重要なことだと思います。
以上が、TDDに触れ始めた僕の感じているメリットです。
まとめ
TDDでは、開発ステップやコードの記述量が増えるので、初期の実装コストは膨らむかもしれません。でも、プログラムというのは長く生き続け、成長していく物だと思うので、最終的にはコストの削減につながるのではないかと思っています。
また、TDDの効果は、開発コストに対する効果よりも、プログラマ自身を成長させる効果の方が大きいんじゃないかと思っています。そういう意味では、とりあえず、みんな一度は学び、実践してみる価値があると思います。その後、最終的にTDDをやめたとしても、それまでにTDDをした経験は活きていくんじゃないかな、と期待しています。
以上、他の初学者の皆様の参考になれば幸いです。