12

誰かがSIMPLEユーザーストーリーを使用して、Cucumberが何に使用され、RSpecが何に使用されるかについての完全なスライスを明確にできますか?先日、RSpecの本を購入して、それを読んでいます。作者は時々かなり漠然としているようです。

ユーザーストーリーが次のようなものである場合に私が考えていること(構文の誤りを許してください、これはあなたが要点を理解するためです):

ユーザーが無効な電話番号を入力すると、「無効な電話番号」というメッセージが表示されます

これをチェックするためにCucumberのすべてのコードを書き、次にrspecのものを書く場合、基本的にテストを複製しています。キュウリのテストがrspecのテストとどのように異なるべきかを説明するシナリオはありますか?

いつも両方のレベルでテストを複製しているような気がします。

これについて決定的な答えがない場合、私はキュウリの人々がRSpecの人々のつま先を踏みたくなかったと思い始めます。

助けてください。頭が爆発しそうな気がします。

ありがとう!

4

6 に答える 6

13

BDDCasts.comでスクリーンキャストを調べると役立つ場合があります。アプリのストーリーと仕様の作成について順を追って説明します。本当に助かりました。rspec の本も持っていますが、まだ混乱していました。github でソースをチェックアウトすることもできます。

私にとっては、次のようになります。

  • ユーザーに表示される内容をテストするキュウリ。(フルスタックテスト)

  • 他のすべてをテストする Rspec。(モデル、コントローラ)

于 2009-11-09T14:11:12.150 に答える
12

キュウリは、単体テストや動作テスト(RSpecの焦点)ではなく、アプリケーションの一部(ストーリー)の説明(説明)に使用されます。

したがって、IMHOキュウリテスト(ストーリー)はRSpecテストの代わりにはなりません。

RSpecテストはモデルとコントローラーの開発を促進する傾向があり、ストーリーはビューの開発を促進する傾向があります。

あなたの説明から、あなたは物語と行動の両方をテストするためにキュウリを使用しているようです。

于 2009-11-09T13:34:52.363 に答える
6

RSpec が特定のモジュールの単体テストである場合、Cucumber はアプリケーション全体を外部からテストするものと考えてください。Cucumber でアプリケーションに持たせたい動作を指定することから始めて、RSpec にドロップダウンし、その動作を機能させるクラスとモジュールを記述します。

理解するのに少し時間がかかりましたが、Cucumber は、アプリケーションに実行させたい機能を大まかに説明するのに非常に優れており、RSpec は実際にそれをどのように行うべきかを説明するのに非常に優れていることがわかりました。

つまり、きゅうりのストーリーで、どのような機能が必要かを説明し、入力を提供して出力を確認するための非常に簡単な手順を記述します。次に、RSpec にドロップダウンし、実際にどのように実行するかについて仕様を記述します。

あなたの機能が、Web サイトでユーザー名を検索する機能であるとしましょう。次のようにキュウリの機能と最初の (そして最初だけの) シナリオを書くかもしれません:

Feature: Search users
  In order to find people with similar interests as myself
  As a user
  I want to search for people

Scenario: Search for similar hobbies
  Given there is a search page
    And there is a list of hobbies
    And one of the hobbies is "full contact ironing"
   When I select "full contact ironing"
    And press search
   Then a list of users with the hobby "full contact ironing" are shown

Cucumber を実行すると、不足しているステップが表示されます。それらをコピーして、このようなものをチェックするための簡単なステップを作成しますが、まだコードを記述しません。

ステップの定義が完了したら、RSpec にドロップダウンして、これをどのように機能させたいかについての仕様を書き始めます。(キュウリはもちろん失敗するはずです)

describe "SearchController" do

  it "should respond to searches" do
    sc = SearchController.new
    sc.should respond_to(:search)
  end

end

RSpec を実行し、失敗するのを確認してから、コードを書きます。

class SearchController

  def search
  end

end

それでおしまい。ここで、テストを再度実行します。合格するはずなので、より具体的に始め、実際に検索機能をどのように使用するかを説明し始めます。あまり深く掘り下げたくはありませんでしたが、Cucumber で必要なものを記述し、それが RSpec で実際にどのように機能するかを記述するというアイデアを提供したかっただけです。

もちろん、Cucumber または RSpec ですべてを実行できますが、Cucumber を使用すると、必要なことを非常に簡単な方法で伝えることができることがわかりました。RSpec でそれを行おうとすると、詳細に行き詰まってしまいます。最初に Cucumber を使用して、必要な基本機能とその理由を説明した場合、RSpec に立ち寄って、その機能を実際にどのように機能させたいかを説明できます。

テストで重複が発生することがありますが、これはあまり DRY ではありませんが、詳細レベルの問題と考えれば、それほど気にならないかもしれません。最初は、Cucumber で欲しいものを一般的に言ってから、RSpec で欲しいものを具体的に言うべきだと気付くまで、多くの努力を繰り返していました。

これはすべて、ツールの使用方法に関する初心者のアイデアにすぎませんが、これまでのところうまく機能しているようです。私はおそらくあなたにひどい例を挙げましたが、ツールを使用するときに役立つとわかった一般的な詳細から特定の詳細まで要点を理解しようとしています.

于 2010-12-03T06:23:16.173 に答える
5

Rspec と Cucumber は独立しており、Cucumber と別のテスト フレームワークをテスト (テスト ユニット、shoulda など) に使用できます。

ポイントは、きゅうりで何をテストしたいのかということです。確かに、テストの複製を終了することができますが、それは本当に役に立ちませんよね? :)

Cucumber にはさまざまな哲学があります。

Cucumber を使用すると、次のことができます。

DMA (モデルへの直接アクセスの意味、はい、rspec で行うようにモデルを完全にテストできます)

シミュレートされたブラウザ(MVC スタック全体にアクセス、javascript なし)

自動化されたブラウザー(webrat と selenium を使用してビューにアクセスし、javascript、より遅い、実際のブラウザーを使用)

私がやりたいのは、cucumber を使用して、ユーザーに何が返されるかを確認することです。私が自分のストーリーを定義するとき、これは通常、私が書くコードを本当に念頭に置いていないので、私にとって意味のあることです。したがって、Cucumber -> ビュー (シミュレートまたは自動化されたブラウザーを使用) で最終結果をテストしています。

次に、rspec を使用して、コントローラーとモデルに記述したコードをテストします。

したがって、あなたの場合、

ユーザーが無効な電話番号を入力すると、「無効な電話番号」というメッセージが表示されます

Webrat を使用して、ユーザーがビューで無効な電話番号メッセージを受け取ることを確認します。Rspec を使用して、コントローラーのアクションとモデルをテストします。

于 2009-11-09T13:57:45.397 に答える
2

Cucumber はほとんどすべてのコードの実行に使用できるため、混乱していると思います。しかし、cucumber は、単体テストをより具体的にするモッキングやスタブ メソッドなど、他の種類のテスト機能を提供しません。

rspec は、実際には動作の小さなビットに対処し、すべてを非常に個別にすることを目的としています。単体テストとそのためのフレームワークに精通している場合、これはより理にかなっているはずです。

cucumber ユーティリティは、高レベルの説明をシステム上の一連の最上位アクションに変換できることにあります。

于 2009-11-09T13:51:08.687 に答える
0

この記事はあなたにいくつかの展望を与えるかもしれません:テストで自分自身を繰り返すとき-そしてしないとき

于 2010-05-14T21:56:58.793 に答える