麻布十番で働くデータ分析者のブログ

グロースハック、プログラミング、データ分析の色々を発信します

Rubyテスト自動化とRspec入門

f:id:nimi0370376:20171203015455p:plain

 

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)

 

の3章をやっていきます。

今回のテーマは、テストの自動化です。RubyのMinitestを使ってどんどん自動化していきます。

ディレクトリ構造

f:id:nimi0370376:20171203020842p:plain

テストコードのひな型

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

以上のコードを追加して実行

f:id:nimi0370376:20171203015455p:plain

以上の画面が出れば成功

Rspecでも書いてみる

Minitestの書き方は以上だが、もう少し進んでRspecでも書いてみる。

まず、Rspecは、標準実装ではないので下記コマンドを実行する。

$ gem install rspec

次に、カレントディレクトリで以下のコマンドを実行する。

$ rspec --init

とりあえずRspecの導入は完了

RspecFizzBuzz

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

以下が出れば完了

f:id:nimi0370376:20171203020722p:plain

これで以上になります。 明日以降はループとか配列らしいです。どんどん面白くなってきた!