2008-12-26 20 views
135

Wann sollte ich Spezifikationen für Rails-Anwendung und wann Gurke (früher rspec-Geschichten) verwenden? Ich weiß natürlich, wie beide arbeiten und Spezifikationen aktiv nutzen. Aber es fühlt sich immer noch komisch an, Gurke zu benutzen. Meine aktuelle Ansicht ist, dass es praktisch ist, Cucumber zu verwenden, wenn Sie eine Anwendung für den Client implementieren und nicht verstehen, wie das ganze System noch funktionieren soll.RSpec vs Gurke (RSpec stories)

Aber was ist, wenn ich mein eigenes Projekt mache? Die meiste Zeit weiß ich, wie die Teile des Systems interagieren. Alles, was ich tun muss, ist eine Reihe von Komponententests zu schreiben. Was sind die möglichen Situationen, in denen ich Gurke dann brauchen würde?

Und als eine entsprechende zweite Frage: Muss ich Spezifikationen schreiben, wenn ich Gurkengeschichten schreibe? Wäre es nicht doppelt getestet?

+11

Wie kommt * jede * * single * [Closed] Frage, die ich stolpern wird als "nicht konstruktiv" von Bill der Eidechse geschlossen UND zur gleichen Zeit die Frage viele Male upvoted! ?! Was vermisse ich ? –

+3

stimme ich voll und ganz zu. Ich bin immer noch sehr verwirrt, wo ich Fragen wie "Was ist Best Practice, um XXX zu machen" posten kann. – Dean

+2

Ich stimme zu, ich stoße immer wieder auf gute Fragen mit aufschlussreichen, hilfreichen Antworten auf SO, die aus dem einen oder anderen Grund geschlossen wurden. –

Antwort

114

Wenn Sie es nicht schon getan haben, sollten Sie Dan North's ausgezeichneten Artikel, What's in a Story? als Ausgangspunkt betrachten.

Wir haben zwei Hauptanwendungen für Gurken Geschichten. Erstens, weil die Story-Form sehr spezifisch ist, hilft es, die Artikulation der Merkmale des Produktbesitzers, die er bauen will, zu fokussieren. Dies ist der "Token für eine Konversation" der Verwendung von Stories und wäre wertvoll, unabhängig davon, ob wir die Stories im Code implementiert haben oder nicht. Zweitens, wenn der Prozess gut genug funktioniert, dass wir komplette Geschichten haben vor wir beginnen, die Funktion zu schreiben (mehr von einem Ideal, das wir anstreben als eine tägliche Realität), haben Sie Ihre Akzeptanzkriterien klar formuliert und Sie wissen genau was und wie viel zu bauen.

In unserer Rails-Arbeit ersetzen Cucumber-Stories keine Rspec-Unit-Tests. Die beiden gehen Hand in Hand. In der Praxis neigen die Komponententests dazu, die Entwicklung der Modelle und Controller voranzutreiben, und die Geschichten neigen dazu, die Entwicklung der Ansichten voranzutreiben (wir neigen nicht dazu, rspec für unsere Ansichten zu schreiben) und bieten einen guten Test der gesamten Anwendung von Benutzerperspektive.

Wenn Sie alleine arbeiten, ist der Kommunikationsaspekt möglicherweise nicht so interessant für Sie, aber die Integrationstests, die Sie von Cucumber erhalten, könnten sein. Wenn Sie die Vorteile von webrat nutzen, kann das Schreiben von Gurken für viele Ihrer grundlegenden Funktionen schnell und schmerzlos sein.

+5

Sie führen zwei separate Probleme zusammen; 1) ist es gut, Integration und Akzeptanz Tests zu tun, und 2) ist Gurke ein gutes Werkzeug, um diese Tests zu schreiben. Für 1 - ja, es ist eindeutig eine gute Idee. Für 2 ist es selten effizienter für ein Entwicklungsteam, Tests in einer Sprache mit so viel Indirektheit zu schreiben, wenn Sie sehr lesbare Integrations- und Akzeptanztests in rspec und capybara schreiben können (oder - Gott sei Dank - wir könnten Rubys Standard-Bibliothekentest untersuchen)/Einheit oder Minitest, zusammen mit Capybara). Sieh den Beitrag, den Jack Kinsella unten verlinkt. –

8

Eine Gurkenstory ist eher eine Beschreibung des Gesamtproblems, das Ihre Anwendung löst, als wenn einzelne Codebits funktionieren (z. B. Komponententests).

Wie Abie beschreibt, ist es fast eine Liste von Anforderungen, die die Anwendung erfüllen sollte, und ist sehr hilfreich für die Kommunikation mit Ihrem Kunden, sowie direkt testbar.

+2

Genau. Gurke beschreibt die Verwendung Ihrer Anwendung. Z.B. "Ich klicke hier und ich erwarte dieses oder jenes Ergebnis". Spezifikationen sind mehr auf "Modell" -Ebene. Wenn ich diese Methoden mit derartigen Parametern anrufe, erwarte ich, dass sie dieses Ergebnis zurückgibt. – Ariejan

26

Betrachten Sie es als Zyklus:

Schreiben Sie Gurke Feature, dann, während die Stücke für diese Funktion zu entwickeln, Spezifikationen schreiben die einzelnen Komponenten zu vervollständigen. Fahren Sie mit dem Ausfüllen der technischen Daten fort, bis Sie genügend Funktionen für die Übergabe der Funktion geschrieben haben, und schreiben Sie Ihre nächste Funktion.

+1

Es gibt ein sehr schönes Beispiel für den Zyklus [Outside-in BDD] (http://www.sarahmei.com/blog/2010/05/29/outside-in-bbd/). – rdamborsky

2

Aber was ist, wenn ich mein eigenes Projekt mache? Die meiste Zeit weiß ich, wie die Teile des Systems interagieren. Alles, was ich tun muss, ist eine Reihe von Komponententests zu schreiben. Was sind die möglichen Situationen, in denen ich Gurke dann brauchen würde?

Sie brauchen immer noch Gurke. Sie benötigen es, um zu dokumentieren, wie das System funktioniert, und Sie benötigen es, um sicherzustellen, dass Sie die Funktionalität nicht beim Ändern der Dinge unterbrochen haben.

Mit anderen Worten, Sie brauchen Gurken Geschichten aus den gleichen Gründen wie Sie Unit Tests benötigen - sie arbeiten nur auf einer höheren Abstraktionsebene.

+2

Ich würde nicht sagen, dass Gurke war wichtig, aber Sie sollten sicherlich eine Art von Integration Tests haben, da Unit-Tests normalerweise nur für das Testen von Klassen isoliert verwendet werden. –

+1

Richtig. Und in den meisten Fällen ist Cucumber die beste Art, Integrationstests zu schreiben. –

6

Heutzutage können Sie rspec mit Capybara und Selenium Webdriver verwenden und müssen nicht alle Cucumber-Story-Parser erstellen und pflegen. Hier ist, was ich empfehlen würde:

  1. Schreiben Sie Ihre Geschichte
  2. Mit RSpec, würde ich einen Integrationstest ex erstellen: spec/Integrationen/socks_rspec.rb
  3. Dann würde ich einen Integrationstest schaffen, die umfasst eine neue beschreiben und es für jedes Szenario blockieren
  4. Dann würde ich implementieren die minimale Funktionalität erforderlich, um den Integrationstest zu erhalten und während tiefer (in Controller und Modelle, etc) Ich würde TDD auf Controller und Modelle.
  5. Wie Sie zurückkommen sollen Sie Ihren Integrationstest bestehen und Sie können weiterhin Schritte zum Integrationstest

Eine Sache zu beachten,

  • Wiederholung jedoch hinzuzufügen ist, dass die Steuerung und Integrationstests Überlappung das ist vielleicht nicht notwendig, also müssen Sie Ihr bestes Urteilsvermögen verwenden, damit Sie keine Zeit verschwenden.

    Auch wenn Sie Ihren Groove finden Sie es am angenehmsten zu entwickeln mit BDD, bis dann nicht schuldig fühlen, wenn Sie nicht das Gefühl haben, Sie tun es perfekt und nicht darüber nachdenken. Du wirst das sehr gut machen!

  • 20

    Ich nehme an, dass es eine schlechte Idee ist, Gurke in den meisten Situationen wegen der Kosten in der Produktivität zu verwenden, die ihre Syntax auf Sie verursacht. Ich schrieb ausführlich über das Thema in Why Bother With Cucumber Tests?

    +0

    Ich habe deinen Artikel gelesen und als Gurkenfan muss ich sagen, dass ich vielen Punkten zustimme, die du in deinem Artikel zitierst. Obwohl ich immer noch denke, Gurke ist eine gute Möglichkeit, Tests zu formalisieren und sie für Außenstehende leicht lesbar zu machen. – huug

    +0

    Jack - fantastischer Beitrag. Danke, dass Sie es geschrieben haben, Sie haben mir die Mühe erspart, es selbst zu tun. –

    +3

    huug - Es könnte eine gute Möglichkeit sein, Tests "Außenseitern" auszusetzen, aber Sie zeigen mir ein nicht-technisches Teammitglied, das die Tests lesen möchte, und ich zeige Ihnen ein Team, das sein Budget verschwendet. Außerdem arbeite ich noch mit einem nicht-technischen Mitglied eines Projekts, das seine Zeit Lesetests verschwenden würde. Ich weiß nicht, vielleicht habe ich Glück ... –