テストとは
アプリケーションの様々な挙動を全て手動でチェックすることは困難です。
このため、テストを書くことによってデータの受け渡しが正しくされるか、想定した挙動で動いているかなど、効率的にチェックすることができます。
Ruby でのテストフレームワークと Rspec について
Rubyのテストフレームワークで有名なものは
- Rspec
- Test::Unit
- Cucumber
などがあります。この中で Rspec は一番使われているBDDテストフレームワークです。
テストの種類
Rails チュートリアルではいくつかの種類のテスト使われています。
モデルやビューヘルパー単体の動作をチェックする単体テスト、コントローラー/ビューの呼び出し結果をチェックする機能テスト、ユーザーの実際の操作を想定し、複数のコントローラーにまたがるアプリの挙動をチェックする統合テストがあり、システム開発では以上のテストを行うことが多いです。
導入
Gemfile に rspec に関する gem を入れます
group :development, :test do
gem 'rspec-rails'
end
のあと、
$ bundle install
をしましょう。
必要に応じて、FactoryBot (旧FactoryGirl)なども入れましょう。
参考文献:https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed
文法
テストの要件の記述
describe , it , expect
これらを使うことによってテスト要件の記述ができます。
例えば単体テスト(modelのテスト)では、
RSpec.describe Account, type: :model do
describe 'company model' do
it '作成' do
expect { create(:company) }.to change { Company.count }.by(1)
end
end
end
Rspec でエラーが出た時には、context, it に記述した文章が出力されます。
これにより、どの部分でエラーが起きたのかを理解することができます。
context
context を使って条件を分岐しても良いです。it をそれぞれ作成してもよい
例えば controller のテストにおいては、
RSpec.describe CompaniesController, type: :controller do
describe '一覧の取得' do
context 'ログインしている場合' do
it '200 を返す' do
// テスト処理
end
end
context 'ログインしていない場合' do
it '400 エラーを返す' do
// テスト処理
end
end
end
end
使い分け
区分 | 記述すること |
---|---|
describe | テストの対象 |
context | 特定の条件の場合分けを記述 |
it | アウトプットが何かを記述 |
以上のように振る舞いを記述してから、テストを書いていきます。
let , let!
テストにおいて、テストデータを使う場合にはこのような処理を記述します。
例えば、
RSpec.describe CompaniesController, type: :controller do
describe '一覧の取得' do
context 'ログインしている場合' do
it '200 を返す' do
let(:company) { Company.create(name: '株式会社ヤマダ', email: 'yamada@exapmle.com') }
# テスト処理
end
end
context 'ログインしていない場合' do
it '400 エラーを返す' do
# テスト処理
end
end
end
end
以上のように処理を書く部分でデータを作成します。
let let! はそれぞれ
区分 | 評価タイミング |
---|---|
let | 最初にメソッドが呼ばれた時に処理される |
let! | ブロック実行前に処理される |
つまり、上の例だと
let(:company) { Company.new(name: '株式会社ヤマダ', email: 'yamada@exapmle.com') }
この時点では、:company が作られておらず、
例えば、
process :show, method: :get, params: { company_id: company.id }
のようにcompany が呼ばれた時点で、作成されるという違いがあります。
呼ばれるタイミングの違いでエラーが出ることがあるので、この違いは意識したいところです。
before / after
テストの前後に行いたい処理がある際にはこちらに処理を記述します。
Rspec で作成されたデータは基本的にテストが終わると、テスト用のデータベースから削除される。
終わりに
Rspec で個人的にごちゃっとするところをまとめてみたつもりです。
間違っている点があれば、ご指摘いただけるとありがたいです!
参考文献
https://qiita.com/jnchito/items/42193d066bd61c740612#context-%E3%81%A7%E6%9D%A1%E4%BB%B6%E5%88%A5%E3%81%AB%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%99%E3%82%8B
https://qiita.com/uchiko/items/d34c5d1298934252f58f