Rails on rspec plactice
Transcript of Rails on rspec plactice
Rails on Rspecplactice
実運用から考察する Railsの Rspec運用方法
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
Rails on Rspecplactice
1クラス1 Specファイルという分割は冗長だ!
Railsの Generator機能に則って開発していると、 Specファイルは自然と1クラス1 Specという単位で分割されていきます。
Rails on Rspecplactice
1クラス1 Specファイルという分割は冗長だ!
例えば、モデルクラスに書くテストを考えた時にどのようなテストが考えられるでしょうか?
・ DBのスキーマ定義
・モデル間の関連
・プロパティ、 Enum
・バリデーション
・ Scope
・クラスメソッド
・インスタンスメソッド
etc...
うわっ、テストの種類
こんなに多いの!
Rails on Rspecplactice
1クラス1 Specファイルという分割は冗長だ!
以下の方針で分割しましょう
・ DB構造、プロパティ、 Enum、バリデーション
・ Scopeごとに1ファイル
・クラスメソッドごとに1ファイル
・インスタンスメソッドごとに1ファイル
ディレクトリ構造を分けて Specファイルを配置することで、確認したいテストを探しやすくなるほか、1テストあたりのコード量が減り、また、そのファイルにはそのテストに必要な情報しか記述しないので読みてにも優しい。
Rails on Rspecplactice
1クラス1 Specファイルという分割は冗長だ!
Modelクラスのテストに限定して考えましたが、考え方はControllerクラス、 Helperモジュールなどでも考え方は同じです。
メソッド単位でテストファイルを作成していくと見通しの良いテストファイルが作成出来ます。
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
Rails on Rspecplactice
APIのテスト
APIのテストには Railsが定義するデフォルトは存在しません。
また Grapeのような DSLを利用するとメソッド単位という分割方法は使えなくなります。
Rails on Rspecplactice
APIのテスト
APIについては、1エンドポイント毎に1つのテストファイルを作成していくのがよいと考えます。
この時、テストファイルの命名にはapi_[request_method]_[resource]_[action]_specとすると、ファイル名からの検索性能が向上するはずです。
ファイルの命名について、パスパラメタのことは特に考えていません。この辺りは Railsの URLHelperの考え方に沿って、複数取得する場合は、 resourceを複数系に、1件に絞って取得する場合は、単数形にするようにすれば良いと考えています。
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
Rails on Rspecplactice
FactoryGirl
バリデーションの通る1つのモデル定義を作成しておく。
テストドメイン毎の定義は行わない、テストドメインのデータは1つ定義した Factoryをロードして、テストファイルの中でデータを変更して作成するようにする。
こうすることで、テストとデータの関連がすぐに把握出来るようになる。
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
Rails on Rspecplacticeカバレッジ
SimpleCovを利用していることが前提の話です。
テスト環境の eager_loadを有効にし、 spec_helperまたはrails_helper( .rspecで指定している方)の一番先頭でカバレッジ取得のための設定を読み込むようにする。
こうすることで、 Railsがオートロードする全てのコードがカバレッジ取得対象になる。
この方法だと、範囲を限定してテストを実行するときでも、大くのファイルを読み込んでしまうので、カバレッジを集計して可視化する CI環境のみで有効にするのが良い。
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
Rails on Rspecplactice
便利な Gemを利用する
・ shoulda_matcher
・ rspec_its
・ grape-entity-matchers
( grapeを利用している場合)
・ rspec-request-describer
・ json-spec
【よくある質問】
Q:この Gem …、もう全然メンテされてないんですけど
A:エンジニアなら、フォークするなりプルリクだして直せ!
程度にもよりますが、多少のバグならそれほど時間を欠けずに修正できるはずです
目録
・1クラス1 Specファイルは冗長だ!
・ APIのテスト
・ FactoryGirl
・カバレッジ
・便利な Gemを使おう
・その他
Rails on Rspecplactice
他にもテストで考えることは色々ある
・テスタブルな処理の書き方
・テストの実行時間の問題
・ featureテストは開発するエンジニアが書くものではないのでは?
・ fixtureの取り扱い
etc...
調べれば何かしら出てくると思うので詳しくは話しません。
良きテストライフを!