学習用にこちらの「50分でわかるテスト駆動開発」を元に、RSpecとRubyに書き直して作成したものです。
わかりやすい動画を作成していただいた@t_wadaさんに感謝します。
https://channel9.msdn.com/Events/de-code/2017/DO03?ocid=player
RSpecでのテスト駆動開発のテストを目的としたもののため、Rubyのコードは冗長な部分があります。
次のFizzBuzz問題をテスト駆動開発で実装をおこないました。
1から100の値を出力する。
ただし、値が3の倍数なら"Fizz"、5の倍数なら"Buzz"、3と5の公倍数なら"FizzBuzz"を出力する。
テスト駆動の流れは以下のようにおこないました。
- テスト内容のTODOリストを作成
- テストを作成し、"RED"(失敗)になることを確認。
- テストを"GREEN"(成功)になるように実装をおこなう。
- 今後のためにリファクタリングをおこなう。 一見無駄な作業に思えても、長い目でみると修正作業などで時間短縮になる。
- 次のタスクを 2. へ戻り以降繰り返す。
実装サイクル RED -> GREEN -> Refactoring -> RED ...
実装は以下の流れでおこないました。
- 仮実装(Fake It):仮の実装をおこないテストが通るようにする。
- 三角測量(Triangulation):簡単な実装を2つ以上おこない、テストが通るか確認する。リファクタリング時に不要ならば削除する。
- 明白な実装(Obvious Implementation):実際の実装をおこなう。
-
数を文字列にして返す
- 1を渡したら文字列”1”を返す
-
3の倍数の時は'Fizz'を返す
- 3の時は'Fizz'を返す
-
5の倍数の時は'Buzz'を返す
- 5の時は'Buzz'を返す
-
3と5の倍数の時は'FizzBuzz'を返す
- 15の時は'FizzBuzz'を返す
-
1から100までの数を使用する
- 1から100までを返す
-
標準出力をする
- 1を標準出力する
- 1から100までを標準出力する
FizzBuzzの出力までは参考した動画でおこなっていたので、書き直しのみでほとんどすみました。
1から100までの数を使用しているかの確認は実行する配列を取得しておこないました。
標準出力の確認で少し悩みましたが、標準出力のメソッドをオーバーライドしてカウント変数を追加。実行時にカウント回数を返すようにし確認をおこないました。
この実装でよかったのか今でも悩んでいます。
テスト駆動開発をおこなって、テストや保守が楽になりそうという面もありましたが、コードをいきあたりばったりで書かずにしっかり仕様を考えるようになるなと感じました。
RSpecを見直すことで、どのようなふるまいをコードに求めているかもわかりやすいため、後々自分やチームが困らないようにするためしっかり書いていきたいと思います。