今回はRSpecに焦点を当てて解説します。

  • RSpecとは何か
  • RSpecの持つ特徴とは
  • RSpecの特徴についての知識を得たい
  • RSpecを使用するメリットや注意する点
  • RSpecの導入方法
  • RSpecのテスト方法について

上記に当てはまる人は必見です。

RSpecの基礎知識

プログラム開発現場においてテスト(動作確認)は必ずおこなう作業です。

プログラム=テスト作業といっても過言ではないでしょう。

イメージどおりのWebサービスやアプリケーションを開発できたとしても、すぐに安心はできません。

1つのバグによって一定の動作をおこなうと動かなくなるという致命的なエラーが起こることもあります。

そんな事態が発生することがあるのがプログラム開発です。

大きなバグはなくても、誤作動を起こしたり表示したいものが表示されなかったりする可能性だってあります。

そんな予想しないエラーを事前に除去するためにも、テストは欠かせません。

ですが、テストに作業時間の比重を大きく割くのも辛いところ。

そういう時にぜひ使って欲しいのが「RSpec(アールスペック)」です。


Ruby言語上で使えるテストフレームワーク

RSpecRuby言語用のテストフレームワークです。

BDD(Behaviour Driven Development)ツールTDD(テスト駆動開発)とも呼ばれます。

Rspecにテストコードを記述しておいてソフトウェアテストを実行すると、自動的にテストコードに沿ったバグチェックをおこなえるツールです。


名前の由来

RSpec」という名称は「R」と「Spec」に分けることができます。

「R」はRubyの「R」。「Spec」はテストコードのことを意味します。


RSpecの特徴

この項目では、RSpecの特徴について見ていきましょう。

どんな特徴があるのかを知ることで、RSpecの持つ機能を最大限活用することができます。


RubyやRailsと組み合わせて使用する

RSpec単体で使用できるツールではありません

テストフレームワークですから、「Ruby」や「Ruby on Rails」などと組み合わせて使います。


Ruby言語を基に作成されている

プログラムのテスト作業をラクにしてくれるといっても、新たな言語を覚えて…ということになると辟易してしまいます。

RSpecならそんな心配をする必要はありません。

RSpecRuby言語を基盤に作られたツールです。

そのため、Ruby言語を理解しているのであれば簡単に理解することができるでしょう。


テスト結果をHTMLで出力できる

RSpecはテストの結果をHTMLを使って出力することが可能です。


カバレッジツールと連携できる

ソースコードが実行された割合をチェックできるツールと連携できます。


RSpecのメリット

RSpecを使うとどんなメリットを享受できるのでしょうか。

この項目では、RSpecの利点についてお伝えします。


人の目で見逃してしまうバグを発見できる

通常、プログラムのバグは目視などで見つけ出します。

それがRSpecを導入することによって、目視せずとも自動的にバグを発見してくれるというメリットを得ることが可能です。


BDD(Behaviour Driven Development)

振る舞い駆動開発」という意味を持つBDD(Behaviour Driven Development)

これはどういうものかというと、「プログラムより先にテストを先に記述する」というものです。

テストを先に書くことで、プログラムの仕様や極限値の検討漏れや実行シーンの想定が甘かったりして起こるバグを回避できます。

BDDツールであるRSpecを使えば、まず詳細な仕様検討をおこないチェック項目を設けます。

そうすれば、問題発生を最小限に食い止めることができるでしょう。


バグが少なくなる

プロダクトコードの記述が完了するということは、RSpecによるテストが通ったということです。

そのため、バグが起きる確率がかなり少なくなります。


言語やフレームワークのバージョン更新時も安心

言語やフレームワークのバージョンが更新された時、プログラムがうまく反映するかを目視でテストするのはとても時間がかかる作業です。

どこにバグが潜んでいるかわからないので、全てのプログラムをチェックする必要が出て来るのでチェック漏れが出て来てしまう恐れもあります。

そういう時、RSpecがあれば自動でバグチェックをしてくれるので安心です。


RSpecのデメリット

メリットだけしかないツールというのは存在しません。

ここでは、RSpecを使うにあたってあらかじめ知っておきたいデメリットをご紹介します。


全てを自動化できるわけではない

RSpecは「バグチェックを自動化できるもの」です。

テストコードの記述だったり、rspecコマンド(テスト実行の命令作業)まで自動化できるものではありません。

その2つに関しては作業する必要があるのは覚えておきましょう。


仕様が変更になればテストコードを書き換える必要がある

仕様を変更した場合、テストコードの記述を大幅に書き換える必要があります

もし、テストコードを記述している途中で仕様を変更することになった場合などは作業が大変になってしまうことも。

テストコードが10件以上増加してしまったという事態に陥ることもあるでしょう。


RSpecの導入方法

ここからは、RSpecの導入方法を解説していきます。


公式サイトにアクセスする

公式サイトでRSpecのGemパッケージをインストールしましょう。

  1. group :development, :test do
  2. gem ‘rspec-rails’, ‘~> 4.0.0.rc1’
  3. end

上記の記述は「Gemfile」におこないます。


インストールする

  1. $ bundle install

これでRSpecのGemパッケSージがインストールされました。

