rails on rspec plactice

19
Rails on Rspec plactice 実実実実実実実実実 Rails 実 Rspec 実実実実

Upload: k-motoyan

Post on 12-Apr-2017

101 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Rails on rspec plactice

Rails on Rspecplactice

実運用から考察する Railsの Rspec運用方法

Page 2: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 3: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 4: Rails on rspec plactice

Rails on Rspecplactice

1クラス1 Specファイルという分割は冗長だ!

Railsの Generator機能に則って開発していると、 Specファイルは自然と1クラス1 Specという単位で分割されていきます。

Page 5: Rails on rspec plactice

Rails on Rspecplactice

1クラス1 Specファイルという分割は冗長だ!

例えば、モデルクラスに書くテストを考えた時にどのようなテストが考えられるでしょうか?

・ DBのスキーマ定義

・モデル間の関連

・プロパティ、 Enum

・バリデーション

・ Scope

・クラスメソッド

・インスタンスメソッド

etc...

うわっ、テストの種類

こんなに多いの!

Page 6: Rails on rspec plactice

Rails on Rspecplactice

1クラス1 Specファイルという分割は冗長だ!

以下の方針で分割しましょう

・ DB構造、プロパティ、 Enum、バリデーション

・ Scopeごとに1ファイル

・クラスメソッドごとに1ファイル

・インスタンスメソッドごとに1ファイル

ディレクトリ構造を分けて Specファイルを配置することで、確認したいテストを探しやすくなるほか、1テストあたりのコード量が減り、また、そのファイルにはそのテストに必要な情報しか記述しないので読みてにも優しい。

Page 7: Rails on rspec plactice

Rails on Rspecplactice

1クラス1 Specファイルという分割は冗長だ!

Modelクラスのテストに限定して考えましたが、考え方はControllerクラス、 Helperモジュールなどでも考え方は同じです。

メソッド単位でテストファイルを作成していくと見通しの良いテストファイルが作成出来ます。

Page 8: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 9: Rails on rspec plactice

Rails on Rspecplactice

APIのテスト

APIのテストには Railsが定義するデフォルトは存在しません。

また Grapeのような DSLを利用するとメソッド単位という分割方法は使えなくなります。

Page 10: Rails on rspec plactice

Rails on Rspecplactice

APIのテスト

APIについては、1エンドポイント毎に1つのテストファイルを作成していくのがよいと考えます。

この時、テストファイルの命名にはapi_[request_method]_[resource]_[action]_specとすると、ファイル名からの検索性能が向上するはずです。

ファイルの命名について、パスパラメタのことは特に考えていません。この辺りは Railsの URLHelperの考え方に沿って、複数取得する場合は、 resourceを複数系に、1件に絞って取得する場合は、単数形にするようにすれば良いと考えています。

Page 11: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 12: Rails on rspec plactice

Rails on Rspecplactice

FactoryGirl

バリデーションの通る1つのモデル定義を作成しておく。

テストドメイン毎の定義は行わない、テストドメインのデータは1つ定義した Factoryをロードして、テストファイルの中でデータを変更して作成するようにする。

こうすることで、テストとデータの関連がすぐに把握出来るようになる。

Page 13: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 14: Rails on rspec plactice

Rails on Rspecplacticeカバレッジ

SimpleCovを利用していることが前提の話です。

テスト環境の eager_loadを有効にし、 spec_helperまたはrails_helper( .rspecで指定している方)の一番先頭でカバレッジ取得のための設定を読み込むようにする。

こうすることで、 Railsがオートロードする全てのコードがカバレッジ取得対象になる。

この方法だと、範囲を限定してテストを実行するときでも、大くのファイルを読み込んでしまうので、カバレッジを集計して可視化する CI環境のみで有効にするのが良い。

Page 15: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 16: Rails on rspec plactice

Rails on Rspecplactice

便利な Gemを利用する

・ shoulda_matcher

・ rspec_its

・ grape-entity-matchers

( grapeを利用している場合)

・ rspec-request-describer

・ json-spec

【よくある質問】

Q:この Gem …、もう全然メンテされてないんですけど

A:エンジニアなら、フォークするなりプルリクだして直せ!

程度にもよりますが、多少のバグならそれほど時間を欠けずに修正できるはずです

Page 17: Rails on rspec plactice

目録

・1クラス1 Specファイルは冗長だ!

・ APIのテスト

・ FactoryGirl

・カバレッジ

・便利な Gemを使おう

・その他

Page 18: Rails on rspec plactice

Rails on Rspecplactice

他にもテストで考えることは色々ある

・テスタブルな処理の書き方

・テストの実行時間の問題

・ featureテストは開発するエンジニアが書くものではないのでは?

・ fixtureの取り扱い

etc...

調べれば何かしら出てくると思うので詳しくは話しません。

Page 19: Rails on rspec plactice

良きテストライフを!