概要
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-rails
とsimplecov
を追加する
`test``モードのときにのみインストールするように設定
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のモード指定をする
RSpec.configure do |config|
ENV['RAILS_ENV'] = 'test'
(略)
end
カバレッジレポート作成を設定する
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
ファイルの中身はこんな感じ
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などのコミュニケーションツールに投げ込むと失敗に気づけると思います
考えたら色々きりがないので、色々な環境で試してみてください。