RSpec vs Cucumber (RSpec-Geschichten) [geschlossen]

136

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

Aber was ist, wenn ich mein eigenes Projekt mache? Die meiste Zeit weiß ich, wie die Teile des Systems interagieren. Ich muss nur ein paar Unit-Tests schreiben. Was sind die möglichen Situationen, in denen ich dann Gurke brauchen würde?

Und als entsprechende zweite Frage: Muss ich Spezifikationen schreiben, wenn ich Gurkengeschichten schreibe? Wäre es nicht eine doppelte Prüfung derselben Sache?

Snitko
quelle
12
Wie kommt es, dass jede einzelne [geschlossene] Frage, auf die ich stoße, von Bill the Lizard als "nicht konstruktiv" geschlossen wird UND gleichzeitig die Frage viele Male positiv bewertet wird!?! Was vermisse ich ?
Ashkan Kh. Nazary
4
Ich bin vollkommen einverstanden. Ich bin immer noch sehr verwirrt, wo ich Fragen wie "Was ist die beste Vorgehensweise für XXX?" Posten soll.
Dean
3
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.
Russell Silva
Ich habe diese Frage 2017 gefunden, weil sie immer noch relevant und immer noch eine großartige Frage mit großartigen Antworten ist. Es lädt auch nicht zur Meinung ein, da die fraglichen Frameworks von größtenteils denselben Personen für zwei völlig getrennte Anliegen entworfen wurden ... aber Sie benötigen ein wenig Fachwissen, um das zu wissen.
Lunivore

Antworten:

114

Wenn Sie es noch nicht getan haben, sollten Sie sich den hervorragenden Artikel von Dan North ansehen: Was steckt in einer Geschichte? als Ausgangspunkt.

Wir haben zwei Hauptverwendungen für Gurkengeschichten. Erstens, da die Story-Form sehr spezifisch ist, hilft sie dabei, die Artikulation der Funktionen des Produktbesitzers zu fokussieren, die er erstellen möchte. Dies ist das "Token für eine Konversation" -Verwendung von Geschichten und wäre wertvoll, unabhängig davon, ob wir die Geschichten in Code implementiert haben oder nicht. Zweitens, wenn der Prozess gut genug funktioniert, dass wir vollständige Geschichten haben, bevor wir mit dem Schreiben des Features beginnen (eher ein Ideal, das wir anstreben als eine tägliche Realität), haben Sie Ihre Akzeptanzkriterien klar formuliert und wissen genau, was und wie viel zu bauen.

In unserer Rails-Arbeit ersetzen Gurkengeschichten nicht rspec-Unit-Tests. Die beiden gehen Hand in Hand. In der Praxis treiben die Komponententests die Entwicklung der Modelle und Controller voran, und die Storys fördern tendenziell die Entwicklung der Ansichten (wir schreiben normalerweise keine Spezifikationen für unsere Ansichten) und bieten einen guten Test der gesamten Anwendung aus dem Benutzerperspektive.

Wenn Sie alleine arbeiten, ist der Kommunikationsaspekt für Sie möglicherweise nicht so interessant, aber die Integrationstests, die Sie von Cucumber erhalten, sind möglicherweise. Wenn Sie Webrat nutzen , kann das Schreiben von Gurken für viele Ihrer Grundfunktionen schnell und schmerzlos sein.

Abie
quelle
6
Sie verschmelzen zwei verschiedene Themen. 1) Ist es gut, Integrations- und Abnahmetests durchzuführen, 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 Indirektion zu schreiben, wenn Sie gut lesbare Integrations- und Akzeptanztests in rspec und capybara schreiben können (oder - himmlisch, wir könnten Rubys Standardbibliothekstest untersuchen) / Einheit oder Minitest, zusammen mit Capybara). Siehe den Beitrag, auf den Jack Kinsella unten verweist.
Graham Ashton
Stimme dir voll und ganz zu, Abie! Die Integration von Gurken ist entscheidend!
Papadopoulos
26

Betrachten Sie es als einen Zyklus:

Schreiben Sie Ihre Gurkenfunktion und schreiben Sie dann während der Entwicklung der Teile für diese Funktion Spezifikationen, um die einzelnen Komponenten zu vervollständigen. Füllen Sie die Spezifikationen so lange aus, bis Sie genügend Funktionen für die Funktion geschrieben haben, und schreiben Sie dann die nächste Funktion.

Josiah Kiehl
quelle
1
Es gibt ein sehr schönes Beispiel für den Zyklus Outside-in BDD .
Rdamborsky
21

Meiner Meinung nach ist es in den meisten Situationen eine schlechte Idee, Cucumber zu verwenden, da die Syntaxkosten für Sie aufgrund der Syntax anfallen. Ich habe ausführlich über das Thema in Warum mit Gurkentests belästigen?

