RSpecを使ってみる
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が表示されています。
この中で、どのテストケースか、また期待される値と実際の値は何かも表示されます。
終わり