Help us understand the problem. What is going on with this article?

Rubyのテスト機能である、RSpecの使い方と仕組みについて調べてみた

More than 1 year has passed since last update.

目的

  • テスト用の機能であるRSpecの使い方を把握する
  • 使用するコマンドや、自動生成されるファイルの意味について理解する

使い方

  1. bundle init する(仮想環境をつくる)
  2. gemfileを編集する(仮想環境設定の準備)
  3. bundle install する(仮想環境にrspec等のgemをインストール)
  4. bundle exec rspec --init する(rspecの初期化-各種ファイルの生成)
  5. rspec_helper.rbを編集する(テスト内容を定義)
  6. bundle exec rspec する(テストを実行)

コード例と実行結果

作業フォルダを決めた上で、「使い方」の1~4までを実行します。
そして、生成されるspecフォルダ内のrspec_helper.rbを編集します。
ここで、具体的なテストの内容を記載することになります。

上記までのやり方でrspec_helper.rbを生成すると、デフォルトでは英語でいろいろなことが書かれています。
これは、そのまま残しておいて一番下にテスト内容を追記しても動きますし、全部消してからテスト内容を書いても動きます。

以下の例では、全部消してから書いています。

例えば、以下のようなコードを書きます。
テスト対象のadd関数をつくります。

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

そして、テスト内容を書きます。

# spec/rspec_helper.rb
# テスト対象をrequireする
require "./add"

# テスト本体
describe 'add' do
  it '1+1は2になること' do
    expect(add(1,1)).to eq 2
  end
end

expectのカッコの中に実施するテストの内容(方法)を、
eqの後に、実施した結果について、こうなってほしい、という設計意図をに書きます。

カッコの中の実施結果がeqのあとの数値と一致すれば、テスト成功、となります。

describeやitの意味合いについては、以下の記事を参照。
https://qiita.com/uchiko/items/d34c5d1298934252f58f
どの関数のテストをするか、ということと、どんなテストをするか、ということを階層的に書けるみたい。

で、コマンドラインで以下を実施します。

> bundle exec rspec

エラーがなければ以下のようになります。
0 failureということで、エラーなしでテスト成功、ということになります。

> bundle exec rspec
2
.

Finished in 0.00899 seconds (files took 0.19199 seconds to load)
1 example, 0 failures

もし、ここでエラーがあったら以下のようになります。
(addの中身を書き換えてエラーを発生させてます)
エラー内容とか、いろいろ表示してくれるわけですね。

> bundle exec rspec
2
F

Failures:

  1) addの動作確認 add(10,10)が20になること
     Failure/Error: expect(add(10,10)).to eq 20

       expected: 20
            got: 21

       (compared using ==)
     # ./spec/spec_helper2.rb:13:in `block (2 levels) in <top (required)>'

Finished in 0.02708 seconds (files took 0.20486 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/spec_helper2.rb:12 # addの動作確認 add(10,10)が20になること

bundle exec rspec というコマンドの意味

以下のコードの実行時に、作業している仮想環境にrspecがインストールされます。

> bundle install

次に、このコードでrspecが初期化されます。
bundle 上で、インストール済のrspecを実行します。オプションは--init(初期化)です。という意味。

> bundle exec rspec --init

ここまでやった上で、bundle exec rspecを実行する、というのは、初期化されたrspecを、bundle上でオプション無しで実行する(テストを実行する)、という意味になります。

> bundle exec rspec

.rspec ファイルとはなにか

bundle上で動くrspecコマンドが参照している、テスト時の設定ファイルのようなもの、のようです。

ちなみに、.rspecファイルのファイル名を.rspec2等に書き換えてテストしようとすると、以下のように、テストが見つからない、という結果が帰ってきます。

> bundle exec rspec
No examples found.


Finished in 0.00042 seconds (files took 0.09743 seconds to load)
0 examples, 0 failures

この状態で bundle exec rspec2 としても、テストは実行できません。参照しているこのファイル名は固定のようです。

デフォルトだと、以下の内容が書いてあります。

#.rspec
--require spec_helper

テストの実行時に、先程編集した、spec_helper.rb ファイルを呼び出してテストに使う、という意味になっています。

参考

https://qiita.com/jnchito/items/42193d066bd61c740612
https://qiita.com/Kawaguchisan/items/719f13d05160cd247646

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした