2009-11-09 12 views
11

Kann jemand bitte mit einer EINFACHEN User Story klären, wofür Cucumber verwendet wird und wofür RSpec verwendet wird? Ich kaufte das RSpec-Buch neulich und habe es durchlaufen. Der Autor scheint manchmal ziemlich vage zu sein.TDD/BDD Rails Gurken-/RSpec-Duplizierung

Was ich denke an, wenn der User Story ist so etwas wie (bitte die Syntax Unrichtigkeit entschuldigen, das ist nur so Sie erhalten den Punkt):

Wenn ein Benutzer eine ungültige Telefonnummer tritt dann bekommen sie eine Nachricht mit dem Titel "Ungültige Telefonnummer"

Wenn ich den ganzen Code für Cucumber schreibe, um dies zu überprüfen und dann das rspec Zeug zu schreiben, bin ich im Grunde meinen Test duplizieren. Gibt es ein Szenario, um zu erklären, wie sich der Gurkentest vom rspec-Test unterscheiden sollte?

Ich glaube, du würdest die Tests auf beiden Ebenen ständig duplizieren.

Wenn es keine definitive Antwort zu diesem Thema gibt, werde ich anfangen zu denken, dass die Gurkenmenschen einfach nicht auf die Zehenspitzen der RSpec treten wollten.

Bitte helfen. Ich habe das Gefühl, dass mein Kopf explodiert.

Danke!

Antwort

12

Gurke wird verwendet, einen Teil (Geschichte) der Anwendung und nicht Unit-Tests oder Verhaltenstests

So IMHO Cucumber Tests (Geschichten) (die im Mittelpunkt RSpec ist) zu erklären (eine Beschreibung machen) ersetzen Sie keine RSPE-Tests.

Die RSpec-Tests neigen dazu, die Entwicklung der Modelle und Controller zu fördern, und die Geschichten neigen dazu, die Entwicklung der Ansichten voranzutreiben.

von Ihrer Beschreibung scheint, wie Sie Gurke sowohl Test die Geschichten und das Verhalten kann

+0

Ich stimme völlig zu, das war meine Erfahrung auch. –

2

Gurke verwendet verwenden werden, so ziemlich jedem Code auszuführen, weshalb ich glaube, du bist verwirrt. Aber Gurke bietet keine anderen Arten von Testeinrichtungen wie Spott- und Stubbing-Methoden, die Komponententests spezifischer machen.

Das rspec-Zeug ist wirklich dazu gedacht, kleine Bits des Verhaltens zu adressieren und alles sehr diskret zu machen. Wenn Sie sich mit Komponententests und den Frameworks dafür auskennen, sollte dies mehr Sinn machen.

Das Dienstprogramm Gurke ist in der Lage, High-Level-Beschreibungen in eine Reihe von Top-Level-Aktionen auf dem System zu übersetzen.

5

Rspec und Cucumber sind unabhängig und Sie können Cucumber und ein anderes Testframework für Ihre Tests verwenden (Test Unit, sophia etc).

Der Punkt ist, was willst du mit Gurke testen? Weil Sie in der Tat doppelte Tests beenden könnten und das wäre nicht wirklich nützlich, nicht wahr? :)

Es gibt verschiedene Philosophien mit Gurke.

Mit Gurke können Sie tun:

DMA (direkte Modell Zugriff Bedeutung, ja Sie Ihr Modell vollständig testen können, wie Sie in rspec tun würden)

Simulierte BrowZer (Zugang gesamten MVC-Stack , kein Javascript)

Automatisierte Browser (Verwendung webrat und Selen Ihre Ansichten zuzugreifen, mit Javascript, langsamer, real BrowZer)

Was ich tun möchte, ist Gurke verwenden, um zu überprüfen, was an den Benutzer zurückgegeben wird. Das ist normalerweise für mich sinnvoll, wenn ich meine Geschichten definiere, da ich nicht wirklich an den Code denke, den ich schreiben werde. Also teste ich das Endergebnis mit Gurke -> Ansichten (mit simulierten oder automatisierten Browzer)

Dann verwende ich rspec, um jeden Code zu testen, den ich in den Controllern und Modellen schreibe.

So in Ihrem Fall

Wenn ein Benutzer eine ungültige Telefonnummer tritt dann erhalten sie eine Nachricht „Ungültige Telefonnummer“ sagt

