チェリー本 3章 その1

rubyだけではないがプログラムを書いていく中で必ずミスや今書いてるコードがちゃんと動作するか確認する必要がある。
人間が目視にて指先確認してもいいがコードが膨大になると途方に暮れるぐらい疲れるのでそこをコンピューターにやってもらう
間違いを指摘してくれるしメリットしかない。

テストを自動化してくれるテスティングフレームワークは今回はminitestを利用する。
rubyの標準装備のところもいい

テストを実施する流れ

① テスティングフレームワークにそって検証用のプログラムを書く

② ①の実行する。

③ 検証が正か負か報告する。

基本的なコード
今回のテストする内容は
小文字rubyが大文字RUBYになっているか確認するテスト

require "minitest/autorun"

class SampleTest < Minitest::Test
  def test_sample
    assert_equal "RUBY", "ruby".upcase
  end

end
  1. require ~ はテストライブラリーの読み込み

  2. class~最後のendmまでがテストクラス(テストの本体)

  3. SampleTestはクラスの名前、命名は自由基本的にテストの場合だとtestが名前に入ることが一般的

  4. ファイル名はクラス名と合わせることが基本 キャメルケースで記載すること。

  5. def ~から対象となるテストメソッドtest_で始めることが必須テストする内容が推測できるようにする。

  6. assert_equal "RUBY", "ruby".upcase
    が実行結果を確認する検証メソッドここではminitestが提供しているassert_equal メソッドを使って検証している。

assert_equal 期待する結果,テストする値や式

本書で使用するメソッドは

#aとbが等しいか?
assert_equal 

#aが真か?
assert a

#aが偽か?
refure a

テスト結果の確認方法

Run options: --seed 13685

# Running:

.

Finished in 0.001080s, 925.9259 runs/s, 925.9259 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
  • Running:の下の.がテストの進捗状況、今回はテスト一つだけなので一個
  • Finished~が実行スピード

最後のテスト実行結果のまとめ

  • 1:runs :実行したテストメソッドの件数
  • 1 assertions 実行した検証メソッドの件数
  • 0 failures 検証に失敗したテストメソッドの件数
  • 0 errors  検証中にエラーが発生したテストメソッドの件数
  • 0 skips skipsメソッドにより実行をスキップしたテストメソッドの件数

failuresとerrors が0であればテストは全部パスしたことになる。

テストの失敗パターン

assert_equal "RUBY", "ruby".capitalize #メソッド内の記載を変更、頭文字だけ大文字

Run options: --seed 61835

# Running:

F

Finished in 0.001417s, 705.7163 runs/s, 705.7163 assertions/s.

  1) Failure:
SampleTest#test_sample [fizz_buzz.rb:5]:
Expected: "RUBY"
  Actual: "Ruby"

1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
  1. まず失敗のFailure:  [fizz_buzz.rb:5]:で失敗したことを教えてくれる。
  2. 成功したときは.だったがFになってる
  3. Expected: "RUBY" 期待した結果
  4. Actual: "Ruby" 実際はこれ

テストが失敗した場合そのテストメソッドはそれ以上進まない。
テストメソッドが複数ある場合次に進む

実行中にエラーになった時

検証する前にエラーが出た場合
次のコードはエラーになる。

assert_equal "RUBY", nil.upcase #レシーバーをnilにする。そもそもnilは文字列じゃないからupcaseを呼べない

Run options: --seed 18496

# Running:

E

Finished in 0.001229s, 813.6696 runs/s, 0.0000 assertions/s.

  1) Error:
SampleTest#test_sample:
NoMethodError: undefined method `upcase' for nil:NilClass
Did you mean?  case
    fizz_buzz.rb:5:in `test_sample'

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
  1. 失敗時はFだったがEになった
  2. SampleTest#test_sample:でエラーが出た
  3. nilにupcaseは定義されていない
  4. fizz_buzz.rb:5:in `test_sample' 5行目でエラー

テストが失敗した時と同じでエラーが起きた場合次のテストメソッドがよばれる。

まとめ

  • テストを書くとコンピューターがどこでエラーが出たか親切に教えてくれる。
  • テストの結果には成功、失敗、エラーの3つが存在する。
  • 失敗、エラーが出たら次のテストメソッドが実行される。