Jack Kinsella
quelle
1
Ich habe Ihren Artikel gelesen und als Gurkenfan muss ich sagen, dass ich vielen Punkten zustimme, die Sie in Ihrem Artikel zitieren. Obwohl ich immer noch denke, dass Gurke eine gute Möglichkeit ist, Tests zu formalisieren und sie für Außenstehende leicht lesbar zu machen.
Huug
1
Jack - fantastischer Beitrag. Vielen Dank für das Schreiben, Sie haben mir die Mühe erspart, es selbst zu tun.
Graham Ashton
3
huug - Es ist vielleicht eine gute Möglichkeit, Tests "Außenstehenden" 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 muss ich noch mit einem nicht-technischen Mitglied eines Projekts zusammenarbeiten, das seine Zeit mit Lesetests verschwenden möchte. Ich weiß nicht, vielleicht habe ich Glück ...
Graham Ashton
Abgestimmt. Ich finde, dass es für mich als Entwickler nützlich ist , Benutzerfunktionen in Benutzerbegriffen zu beschreiben , unabhängig davon, ob Benutzer jemals meine Gurkengeschichten gelesen haben. Deshalb benutze ich Cucumber für alle meine Projekte und ermutige andere, dies ebenfalls zu tun.
Marnen Laibow-Koser
8

Eine Gurkengeschichte ist eher eine Beschreibung des Gesamtproblems, das Ihre Anwendung löst, als ob einzelne Codebits funktionieren (dh Komponententests).

Wie Abie beschreibt, handelt es sich fast um eine Liste von Anforderungen, die die Anwendung erfüllen sollte. Sie ist sehr hilfreich für die Kommunikation mit Ihrem Kunden und kann direkt getestet werden.

Dave Glassborow
quelle
2
Genau. Gurke beschreibt die Verwendung Ihrer Anwendung. ZB "Ich klicke hier und erwarte dieses oder jenes Ergebnis". Die technischen Daten beziehen sich eher auf die Modellebene. Wenn ich diese Methoden mit solchen und solchen Parametern aufrufe, erwarte ich, dass sie dieses Ergebnis zurückgeben.
Ariejan
6

Heutzutage können Sie rspec mit Capybara und Selenium Webdriver verwenden und vermeiden, dass Sie alle Cucumber-Story-Parser erstellen und warten müssen. Folgendes würde ich empfehlen:

  1. Schreiben Sie Ihre Geschichte auf
  2. Mit RSpec würde ich einen Integrationstest erstellen, z. B.: Spec / integrations / socks_rspec.rb
  3. Dann würde ich einen Integrationstest erstellen, der eine neue Beschreibung enthält und für jedes Szenario blockiert
  4. Dann würde ich die minimale Funktionalität implementieren, die erforderlich ist, um den Integrationstest zu erhalten, und während ich tiefer zurückkehre (in Controller und Modelle usw.), würde ich TDD auf Controllern und Modellen durchführen.
  5. Wenn Sie zurückkehren, sollte Ihr Integrationstest erfolgreich sein und Sie können dem Integrationstest weitere Schritte hinzufügen
  6. wiederholen

Beachten Sie jedoch, dass sich die Controller- und Integrationstests möglicherweise nicht überlappen, sodass Sie nach bestem Wissen und Gewissen keine Zeit verschwenden müssen.

Sobald Sie Ihren Groove gefunden haben, wird es Ihnen am meisten Spaß machen, ihn mit BDD zu entwickeln. Bis dahin fühlen Sie sich nicht schuldig, wenn Sie nicht das Gefühl haben, dass Sie es perfekt machen und nicht darüber nachdenken. Du wirst es gut machen!

PeppyHeppy
quelle
2

Aber was ist, wenn ich mein eigenes Projekt mache? Die meiste Zeit weiß ich, wie die Teile des Systems interagieren. Ich muss nur ein paar Unit-Tests schreiben. Was sind die möglichen Situationen, in denen ich dann Gurke brauchen würde?

Du brauchst noch Gurke. Sie benötigen es, um zu dokumentieren, wie das System funktioniert, und um sicherzustellen, dass die Funktionalität beim Ändern nicht beeinträchtigt wurde.

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

Marnen Laibow-Koser
quelle
2
Ich würde nicht sagen, dass Gurke wesentlich ist, aber Sie sollten auf jeden Fall eine Art Integrationstest durchführen, da Komponententests normalerweise nur zum isolierten Testen von Klassen verwendet werden.
Andy Waite
1
Richtig. In den meisten Fällen ist Gurke die beste Art, Integrationstests zu schreiben.
Marnen Laibow-Koser