次に、RSpecの初期ファイルをインストールしましょう。

  1. $ rails generate rspec:install
  2. create .rspec
  3. create spec
  4. create spec/spec_helper.rb
  5. create spec/rails_helper.rb


実行してみる

RSpecのインストールが完了したら、実際にテスト実行が可能かをチェックしましょう。

  1. $ bundle exec rspec


RSpecのテスト方法①テストできる範囲

RSpecの導入が済んだら、実際にRSpecを使ったテスト方法について学びましょう。

まずは、RSpecがテストできる範囲についての知識を得ることからです。

テストには「単体テスト」「結合テスト」「システムテスト」という3つの範囲があります。

単体テスト」はクラス、メソッドなどのテスト。

結合テスト」は単体テストを終えたクラス、メソッドを組み合わせたもののテスト。

そして「システムテスト」はアプリケーションを1単位として実施するテストです。

RSpecが実施できるのはこのうち「単体テスト」になります。


RSpecのテスト方法②基本の流れ

この項目では、RSpec運用の流れについて説明します。


テストコードを作成する

RSpecを運用するために、まずはプログラムより先にテストを作成します。

このテストは「テストコード」と呼ばれています。

プログラムの記述より前に」書くことがポイントです。


テストを実行して失敗することを確認する

テストコードを作る際、全てがfalse(失敗)状態のものを作るようにしてください。

正しいプログラムを書いて初めてtrue(成功)状態にするためです。

テストコードが完成したら、必ずテストを実行して失敗することを確認しましょう。


プログラムを作成する

そして、テストコードのテストをtrue状態になるプロダクトコード(プログラム)を作成しましょう。

基本的な流れはこの繰り返しになります。


RSpecのテスト方法③記述方法

記述する言語

RSpecのテストファイルはRuby言語で記述します。


ファイル名

ファイル名の規則は「spec/●●/○_spec.rb」。

ちなみに、テストファイルには必ず「require ‘rails_helper’」と記述してください。


ルール

describe」「context」「it」を使用して記述します。

テストの内容はitで記述し(詳しくは「Rspecのテスト方法⑤期待するプログラムの仕様を文章で書く」参照)、期待する動作についてはexpectで記述します。

1つのテストにつき、itとexpectは必ず1つは記述しましょう。

特定条件を想定する時はcontextを使用し、条件の記述をおこないます


RSpecのテスト方法④準備されているもの

RSpecには「matcher」という期待値と実際の値を比較し一致・不一致の結果を教えてくれるオブジェクトが備わっています。

このオブジェクトを利用することで、テストを記述するのを簡単におこなうことが可能です。

be [true/false]」はtrueかfalseかを。

eq(x)」なら「xと等しいかどうか」。「not_eq(x)」は「xと等しくないかどうか」。

そして「be < x」なら「xより小さいかどうか」。

be_between(x, y).inclusive」なら「数値がxとyの範囲かどうか」。

respond_to(:{メソッド名})」なら「記述したメソッド名が存在するかどうか」ということを調べることができます。


RSpecのテスト方法⑤期待するプログラムの仕様を文章で書く

RSpecのテストコードを作成する際、まず始めにするのが「itメソッド」です。

これはテストの対象となるメソッドが「どういう仕様なのか」というのを文章にしたものです。

「itメソッド」は処理をおこなうものではありません。

プログラムの仕様をわかりやすくするために存在します。

記述コードは以下になります。


  1. it(“プログラムに期待する仕様”)

it ~ endにテストケースを書きます。


RSpecのテスト方法⑥コード記述例

この項目ではいくつかのコード記述例をご紹介します。


基本構文

  1. RSpec.describe テスト対象, テストの種類 do
  2. describe ‘テスト名(クラス名)’ do
  3. it ‘テストケース’ do
  4. 期待する動作をコードで記述する
  5. end
  6. end
  7. end


タグのテスト

<h2>タグの中身が正しく表示されるかテストしたい時のコード記述です。


  1. <h2>toiro<h2>

上記の<h2>タグが記述されていたとして、タグ内の正しい内容が反映するかどうかをテストします。

まず、「spec/spec_helper.rb」ファイルを開き、以下を追記します。


  1. require ‘capybara/rspec’ # 追記
  2. RSpec.configure do |config|
  3. config.include Capybara::DSL # 追記

追記が完了したら、テスト用ファイルを作成しましょう。


  1. $ rails g rspec:view astar index

spec/views/astar/index.html.erb_spec.rb」というファイルが出来上がります。

次に、ファイル内に下記コードを記述。


  1. require ‘rails_helper’
  2. RSpec.describe “astar/index”, type: :view do
  3. describe ‘index.html.erbのテスト’ do
  4. it ‘h2タグの中にtoiroが表示されるか’ do
  5. visit users_path
  6. expect(page).to have_selector(‘h2’, text: ‘toiro’)
  7. end
  8. end
  9. end


まとめ

RSpecの入門編として、基本的な知識に関する解説やメリットデメリット使い方などをご紹介しましたがいかがだったでしょうか。

この記事を読んで、RSpecへの理解を深めることができたなら幸いです。

RSpecは、プログラム開発をおこなう上で切っては切れない「テスト(動作確認)」を簡略化してくれる心強い味方です。

RubyやRuby on Railsなどを使ってWeb開発をおこなおうとしている人は、ぜひ使用を検討することをおすすめします。