würde ich webrat verwendet um zu überprüfen, dass der Benutzer die erhält Ungültige Telefonnummer Nachricht in der Ansicht. Ich würde Rspec verwenden, um meine Controller-Aktion und mein Modell zu testen.

13

Es könnte nützlich sein, die Screencasts unter BDDCasts.com zu betrachten. Sie führen Sie durch die Erstellung der Geschichten und Spezifikationen für eine App. Es hat mir wirklich geholfen. Besitze auch das rspec Buch, war aber immer noch verwirrt. Vielleicht möchten Sie auch nur ihre Quelle auf GitHub überprüfen.

Für mich geht es wie folgt aus:

  • Gurke zu testen, was der Benutzer sehen. (Vollständiger Stapeltest)

  • Rspec, um alles andere zu testen. (Modell, Controller)

6

Denken Sie an Gurke als gesamte Anwendung zu testen, von außen nach innen, wo RSpec ist Unit-Tests von spezifischen Modulen. Sie beginnen damit, dass Sie angeben, welche Verhaltensweisen Ihre Anwendung in Cucumber haben soll, und geben Sie dann in RSpec an und beschreiben Sie die Klassen und Module, die dieses Verhalten ermöglichen.

Es hat eine Weile gedauert, bis ich es bekommen habe, aber ich finde, dass Cucumber wirklich gut ist, um allgemein zu beschreiben, welche Funktionen deine Anwendung haben soll und RSpec ist wirklich gut darin zu beschreiben, wie es das eigentlich machen soll.

Also würden Sie in Ihren Gurkengeschichten sagen, welche Art von Funktion Sie wollen und super einfache Schritte schreiben, um Input zu liefern und die Ausgabe zu betrachten. Dann fahren Sie mit RSpec fort und schreiben Spezifikationen, wie es das eigentlich machen soll.

Angenommen, Sie können nach Benutzernamen auf einer Website suchen.Sie könnten eine Gurke-Funktion und die erste (und nur die erste) Szenario wie folgt schreiben:

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 

Sie führen Gurke, es sagt Ihnen, die Schritte Sie fehlt, kopieren Sie diese und die einfachen Schritten erstellen zu überprüfen für dieses Zeug, aber schreibe noch keinen Code.

Wenn Sie mit Ihren Schrittdefinitionen fertig sind, wechseln Sie zu RSpec und beginnen Sie mit der Erstellung von Spezifikationen, wie dies funktioniert. (Gurke sollte natürlich sein Versagen)

describe "SearchController" do 

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

end 

Sie RSpec laufen und beobachten Sie es dann nicht gehen und schreiben Sie Ihren Code:

class SearchController 

    def search 
    end 

end 

Das ist es. Führen Sie den Test jetzt erneut aus. Es sollte passieren, also beginnen Sie genauer zu werden und beginnen Sie zu beschreiben, wie Sie die Suchfunktion tatsächlich verwenden werden. Ich wollte nicht zu sehr darauf eingehen. Ich wollte Ihnen nur die Idee geben, dass Sie beschreiben, was Sie in Cucumber wollen, und dann beschreiben, wie es in RSpec funktionieren soll.

Natürlich können Sie alles in Cucumber oder alles in RSpec tun, aber ich habe wirklich gefunden Gurke hilft mir auf sehr einfache Weise sagen, was ich will, wenn ich versuche, in RSpec zu tun, bin ich in den Details stecken. Wenn ich zuerst Cucumber benutze, um das grundlegende Feature zu beschreiben, das ich möchte, und warum, dann kann ich in RSpec hineingehen und sagen, wie ich das Feature wirklich funktionieren lassen möchte.

Manchmal wird es Doppelungen in Ihren Tests geben, die nicht sehr TROCKEN sind, aber wenn Sie es als Detaillierungsgrad betrachten, stört es Sie vielleicht nicht so sehr. Ich machte eine Menge Doppelarbeit, bis ich merkte, dass ich generell sagen sollte, was ich in Gurke will und dann genau das sage, was ich in RSpec will.

Das ist alles nur eine Neueinsteiger Idee, wie man die Werkzeuge benutzt, aber es scheint, für mich bis jetzt gut zu arbeiten. Ich habe dir wahrscheinlich ein schreckliches Beispiel gegeben, aber ich versuche nur, die allgemeinen Details zu bestimmten Details zu bringen, die ich bei der Verwendung der Tools als nützlich empfunden habe.