【Ruby】RSpecに触れてみる

2018年3月19日Ruby

こんにちは、しきゆらです。

今回は、Ruby用のテストフレームワークの一つであるRSpecに触れてみたのでメモしておきます。

 

なお、RSpecに関する書籍等もあるので、そちらも読むと良いかもしれません。

少し古いですが、日本語の本。

https://amzn.to/2TvSQY3

 

新し目ですが、英語の本(ほしい)。

https://amzn.to/2Tz2tp4

ほしい本リストに追加しておこう・・・。

 

さて、本当に基本的なところを触っていこうと思います。


 

環境構築

RSpecはgemとして配布されています。

gem install rspec

 

もしくは、bundlerを使う場合は

bundle init

# Gemfileには、以下のように書く
gem 'rspec'

# インストール
bundle install --path vendor/bundle

 

使うための準備

インストールが終わったら、使うための準備をしておきます。

rspec --init

# bundlerで管理する場合
bundle exec rspec --init

 

出来るのは、「spec/」と「.rspec」の2つ。

「spec/」には、テストのスクリプトを置いておくようです。

「.rspec」には、rspecの実行時オプションを書いておくと、毎回タイプしなくても良くなります。

--require spec_helper
-fd <= 追加

-fdをつけると、テストの結果が見やすいのでつけておきます。

 

スクリプトの配置場所

「spec/」にはテストのスクリプトを置いておきますが、テストしたいスクリプトはどこに置きましょう。

どうやら、「spec/」と同じ階層に「lib/」というディレクトリを作り、ここに入れていくようです。

 

ファイルの階層をまとめておくと以下のような感じ。

project_dir/ 
├── vender/bundle <= bundlerで管理したとき
├── .rspec
├── spec/ <= ここにテストスクリプトをおいていく
└── lib/ <= テスト対象のスクリプトはここに置く

 

 

使っていく

基本的には、以下のような形で書いていきます。

RSpec.describe 'テストの名前' do
  example 'テストの例1' do 
    # テストしたい処理
    # 例として、引数ふたつを加算した結果を返すものの場合
    expect(add(1,2)).to eq(3)
  end
end

「’テストの名前’」は自由につけることが出来ます。

テストの意味とか、何をテストするのかとか書いておくと良いかと思います。

 

「example」は、テストしたい例をいくつか書いていく部分です。

example1つでテスト1つという感じ。

 

その中にある「expect()」は、テストしたいメソッドなどを渡します。

.to eq(3)は、expectに渡したものの期待する結果を渡します。

 

 

テストしてみる

例えば、テストしたいプログラムが以下の様な場合。

# calc.rb
def add(a,b) 
  a + b
end

 

RSpec側のスクリプトから上記のファイルを読み込んであげましょう。

require 'calc' # テストするスクリプトを読み込む

RSpec.describe '計算結果のテスト' do
  example '1 + 2 の答えは? => 答えは3!' do 
    expect(add(1,2)).to eq(3)
  end
end

テストの名前などは変えておきました。

ファイル名は、テストしたいものの名前_specとするのが慣例らしいです。

ということで、保存。

以下のように配置。

project_dir/ 
├── vender/bundle <= bundlerで管理したとき 
├── .rspec 
├── spec/ 
       └──  calc_spec.rb
└── lib/
        └── calc.rb

 

テストを実行する時は、特に何もしなくてもよくて、以下のコマンド一発です。

rspec

# bundleの場合
bundle exec rspec

 

こうすると、specとつくファイルをごっそり実行して結果を返してくれます。

また、「rspec calc_spec.rb」とすると特定のテストのみ実行することも出来ます。

 

結果は以下の通り。

計算結果のテスト
  1 + 2 の答えは? => 答えは3!

Finished in 0.00213 seconds (files took 0.25557 seconds to load)
1 example, 0 failures

緑色で表示されれば、テストは通っています。

やったね!

一方で、エラーがあれば赤字で出ます。

 

 

まっちゃー

さて、上記の例では eqを使っています。

これ以外にも、期待する結果を指定する方法があります。

それが「matcher」と言うもの。

以下のサイトに、リストが有ります。

Built in matchers – Relish

 

どんなもnがあるかというと、

  • .to eq(hoge): hogeと等しいかの判定
  • .not_to eq(hoge): hogeでないかを判定
  • .to be true: trueかを判定
  • .to be > 10 : 10より大きいかの判定
  • .to be_between(1,10) : 1〜10の間にあるか

などなど。

 

これらを使って、実行結果が期待したものかをテストしながら作っていきます。

 

少し触れてみて、全て緑になると楽しくなってきますね。

RSpecはBDDという形式(?)で進めていくようなので

期待する処理結果から考えて作っていくようにしていこう、と思った次第です。

 

 

さて、今回はここまで。

おわり

Posted by しきゆら