第 1 章: TODO リストと最初のテスト¶
1.1 はじめに¶
この章では、FizzBuzz 問題を小さな TODO リストに分解し、ExUnit で最初のテストを書きます。TDD の最初の一歩は、いきなり実装することではなく、失敗するテストから始めることです。
1.2 FizzBuzz の仕様と TODO リスト¶
対象の仕様は次のとおりです。
1 から 100 までの数を出力する。
3 の倍数は Fizz、5 の倍数は Buzz、3 と 5 の両方の倍数は FizzBuzz を出力する。
まずは仕様を TODO リストに分解します。
- 数を文字列として返す
- 3 の倍数で Fizz を返す
- 5 の倍数で Buzz を返す
- 15 の倍数で FizzBuzz を返す
- 1 から 100 までの結果をリストで作る
最初のタスクとして「1 を渡すと文字列 1 を返す」だけを扱います。
1.3 ExUnit の基本¶
Elixir では mix new で作成したプロジェクトに ExUnit が標準で含まれます。最小のテストは test マクロと assert マクロで書けます。
# test/fizz_buzz_test.exs
defmodule FizzBuzzTest do
use ExUnit.Case
test "1 を渡すと文字列 1 を返す" do
assert FizzBuzz.generate(1) == "1"
end
end
testはテストケースを定義します。assertは期待値を検証します。
1.4 mix test の使い方¶
テスト実行は mix test を使います。
$ mix test
この時点では FizzBuzz モジュールが未実装なので、テストは失敗します。これが Red です。
1.5 Red から Green へ¶
Red: 最初の失敗するテスト¶
先ほどのテストを実行すると、例えば次のように失敗します。
** (UndefinedFunctionError) function FizzBuzz.generate/1 is undefined
Green: 仮実装で通す¶
まずは最小限の仮実装でテストを通します。
# lib/fizz_buzz.ex
defmodule FizzBuzz do
def generate(1), do: "1"
end
再度 mix test を実行します。
$ mix test
1 件のテストが成功すれば Green です。まだ汎用的ではありませんが、TDD ではこの小さな成功を積み重ねます。
1.6 まとめ¶
この章では、TODO リスト駆動で最小タスクを切り出し、ExUnit の test / assert と mix test の基本を確認しました。さらに、最初の失敗するテストを書いてから仮実装で成功させる Red → Green を体験しました。