LoginSignup
14
6

More than 3 years have passed since last update.

rspecの導入+カバレッジを出力する

Last updated at Posted at 2019-06-25

概要

Ruby on Railsの開発で単体試験、カバレッジを測りたいという時のための手順
すでにRailsが起動してるよ!という状態からスタート

環境

Ruby on Rails自体はDockerの上で起動(Dockerじゃなくても同じように動くはず)
* Ruby : 2.6
* Rails : 5.2.3
* rspec-rails : 3.8.2
* simplecov : 0.16.1

やったこと

Gemfileの編集

Gemfileにrspec-railssimplecovを追加する
test`モードのときにのみインストールするように設定

Gemfile
group :test do
  gem 'rspec-rails'
  gem 'simplecov'
end

rspecをインストールする

gemをダウンロードする(今回はdocker-compose使ってます)

docker-compose build

Docker使ってないとbundle installかな

bundle install

rspecをインストール(generate)する

rails generate rspec:install

こんなファイル構成が生まれてばOK

.spec
spec/
spec/spec_helper.rb
spec/rails_helper.rb

設定を書き換える

Railsのモード指定をする

spec_helper.rb
RSpec.configure do |config|
  ENV['RAILS_ENV'] = 'test'

  ()
end

カバレッジレポート作成を設定する

spec_helper.rb
require 'simplecov'

RSpec.configure do |config|
  (略)

  if ENV['CIRCLE_ARTIFACTS']
    dir = File.join(ENV['CIRCLE_ARTIFACTS'], 'coverage')
    SimpleCov.coverage_dir(dir)
  end

  SimpleCov.start
end

テストクラス作成

テスト対象のクラスを作る
本来はrails generate model item ・・・というようにrails generateしたときにテストクラス(〜_spec.rb)が作られる
けど、すでに存在するクラスに対しては作られないので主導で作成
以下のようなファイル構成で作る(例はitemというモデルがあった場合)

spec/models/item_spec.rb

ファイルの中身はこんな感じ

item_spec.rb
require 'rails_helper'

RSpec.describe Item, type: :model do
  # describeはテストの大きな枠で、クラスが持つ機能(メソッド)ごとに作るといいかも
  # 文字列のところは任意で決められ、表すものを書けばOK
  describe 'aaa test' do

    # itはテストケース単位
    # 文字列のところは任意で決められ、表すものを書けばOK
    it 'bbb test' do

      # テスト内容を記載
    end
  end
end

試験データを作成するときはfactory_bot_railsを使うと良い
(今回は説明しません)

テスト実行

テスト実行は1コマンド

rspec

# テストケースを指定する場合は引数でファイル名を渡す(対象ファイルが多いと時間がかかるため、開発中は限定したい)
rspec spec/models/item_spec.rb

結果がベローって出て、全部緑ならOK
最後にカバレッジが出るので、試験結果とカバレッジ結果を両方確認できる

Finished in 0.03117 seconds (files took 3.09 seconds to load)
1 example, 0 failures

Coverage report generated for RSpec to /sample_app/coverage. 187 / 194 LOC (96.39%) covered.

カバレッジ結果はcaverage/index.htmlに出力されるので、通過していない箇所をブラウザで確認できる

注意点

specファイルが書かれていないクラスはカバレッジ計測されません
(他のテストケースを実行したときに呼ばれれば計測される)
全テスト対象クラスを最初から用意しておくことを激しくお勧めします
テスト結果が正しくないまま「カバレッジが高いぞ!」ってはしゃぐことになります

応用編

手動で実行すると忘れるものです
なので、リポジトリにpushしたときにテストが実行されるよう自動化をお勧めします
(github → circleCIとかgitlabのスクリプトで十分効果が発揮できる)
テスト結果をslackなどのコミュニケーションツールに投げ込むと失敗に気づけると思います
考えたら色々きりがないので、色々な環境で試してみてください。

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6