【Ruby】RSpecに触れてみる
こんにちは、しきゆらです。
今回は、Ruby用のテストフレームワークの一つであるRSpecに触れてみたのでメモしておきます。
なお、RSpecに関する書籍等もあるので、そちらも読むと良いかもしれません。
少し古いですが、日本語の本。
新し目ですが、英語の本(ほしい)。
ほしい本リストに追加しておこう・・・。
さて、本当に基本的なところを触っていこうと思います。
環境構築
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」と言うもの。
以下のサイトに、リストが有ります。
どんなも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という形式(?)で進めていくようなので
期待する処理結果から考えて作っていくようにしていこう、と思った次第です。
さて、今回はここまで。
おわり
ディスカッション
コメント一覧
まだ、コメントがありません