QA@IT

Rails/Capybara2 での feature spec, request specs, controller spec の使い分けの基準は

3182 PV

rspec-rails and capybara 2.0: what you need to know - andylindeman.com によれば、capybara 2.0 を使う Rails アプリでは、これまで request spec で capybara の語彙で書いていたテストは、feature spec として、spec/features 以下に置くようです。それで request spec で何をテストするかというと "Use RSpec request specs to test interactions with your application as a HTTP API" という意見がサンプルとともに示されています。ただ、サンプルのテストを見ていると、こういうの、コントローラのテストとして書いていたなーと思ってしまいました。そうだとするとコントローラのテストの役割というか、新 request spec との役割分担が変わってくるのかと思いました。feature spec を利用することを前提とした場合、feature spec、request specs、controller spec はどう使い分けるべきなのでしょうか。

  • 風邪をひいて寝込んでいるため、少なくとも 1/22 は返信できない可能性が高いです。 -

回答

RSpec自体はテストを記述するためのドメイン特化言語(DSL:Domain Specific Language)を提供するフレームワークなので、まさに「言語」として広い範囲をカバーします。

テストには、視点や範囲の違いで 1.ユニットテスト 2.インテグレーションテスト 3.エンドツーエンドテスト 4.受け入れテストというようにベタからメタ方向に守備範囲の違いで区別があります。

feature spec、request specs、controller spec は、次のように使い分ければよいのではないかと思います。
feature spec : エンドツーエンドテスト
request specs : インテグレーションテスト
controller spec : ユニットテスト

〔補足〕受け入れテストにはCucumberが向いているでしょうが、Turnipの台頭で、受け入れテストもRSpec+Turnipで行われるようになるのではないでしょうか。

編集 履歴 (0)
  • ありがとうございます。
    feature spec はわかりやすいのですが、新request specs と controller spec の一部は語彙が共通します。そのときにどちらで書こうか迷ったら「インテグレーションテストなのか/ユニットテストなのか」を判断の指針にしようと思います。
    -
  • でも [End-to-end testing with RSpec integration tests and Capybara](http://goo.gl/UNxkb) を読むと、integration test と End-to-end test をはっきりと request specs と feature spec に対応づけられれると想定するのは不自然なのかもしれません。 -
  • でもfeature specの導入は [Improving the integration between Capybara and RSpec](http://goo.gl/z6SxA) での議論が影響しているみたいですが、昔は最初の引用先のように、spec/request の内容が capybara DSL によってたんなる integration test 以上の役割を担えたけれど、 -
  • spec/request に 2つの書き方があるのは混乱するから feature spec を導入しようということになって、その結果 request spec には End-to-end test, 受け入れテスト的な側面がなくなり、iR3 さんの分類におさまるようになったのかもしれないですね。 -
  • ベタ ← Test::Unit ― controller spec ― request specs ― feature spec ― Gherkin(Cucumber/Turnip) → メタ という感じですね。 -
  • UnitTestでCapybaraを使ってエンドツーエンドテストという技もあるのでややこしいですね。http://www.clear-code.com/blog/2012/1/18.html -
  • Capybara を使えば✷どこ✷でもエンドツーエンドテストできるんですね。だけど語彙が2パターンになってしまうから、Capybara DSL は feature spec で使うことにしよう、ということであれば、spec/features はエンドツーエンドにしたいどの層(unit/integration問わず)のテストを置いてもよい、と捉えられそうですね。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。