テスト駆動開発(TDD)とは
開発手法の1つです。
まず以下の内容は古いです。 その後に実際にTDDやってみての考えを書きます。
理解はするが同意できない
ちゃんと読んだわけではないので間違ってるかもしれない前提で書きます1。 個人的には理解はしますが、ちょっと同意できない感じです。
同意する点としては、単体テストの重要さです。 これは言うまでもありません。単体テストを書けるのは常識です。
同意できない点としては、もちろん「テスト・ファースト」です。 なぜかというと、先にテストを書くことで、構造が縛られてしまうからです。
自分がコードを書くとき、 特にライブラリを開発するときは、以下のような流れのことが多いです。
- 必要なクラスを作っていく
- 構造ができるまで仮実装を組み立てていく
- 基本は「型」重視です。要はメソッドの引数と戻り値が合うかどうか。
- 細かいロジックを積み立てて、正常系処理を通るようにする
- これ以降の流れでも、必要なら構造を見直す
- Value Objectのロジックについては、この時点でテストを追加することもある。
- 正常系が通るためのテストを追加する
- エラー処理を追加し、エラー処理のテストを追加する
- コードを洗練させていく
- ログ
- コメント、Javadoc
- 引数の検証(IllegalArgumentException)
- テストカバレッジの追加
自分にとってのプログラミングで重要なのは、1〜3の作業です。 最初にどんなクラスが必要か、どんなメソッドは作ってみないと分かりません。 まず利用者にとって使いやすい構造、 保守しやすい構造を作り上げてから、初めて細かい実装を積み上げていきます。 自分がテストケースを書くときは、早くても3の段階です。
テストを先に書いてしまうと、この作業ができなくなってしまいます。 あるいは、テストを書いたけれど、破棄しないといけない例が出てきます。 だから、自分としては、「テスト・ファースト」は同意できません。
TDDは死んだ?
Ruby on Railsの作者の通称DHHさんが書いた記事と、 それに対する反論があります。
この両方を読んだ自分の感想はこれです。 「テスト・ファーストは死んだ」
DHHの記事の前半はテスト・ファーストに対する批判ですが、 後者の反論では、その点はスルーされています。 つまり、その点については反論するところはなかったからだと思います。
TDD本を写経して考えが変わった
その後「テスト駆動開発」の本を読み、本の通りに実装してみました。
すると、テスト駆動開発が何を目指していたのかが理解できました。 自分としてのテスト駆動開発のメリットは「使う側に立ったインタフェースを作るため」です。 実装から入るとどのようなコードを書いた方がいいか分からない、 そういうときにテストから入るとスムーズに行く、 だからこそテスト「駆動」開発かなと。テストが開発をdriveする。
ただ、テストを先に書くかどうかは分からないんですよね。 それなりに経験を積むと「自明な実装」が増えてくるので。
参考文献
-
まあそれなりの記事は読みましたが、 ↩︎