TDDとは
TDDとはTest Driven Developmentの略語で、日本語ではテスト駆動開発と呼ばれます。Wikipediaによれば以下のように説明されています。
プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。
そもそもテストは「テストする対象」がないと始めようがないので、まず機能を実装して、その後ちゃんと動くことを確認するためにテストを書く、という順序が道理に適っているように聞こえます。
それに対してTDDは、機能そのものが存在しない状態で「テストだけを先に」書いてしまい、そのテストを通すことを目的に最小限の実装を行う… というサイクルを繰り返すことによりプログラムを作成する開発手法です。一見「なんでそんなことをするのか」と不思議ですが、以下の様なメリットがあります。
- 設計(= あるべき状態)をテストとして記述するためゴールを見失わない
- 作業が小さくかつ明確なので手が止まりにくい
- 「常にテストされている状態」で実装されていくためプログラムが堅牢
TDD自体はどんなテストライブラリでも使えますが、minispecを使って実際にフィボナッチ数を求めるプログラムを書いてみましょう。
TDDのサイクル実例
まずゴールを確認します。フィボナッチ数とは、以下のように定義される数列の要素です。
fib
この数列はフィボナッチ数列(フィボナッチすうれつ、Fibonacci sequence)と呼ばれ、
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …(オンライン整数列大辞典の数列 A45)
と続く。最初の二項は0,1と定義され、以後どの項もその前の2つの項の和となっている。
fibonacciという名前のメソッドに引数nを与えると、n番目のフィボナッチ数を返すことをゴールとします。
最小限から始めましょう。とりあえず0番目の数値は0だと言ってるので、テストケースassert_equal 0, fibonacci(0)
を記載します。最初はfibonacciメソッド自体の中身はカラで構いません。
これを実行すると、当然ながら失敗します。
nilじゃなくて0を返したい、とのことなので0だけ記述します(そんなんでいいのか、というくらい「言われたことしかやらない」のがポイントです)。
これでとりあえず通過します。
次に n = 1
のテストケースを追加して、同様に最低限の実装をします。
次にn=40
までのテストケースを追加します。
さて、n = 2
以上は決め打ちでは対応しきれそうにないので「n番目のフィボナッチ数はn-1番目とn-2番目の和である」という定義式をそのまま書いてしまいます。
これでテストは通過し、実装完了です。なんとなくTDDの手順は掴めたでしょうか。
最後のページでは、ここで書いたコードのリファクタリングを行います。