このドキュメントの目的
railsのテストを勉強し始めるに当たってのメモ。主にRspec
テストの流れ
- spec配下にテストをかく
-
bundle exec rspec spec
でテスト - 成功したかどうか返ってくる
minitestかRspecか
RSpecとminitestのおおまかな違い
https://qiita.com/kenkenkengo-y/items/5fb3f3602dcf3826ce19
Rspec導入
Rails+RSpecで気軽に始めるテスト
https://weseek.co.jp/tech/1409/
factorybot導入
factorybotはテストデータを簡単に用意できるgem
なにをテストすべきか?
テストの内容は大きく分けると下記3つ。定義は上記記事。
- 単体テスト
- 結合テスト
- システムテスト
システムテストは実際にはQAやE2Eでテストされることが多く、テストを書くのは単体、結合が主。
Rspecで覚えておきたい用語
- モック:実際のコードではなく、testを代わりに実行するプログラム。外部のAPIを試したい時とかに使う
Rspecの基本的な書き方
上記の「describe / it / expect の役割を理解する」がよくまとまっている
RSpec.describe '四則演算' do
it '1 + 1 は 2 になること' do
expect(1 + 1).to eq 2
end
end
- ファイル生成
- describeでテストをグループ化する
- itでexampleという単位にまとめる。このexampleがテストの最小単位
- expect(X).to eq Yをエクスペクテーションといい、これが全て通るとexampleが通る
- toなどはマッチャと言われる
使用頻度の高いマッチャ
モックとスタブの違い
- そもそもモックとスタブは仮の部分を書いてテストすること。例えばAPI部分などテストで実際に送れないところをモックで代用することでテストしやすくする。例えば下記で使用
- APIの応答
- tweetなど外部に公開する部分
- モックはプログラム全体に対してテストを行い、反応を見るものでスタブは対象のメソッドのみテストするもの
モック
- データベースのアクセスなしで動く
- doubleを用いて影武者を生成
スタブ
- テスト用のダミーメソッド
- データベースやネットワークを使うメソッドをデータベースへのアクセスなしで呼び出す。
- allow(モデル名).to メソッドを用いてダミーメソッドを作成
テスト実行
全てのrspecのテストを行いたい場合は下記(docker内
docker-compose run web bundle exec rspec