チェリー本 3章 その2

前の章で書いたFizzBuzzプログラムをのテストを自動化していく

現状のコード

def fizz_buzz(n)
  if n % 15 == 0
    "Fizz Buzz"
  elsif n % 3 == 0
    "Fizz"
  elsif n % 5 == 0
    "Buzz"
  else
    n.to_s
  end
end

p fizz_buzz(1)
p fizz_buzz(2)
p fizz_buzz(3)
p fizz_buzz(4)
p fizz_buzz(5)
p fizz_buzz(6)
p fizz_buzz(15)

=>
"1"
"2"
"Fizz"
"4"
"Buzz"
"Fizz"
"Fizz Buzz"

上のコードにテスト環境を入れていく

require "minitest/autorun"

class FizzBuzzTest < Minitest::Test  #FizzBuzzTestクラスを定義
  def test_fizz_buzz #test_fizz_buzzを定義
    assert_equal "1", fizz_buzz(1) #fizz_buzzメソッド引数に1を呼んだ時 "1"が表示される??
    assert_equal "2", fizz_buzz(2)
    assert_equal "Fizz", fizz_buzz(3)
    assert_equal "4", fizz_buzz(4)
    assert_equal "Buzz", fizz_buzz(5)
    assert_equal "Fizz", fizz_buzz(6)
    assert_equal "Fizz Buzz", fizz_buzz(15)
  end
end

####結果
Run options: --seed 64884

# Running:

.

Finished in 0.001210s, 826.4463 runs/s, 5785.1240 assertions/s.

1 runs, 7 assertions, 0 failures, 0 errors, 0 skips

##テストは通っています。

ちゃんとテストが正しいか失敗してみる。

assert_equal "Fizz Buzz", fizz_buzz(16) #16を渡してみる。

1) Failure:
FizzBuzzTest#test_fizz_buzz [fizz_buzz.rb:23]:
--- expected
+++ actual
@@ -1 +1,3 @@
-"Fizz Buzz"
+# encoding: US-ASCII
+#    valid: true
+"16"

"Fizz Buzz"が期待した結果ですが
"16"が表示されているからテストは正しいことがわかる。

プログラムとテストを分離する

テストも終わり無事望んだ結果だが今の現状テストとプログラムが一緒になっているので
テストはテスト、プログラムはプログラムと別々に分ける必要がある。

今のファイル構造

fizz_buzz.rb

def fizz_buzz(n)
  if n % 15 == 0
    "Fizz Buzz"
  elsif n % 3 == 0
    "Fizz"
  elsif n % 5 == 0
    "Buzz"
  else
    n.to_s
  end
fizz_buzz_test.rb

equire "minitest/autorun"
class FizzBuzzTest < Minitest::Test
  def test_fizz_buzz
    assert_equal "1", fizz_buzz(1)
    assert_equal "2", fizz_buzz(2)
    assert_equal "Fizz", fizz_buzz(3)
    assert_equal "4", fizz_buzz(4)
    assert_equal "Buzz", fizz_buzz(5)
    assert_equal "Fizz", fizz_buzz(6)
    assert_equal "Fizz Buzz", fizz_buzz(15)
    assert_equal "16", fizz_buzz(16)
  end
end

分離した後
テストを走らせると
エラーになる...

# Running:

E

Finished in 0.001552s, 644.3299 runs/s, 0.0000 assertions/s.

  1) Error:
FizzBuzzTest#test_fizz_buzz:
NoMethodError: undefined method `fizz_buzz' for #<FizzBuzzTest:0x00007f812d856a00>
    test/fizz_buzz_test.rb:5:in `test_fizz_buzz'

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips

定義されてないfizz_buzzメソッドがあるよって教えてくれている。
プログラムファイルは別の世界に行ってしまったので取り込む必要がある。

fizz_buzz_test.rbにfizz_buzz.rbを読み込んでいく

require "minitest/autorun"
require "./lib/fizz_buzz.rb"
class FizzBuzzTest < Minitest::Test
  def test_fizz_buzz
    assert_equal "1", fizz_buzz(1)
    assert_equal "2", fizz_buzz(2)
    assert_equal "Fizz", fizz_buzz(3)
    assert_equal "4", fizz_buzz(4)
    assert_equal "Buzz", fizz_buzz(5)
    assert_equal "Fizz", fizz_buzz(6)
    assert_equal "Fizz Buzz", fizz_buzz(15)
    assert_equal "16", fizz_buzz(16)
  end
end



### テスト通った!!!
Run options: --seed 60808

# Running:

.

Finished in 0.002517s, 397.2984 runs/s, 3178.3870 assertions/s.

1 runs, 8 assertions, 0 failures, 0 errors, 0 skips

3章を通して...

人間が手作業や目視で確認すると時間もかかるし
間違いを犯すことがある
機械に任せるとテストが一瞬で終わるし
間違いを犯すこともない。
何回テストをやらせても文句も言わない。
テストコードを書くには手間がかかるが
その分見返りが大きいので積極的に使って行きたいと思います。

需要はRspecの方があるので
まずはでテストの概念をつかんで後々Rspecをガシガシ書いていきたいと思います!
お疲れ様でした!

第4章も頑張ります!