RSpecを使ってみる

f:id:utouto97:20210725220811j:plain

Rubyテスティングフレームワークで人気の高いRSpecを使ってみます。

RSpecのインストール

RSpecを使ってテストしてみたいと思います。
まず、第一歩としてインストールからやっていきます。

Ruby環境は次の通りです。

$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux]

RSpecのインストールは、Gemでインストールすることができます。
ここでは、Gemfileに記述し、bundle installでインストールします。

source "https://rubygems.org"

gem 'rspec'
$ bundle install

これでRSpecがインストールされました。

$ rspec -v
RSpec 3.10
  - rspec-core 3.10.1
  - rspec-expectations 3.10.1
  - rspec-mocks 3.10.2
  - rspec-support 3.10.2

RSpecのインストールが終わったら初期化を行っておきます。

$ rspec --init

これでspec/.rspecが作られたと思います。
ここまでで準備完了です。

テスト対象のクラス

今回のテスト対象のクラスはCalcクラスです。
calc.rbファイルに記述します。

class Calc
  def add(a, b)
    return a + b
  end
  def sub(a, b)
    return a - b
  end
  def max(a, b)
    return a > b ? a : b
  end
  def min(a, b)
    return a < b ? a : b
  end
end

コードを見てわかる通り、加算、減算、最大値、最小値ができる電卓のクラスとなっています。

RSpecでテストしてみる

テストの記述

では、ここからテストを記述していきます。

テストのファイルはspec/calc_spec.rbという名前で作りました。
中身は次の通りです。

require './calc'

RSpec.describe Calc do
  calc = Calc.new
  context "3と1のとき" do
    a = 3
    b = 1
    example "addの結果が4" do
      expect(calc.add(a, b)).to eq(4)
    end
    example "subの結果が2" do
      expect(calc.sub(a, b)).to eq(2)
    end
    example "maxの結果が3" do
      expect(calc.max(a, b)).to eq(3)
    end
    example "minの結果が1" do
      expect(calc.min(a, b)).to eq(1)
    end
  end
end

テストを記述するとき、まずは全体をRSpec.describeで囲います。
describeでは、テストの対象をわかるようにします。
ここでは、Calcがテストの対象です。

次に、contextで条件をわかるようにします。
ここでは、入力として3と1を受け取る場合としています。

そして、一つずつのテストケースはexampleを使って記述します。
期待するアウトプットとの比較はマッチャを使って記述します。
この場合のexpect,to,eqなどです。

exampleと同様の使い方をするものとして、itがあります。
テストケースの名前を日本語で記述する場合はexample、英語で記述する場合はitを使うことが多いようです。

テストの実行

RSpecでテストを実行するには、rspecコマンドを実行するだけです。

$ rspec

結果は次のようにでてきます。

....

Finished in 0.00237 seconds (files took 0.0715 seconds to load)
4 examples, 0 failures

かかった時間とテストケースの数、失敗数が表示されます。
今回は、4つテストケースがあり、失敗0ということがわかります。

テスト失敗

上のケースでは、全部テストが通ったので、テストが失敗するようにしてみます。

入力が3と1で加算addを行った場合に、期待する値が5となるようなテストケースを作成します。

example "addの結果が5" do
  expect(calc.add(a, b)).to eq(5)
end

この場合、addは加算を行うだけなので、4がかえってくるため、期待する値とは異なり失敗となります。

$ rspec
F

Failures:

  1) Calc 3と1のとき addの結果が5
     Failure/Error: expect(calc.add(a, b)).to eq(5)
     
       expected: 5
            got: 4
     
       (compared using ==)
     # ./spec/calc_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.01057 seconds (files took 0.07207 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/calc_spec.rb:8 # Calc 3と1のとき addの結果が5

結果は見ての通り、Failuresが表示されています。
この中で、どのテストケースか、また期待される値と実際の値は何かも表示されます。

終わり