「テスト駆動開発」を読んでサンプルコードを Golang で真似してみた

2020-12-23

開発手法の勉強のはじめの一歩として「テスト駆動開発」を読みました。 また、書籍中の Java コードを Golang に置き換えて真似してみました。

テスト駆動開発 (TDD) とは

テストを軸に、以下のフローを繰り返して開発を進める方法です。

  1. テストを 1 つ書く
  2. テストを走らせて失敗を確認する
  3. 小さな変更を行う
  4. テストの成功を確認する
  5. リファクタリングで重複を除去する

決してテストを書くことが目的ではなく、このサイクルを回すことで「動作する」「きれいな」コードを書くのが目的です。

実装したい要件を 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 著、和田卓人訳
bookmethodgolang

2020 年の振り返りと来年の目標

株式会社 AIoT に長期インターンとして参加して 1 ヶ月が経った