Carelyの権限テストの管理について(feature spec) | Dev Driven 開発・デザインチーム Carelyの権限テストの管理について(feature spec) | 働くひとと組織の健康を創る iCARE

BLOG

Carelyの権限テストの管理について(feature spec)

2020/07/29

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

こういう感じでロールにわけてテストをやって読み易いように工夫してます。

最後まで読んでいただきありがとうございます。