「テスト駆動開発」を読んだ

「テスト駆動開発」を読んだのでその感想を書いておこうと思います。

テスト駆動開発
Posted with Amakuri at 2018.3.13
Kent Beck
オーム社

本の内容

「テスト駆動開発」では、3つのパートがあります。

  1. 多国通貨プログラムを通してテスト駆動開発(以下、TDD)を実践する
  2. xUnitというUnitテストツールをTDDを通して実装する
  3. TDDのデザインパターンについて

多国通貨プログラムを通してTDDを実践する

TDDでの開発の流れを体感するために、多国通貨プログラムという為替計算ツールをTDDを使って開発していきます。
使用言語はJavaです。

TDDの開発の流れというのは以下のようなものです。

  1. まずテストを1個書く
  2. すべてのテストを走らせ、新しいテストの失敗を確認する
  3. 小さな変更を行う
  4. すべてのテストを走らせ、すべて成功することを確認する
  5. リファクタリングを行って重複を除去する

この流れをひたすら繰り返していきます。
どういう単位でテストをしていくのかが、筆者の思考を交えて解説されてます。

xUnitというUnitテストツールをTDDを通して実装する

TDDで使用するユニットテストツールを、TDDを使って実装していく という内容です。

使用言語はPythonです。
Pythonの解説も入るので、Pythonを知らなくても実践することができます。

このパートでも、TDDの流れに沿って開発していきます。
パート1よりも実践的です。

TDDのデザインパターンについて

このパートは、実践形式ではなく読み物となってます。
内容は以下のようになってます。

  • そもそも「テストする」とは?いつ「テスト」するのか?というTDD自体の考え方
  • TDDのデザインパターン(このパターンはこうテストする など)
  • リファクタリングの方法
  • TDDを身につけるためのエッセイ集

感想

この本を取ったきっかけは、前回の記事「「Ruby on Railsチュートリアル」が最高の学習教材だった 」で
テスト駆動開発を実践し、「自動テストによる安心感」を感じたからでした。

そしてこの本を読んで得たものは以下のようなものです。

  • 「なにはともあれまずはテストを書く!」という意識
  • 自分のTDDの考え方が間違えていたという認識
  • 手を動かすことの大切さ

「なにはともあれまずはテストを書く!」という意識

なにか要件があったとして、「それを実装するにはどうしたらいいんだろ?」と考えていくのが今まででした。
まず実装方法を考えていくのは、TDD的にNGで
「まずはテストを書き、失敗したうえで、そのテストを満たす実装を行う」が正しいTDDと感じました。

そしてこの流れでプログラムを実装していって気づいたことは、
テストは設計なんだ」ということです。

この本の付録Cでも書かれていましたが、
TDDの「テスト」とはアプリケーションの「テスト」ではなく
「ふるまい(Behavior)」のことです。

ロジックのふるまいを定義するのがTDDの「テスト」であり、ふるまいはすなわち設計です。

実装の前には当然設計はするべきで、だからこそ「まずはテストを書く!」という意識が大事だと感じました。

自分のTDDの考え方が間違えていたという認識

「テストを最初に書くのがTDDである」という誤解をしていました。
これは付録Cでも言及されていたことで、自分以外にもそのような誤解をしているケースは多いようです。

そしてこの本を通じて理解したのが、TDDとは「開発者の不安を和らげる手法」だと思いました。

「なんかこの関数イケてないから直したいけど、使ってる箇所いっぱいあるな…影響わからんからやっぱり触らないでおこう…」
というのはよくあることだと思うんですが、TDDを通して自動テストを用意しておくと
このようなリファクタリングを行うため際の不安が一気に減ります。

こういう認識がないと、最初に書いたような誤解をしてしまい、形骸化していってしまうのだなぁと思いました。

手を動かすことの大切さ

これまた付録Cに書かれていましたが、TDDでは手を動かすことが非常に大事です。
手を動かすことで上記の「不安を和らげるもの」というのが実感できるようになります。

また写経についても言及されていました。
この「テスト駆動開発」では写経を行うと、筆者のTDDのやり方を「追体験」できます。

僕もパート1と2は写経しました。
https://github.com/morix1500/tdd-practice

パート1はJavaで行うんですが、そのままやったんじゃ面白くないだろうと思い「Go言語」で行いました。
Go言語の勉強にもなり一石二鳥でした!

最後に

この「テスト駆動開発」を読んでTDDに対しての理解が深まりました!

また何度も「付録C」のことを言及しましたが、これは翻訳を行った和田卓人さんが書いた付録「テスト駆動開発の現在」のことです。
原書の出版から約15年経っているということで、今までのTDDの歴史やTDDのこれからについて記載されています。

TDDをすでに実践してる人でも、この付録Cのためだけにこの本を買ってもいいのでは と思わせる素晴らしい内容でした。

「TDDはスキルである」と書かれていましたが、今回実践してみて本当にそうだなと思いました。
やりつづけないと身につかないものだと思うので、今後はTDDを用いて開発をしていきたいと思います(`・ω・´)

では!