Carelyの権限テストの管理について(feature spec)
Devチームのヘレンです!
現在feature specの開発を担当しています。
Carelyがどういう風にテストされているのか気になるところだと思いますのでザックリ紹介します。Carelyには複数の権限があり、どの権限で何が見れるか、全部の権限で動いてるか、想定してる挙動をしているかカバーしなければなりません。アプリ大きくなればなるほど管理が大事になってきます。
Feature specとは
Feature specs are high-level tests meant to exercise slices of functionality through an application. They should drive the application only via its external interface, usually web pages.
-- RSpec
feature specの目的は、ユーザーの観点からWebアプリケーションの挙動をテストすることです。Webページを介してのみアプリケーションのすべてのコンポーネントが連携して正しく機能するかどうかをテストします。
Carelyの権限
Carelyには以下の権限があります。
従業員
人事
産業医
実施事務従事者
実施事務従事者+人事
産業医+人事
産業医+従業員
テストランクで分ける
まず重要度によって分けてます。
S, A, B, N(指定なし)
*複合ロールはCI時間の短縮の為Sランクのみをテストする
テストブロック
権限別で違いはありますが、共通で使っている所を全部そのまま書いてしまうととても長くなって、読みにくくなってしまう。その上違いがあるのかすらぱっと見わからない。なので、共通で使えるテストはshared_examplesを使います。
以下がCarelyで使っている共通管理方です。
*shared_examples / shared_context に名前をつける際、(最高)ランクを先頭につける
*sharedブロックに別ランクのテストがある場合がある。そのケースは同じ注入データを使っている為、またそのテストが同ロールで発生する場合、別ブロックに分けない
*before等注入データは必要に応じて使う
shared_examples "A:shared_examples_name" do
let!(:insert_data) { create(:...) } # 必要に応じて使う
let!(:insert_data2) { create(:...) } # 必要に応じて使う
before do # 必要に応じて使う
end
it "A:test1" do
# xxx
end
it "A:test2" do
# xxx
end
it "B:test" do # 同じ注入データを使っている為、またそのテストが同じロールで発生する場合、別ブロックに分けない
# xxx
end
end
ロール
*ロール(此処の場合産業医)にテストブロックS,A,Bが入ってる例
*テストブロックの分け方は必要に応じて(ロール別や注入データ)変更
context "産業医の場合" do
let(:login_user) { create(:doctor, ...) }
it_behaves_like "A:some_tests"
it_behaves_like "A:some_tests_2", "doctor"
it_behaves_like "B:some_tests_3"
it_behaves_like "S:some_tests_4"
it_behaves_like "S:some_tests_5"
end
こういう感じでロールにわけてテストをやって読み易いように工夫してます。
最後まで読んでいただきありがとうございます。