Shin x Blog

PHPをメインにWebシステムを開発してます。Webシステム開発チームの技術サポートも行っています。

TDD を体験する本「テスト駆動開発」

TDD の原典である テスト駆動開発 が、t_wada さんによって再翻訳されるということで興味を持っていたところ、見本誌を送って頂きました。ありがとうございました。早速、拝読させて頂きました。

テスト駆動開発

以前の翻訳版である「テスト駆動開発入門」が出版された頃、XP 本や他の xUnit 本などは読んだのですが、本書は未読でした。テストをコードで書くことや自動化には興味があったので、おそらく手に取ったことはあったと思うのですが、購入には至りませんでした。

当時は、新しい開発プロセスの一つとしてテストの自動化を捉えていましたが、それを日々の開発で当たり前に行っている中で本書に触れてみてどのように感じるかという視点で読み進めました。

本書は、三部構成となっています。第 1 部 と 第 2 部 では、TDD を実践しながらコードを書き上げていく過程を解説しています。第 3 部は、テストに関する様々な話題がまとめらており、コラム集のようになっています。三部構成とはいったものの、今回加筆された付録 C も内容を考えると一つのパートとも言えるので、実質は四部構成といって良いかもしれません。

TDD でコードが実装されていく楽しさ

第 1 部では、通貨の演算を TDD で実装していきます。本文とコードが分かりやすいように記されているので、まるでライブコーディングを見ているような気分で読んでいきました。

Dollar の演算を実装し、Franc が追加され、相互に変換が加わりといった具合にコードが進化していく様は、まるで物語を読んでいるようで、先の展開が気になり、どんどんページをめくっていきました。最終的に、え、その形で終わり?と思ったところで、TDD を学ぶための例題だったことを思い出したくらいです。

コーディングを見ていく過程で自然と TDD のプラクティスを知ることができるというのは良くできた構成だと感じました。

xUnit の実装

第 2 部では、シンプルなテスティングフレームワークを TDD で実装していきます。日頃利用しているテスティングフレームワークのコア部分を実装するということで、題材としても想像しやすいですし、どのように実現するのか関心を持ちました。

setUp() と tearDown() を Template Method パターンで実装したり、テストスウィートで複数のテストケースをまとめて実行したりと、おなじみの機能の実装が体験できるのはいいですね。

2017 年のテスト駆動開発

今回の再出版に際して、t_wada さんが加筆されたのが、付録 C です。本書が初回出版された以後の TDD 界隈の流れ、そして現在の状況が解説されています。TDD / BDD などの流れが丁寧に記されていて、現在の状況にどのように繋がっているかが分かります。(もちろん、数年前にあった DHH の「TDD is dead. Long live testing.」にも触れられています)

特に、教条主義に触れた箇所はいいですね。TDD の話題では、教条主義的な立場から、これこそが TDD、それ以外は異端といったような意見が見受けられますが、まさにその中心となる本書で、教条主義化について触れられています。

この箇所では、教条主義的に本書や本道とされることのみを良しとするわけでもなく、また、反対に教条主義をただ批判するわけでもなく、現状を把握した上で一歩引いた視点で解説されており、バランスの取れた内容となっているのが、さすがでした。

この章は書き下ろしということで、文体含めて特に読みやすかったです。いつか、t_wada さんが、テストに関する書籍(より実践的な内容を含んで)を執筆されることを期待せずにはいられません。

写経

通読の後、Part1 と Part2 について写経を行いました。TDD は、当然ながら言語に依存するようなものではないので、PHP で実装してみました。リポジトリには、Makefile があるので、make コマンドで、依存解決とテスト実行ができます。

github.com

本書にもあるとおり、写経で実際にコードを書いてみると、また異なる印象を受けますね。特に、Part1 では、かなり歩幅を落として、小刻みにサイクルを回していくので、日頃の開発でテストを書くのとは異なるリズムで進めることになりました。これほど小さな歩幅でサイクルを回して進めることは無いので、これは面白い体験でした。

このスピード感の違いや違和感(自分のリズムとは違うという意味で)は、実際にコードを書いてみて、より感じる部分なので、本書を手にした方はぜひコードを書いて体験してみてください。

実は、見本誌(紙)とは別に電子版(PDF)を購入して、併用で読み進めたのですが、写経の時は紙の方が見開きで見ることができるのでやりやすかったです。

TDD はテスト技法では無い

皮肉なことに、TDD はテスト技法ではない。TDD は分析技法であり、設計技法であり、実際には開発のすべてのアクティビティを構造化する技法なのだ。

「テスト駆動開発」

本書を読む上で、また TDD を知る上で重要なのは、これですね。もちろん書籍内では、テストの書き方についても解説されていますが、テスティングフレームワークの機能を活用して、いかにテストを効率的に書くかという視点の書籍では無いと感じました。(ただ、実際のところ、テスト技法を知る本としての役割も果たしています。)

つまり、TDD を行うかどうかという話とテストを書くか書かないかは別ということです。

原著が登場した頃は、まだテストを書く文化がそれほど一般的ではなかったと思うので、このあたりが混同されがち(自分を含めて)だったと思うのですが、テストを書くということが一般化した今なら、テストで開発を推し進める TDD という開発技法がより正しく伝わるのではないでしょうか。

そういった意味では、2017 年の今に本書が登場したというのは何か意味があるようにも感じます。

さいごに

本書で感じた TDD の小気味の良いリズム感は気持ち良いものでした。日々の開発を TDD で行うかは別にしても、思ったように開発が進まない時や実装が難しいような場合に使える手法として持っておくと良いですね。

ときおり、開発を始める前の肩慣らしのように TDD で軽くコードを書いてみるというのも良さそうです。

テストを書いている人はもちろんのこと、テストを書いていなくとも開発手法に興味がある人は、ぜひ本書で TDD を体験してみてください。

テスト駆動開発

テスト駆動開発