TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング のメモ https://www.youtube.com/watch?v=Q-FJ3XmFlT8
基調講演とライブコーディングがあったので手元で確認した
基調講演(まとめ)
問題を小さく分割する
歩幅を調整する
テスト→仮実装→三角測量→実装
テスト→仮実装→実装
テスト→明白な実装
テストの構造化とリファクタリング
ライブコーディング
FizzBuzz問題をテスト駆動開発で実装
デモではJava, JUnit, Eclipceを使用してコーディング
まずは要件をToDoリストに落とし込み、リストを元に実装していく
code: 要件
1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzzとプリントすること」
↓
code:Todoリスト
TODO
========
テスト容易性:高 重要度:高
- x 1を渡すと文字列"1"を返す -> 仮実装 - x 2を渡すと文字列"1"を返す -> 三角測量 - x 3の倍数のときは数の代わりに「Fizz」に変換する - x 3を渡すと文字列"Fizz"を返す -> 仮実装 -> 実装 - x 5の倍数のときは数の代わりに「Buzz」に変換する - x 5を渡すと文字列"buzz"を返す -> 明白な実装 - x 3と5両方の倍数のときは数の代わりに「FizzBuzz」に変換する テスト容易性:低 重要度:低
- 1からnまで
- 1から100まで
- プリントする
RSpecで書いてみる
デモはJavaなのでruby、RSpecを使用してテストを書いてみる
ライブコーディング動画の最後まで
specの書き方をJUnitの最終出力結果と合わせた
code:fizz_buzz_spec.rb
require './lib/fizz_buzz'
describe 'fizz_buzz' do
describe 'convertメソッドは数を文字列に変換する' do
context "3の倍数のときは数の代わりにFizzに変換する" do
it "3を渡すと文字列Fizzを返す" do
expect(fizz_buzz(3)).to eq 'Fizz'
end
end
context "5の倍数のときは数の代わりにBuzzに変換する" do
it "5を渡すと文字列Buzzを返す" do
expect(fizz_buzz(5)).to eq 'Buzz'
end
end
context "15の倍数のときは数の代わりにFizzBuzzに変換する" do
it "15を渡すと文字列fizzBuzzを返す" do
expect(fizz_buzz(15)).to eq 'FizzBuzz'
end
end
context "その他の数のときはそのまま文字列に変換する" do
it "1を渡すと文字列1を返す" do
expect(fizz_buzz(1)).to eq '1'
end
it "2を渡すと文字列2を返す" do
expect(fizz_buzz(2)).to eq '2'
end
end
end
end
-f documentation コマンドでドキュメント形式で結果を出力
.rspec に --format documentation を記述するとオプション不要
code:rspec spec/fizz_buzz_spec.rb -f documentation
% rspec spec/fizz_buzz_spec.rb -f documentation
fizz_buzz
convertメソッドは数を文字列に変換する
3の倍数のときは数の代わりにFizzに変換する
3を渡すと文字列Fizzを返す
5の倍数のときは数の代わりにBuzzに変換する
5を渡すと文字列Buzzを返す
15の倍数のときは数の代わりにFizzBuzzに変換する
15を渡すと文字列fizzBuzzを返す
その他の数のときはそのまま文字列に変換する
1を渡すと文字列1を返す
2を渡すと文字列2を返す
Finished in 0.00269 seconds (files took 0.2359 seconds to load)
5 examples, 0 failures
感想
テスト駆動開発の概要
ライブコーディングでToDoリストへの落とし込み方やリファクタリングがスムーズすぎて、自分が書く時や実務のコードを書く時にこんなスムーズにはいかないよな〜、と思った
やり方や練習方法などについても質問、回答があったが、地道に意識しながらトライしてみて身に着けるしかない
RSpecの書き方
次に context です。context は describe のエイリアスでしかありませんが使う目的が違います。ひとことで言うなら、 describe はテストする対象をあらわし、 context はテストする時の状況をあらわします。
他人にわかりやすいテストコード、仕様書の役割を担えるテストコードを書くにはdescribe、contextなどの正しい書き方を理解する必要があるので、ドキュメントや実際に書かれているコードを見て理解を深めていきたい