開発手法の勉強のはじめの一歩として「テスト駆動開発」を読みました. また,書籍中のJavaコードをGolangに置き換えて真似してみました.
テスト駆動開発(TDD)とは
テストを軸に,以下のフローを繰り返して開発を進める方法です.
- テストを1つ書く
- テストを走らせて失敗を確認する
- 小さな変更を行う
- テストの成功を確認する
- リファクタリングで重複を除去する
決してテストを書くことが目的ではなく,このサイクルを回すことで「動作する」「きれいな」コードを書くのが目的です.
実装したい要件をTODOリストなどで管理して,1つずつテストを書いてはパスさせてリファクタリングするサイクルを回して実装し,最終的に全ての要件を満たす(動作する)きれいなコードを作り上げます. 実装の始めはテストで欲しい値をベタ書きする「無理やり」なコードを書くことさえありますが,変数を使うなどしてテストとコードの重複を徐々に減らし,様々なテストに対応できる実装にしていきます.
変に先のことを見据えて使いもしない汎用的なコードは書かない,テストで使われない余計な部分は実装しなくて良いというスタンスです. その時々に必要なコードが必要なだけ書かれるので,うまくハマればきれいなコードが書けるというわけです.
TDDの実際の例は書籍やネットの記事でいくらでもあると思うので,そちらを見ていただければと思います.
サンプルコードをGolangで
第1部(他国通貨)の内容を読んだ後,理解を深めるためにもう一度読みながらGolangで真似て書いてみました. 書籍の方ではJavaを使っており,クラスの継承のあたりでGolangと実装が食い違ってしまうのに苦労しましたが,本来の目的は「テストとテストにパスするコード」を書くことなので,無理に内部実装を一致させようとはせず仕様を満たす方を重視してGolangで頑張って書ききりました.
GitHubに上げているので見ていただけると嬉しいです.
感想
この本は3部構成となっており,第1部では他国通貨の加算や為替の実装を例にTDDの実例を,第2部ではテスティングフレームワーク"xUnit"のPythonによる(もちろんTDDで)簡単な実装を,第3部ではTDDの様々なパターンや心がけなどを学べます. 第1部と第2部はコードを書きながらだったのでTDDの雰囲気は掴めましたが,第3部は読むための事前知識(設計パターンなど)がほとんどない自分にはまだ早い内容に感じました. 色々な開発手法を知ってからもう一度読むと新たな発見があるのではと思います.
この本を読んでから,インターンでプロダクトの機能追加を担当した際にTDDを実践してみました. まずテストを書き,汚くてもテストが通るコードを書いてパス,徐々に要件を満たすきれいなコードを書くという流れに沿うと,やるべきことが明確になって非常に取り組みやすかったです.
テスト駆動開発それ自体も良い手法なのですが,それ以前に「〇〇駆動開発」といった開発手法は,「なんかこのプログラム書くの面倒くさいなー」というときに,余計なことを考えずに手を動かして成果を出せるようなフレームワークなのかなと感じました.
また,TDDを実践したからといって書籍中のコードのようにきれいなコードが書けるかというとそうでもない気はしています.
筆者自身,何度も何度もコードをゼロから書くことでより良い書き方を思いついたと述べていますし,特に他国通貨の例でのExpression
の発想はパッと出てくるものではないと思います.
TDDはあくまでもコードの信頼性を保ちつつ品質を高めていくための手法であり,賢い実装方法を思いつくための拠り所にまではならないと解釈しました.
とはいえTDDはなかなか好感触だったので,業務でも趣味の開発でもスキを見つけたら実践してみるつもりです. まずは個人で作成したプログラムにテストを追加(というかテストの導入から)してみてリファクタリングすることから始めていこうかなと思います.
参考文献
- テスト駆動開発 Kent Beck著, 和田卓人訳