Rubyテスト自動化とRspec入門
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
の3章をやっていきます。
今回のテーマは、テストの自動化です。RubyのMinitestを使ってどんどん自動化していきます。
ディレクトリ構造
テストコードのひな型
Rubyに標準実装されているMinitestには、ひな形があります。 基本的には下記のひな形に沿って書いていけば問題なし。
require ‘minutest/autorun’ class SampleTest < Minitest::Test def test_sample assert_equal ‘RUBY’,’ruby’.upcase end end
クラスの名前はキャメルケースで書き、ファイル名はスネークケースで書く。 また、メソッド名はtest_で始めること。 基本的に以下の書き方をする
assert_equal 期待する結果,テスト対象となる値や式
そのほかには以下のような書き方ができる。 これくらいは頭に入れておきたい。
# aがbと等しければパス assert_equal b, a # aが真であればパスする assert a # aが偽であればパスする refute a
FizzBuzzをMinitestで自動化
さて、昨日書いたFizzBuzzのテストを自動化していく。
def fizz_buzz(n) # 先にn % 3が真になってしまうとまずい if n % 15 == 0 'Fizz Buzz' elsif n % 3 == 0 'Fizz' elsif n % 5 == 0 'Buzz' else n.to_s end end require '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) end end
requireでminitestを呼び出してあげる必要がある。
テストコードの分離
このままだと、テストコードと本体のコードが同じファイルにあり、非常に不便。 なので、テストはテスト用のファイルを作ってあげる。
fizz_buzz_test.rbを作成し
require 'minitest/autorun' require './lib/fizz_buzz' 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 '14',fizz_buzz(14) assert_equal 'Fizz Buzz',fizz_buzz(15) assert_equal 'Fizz',fizz_buzz(18) assert_equal 'Buzz',fizz_buzz(55) end end
以上のコードを追加して実行
以上の画面が出れば成功
Rspecでも書いてみる
Minitestの書き方は以上だが、もう少し進んでRspecでも書いてみる。
まず、Rspecは、標準実装ではないので下記コマンドを実行する。
$ gem install rspec
次に、カレントディレクトリで以下のコマンドを実行する。
$ rspec --init
とりあえずRspecの導入は完了
RspecでFizzBuzz
fizz_buzz_spec.rbを作成し、下記のコードを書く。
require 'rspec' require '../lib/fizz_buzz' # Rspecのひな型 describe 'Fizz Buzz' do # 以下に処理を説明し、テストを書いていく。 it 'fizz_buzz' do expect(fizz_buzz(1)).to eq '1' expect(fizz_buzz(2)).to eq '2' expect(fizz_buzz(3)).to eq 'Fizz' end end
以下のコマンドでテストを実行
$ rspec fizz_buzz_spec.rb
以下が出れば完了
これで以上になります。 明日以降はループとか配列らしいです。どんどん面白くなってきた!