Sind RSpec und Cucumber es wirklich wert?

12

Ich weiß, dass die meisten RoR-Programmierer Süchtige testen und ich verstehe die Vorteile einer großen Testsuite, aber wenn ich mit dem Testen beginne, bekomme ich nie eine so große Suite und frage mich immer: "Teste ich richtig? Gibt es wirklich effiziente?". Ich beschäftige mich oft mit Integrationstests, bei denen nur das Verhalten der Anwendung getestet wird.

Lohnt sich das Testen wirklich? Ich meine, lohnt sich die Zeit für das Schreiben von Tests wirklich?

Dann benutze ich RSpec, ich habe kürzlich Cucumber entdeckt, es eine Weile benutzt, aber ich weiß nicht, ob das Schreiben all dieser Schritte wirklich die Mühe wert ist? Ich weiß, dass ich Schritte wiederverwenden kann, aber ich weiß nie, ob diese Schritte zu vollständig sind oder nicht: Zum Beispiel habe ich a verwendet, Given I am logged in as (.+)aber ich weiß nicht, ob ich in seiner Definition sagen muss, Given there's a user called $1weil es den Benutzer duplizieren kann, wenn es jemals erstellt wurde aber es lohnt sich nicht, immer einen Schritt vorher zu haben Given I am logged in as (.+). Es ist ziemlich viel Code, der vielleicht selten nützlich sein wird. Ich denke, es gibt nicht jeden Tag neue Fehler an den getesteten Teilen ... Lohnt sich Gurke also wirklich im Vergleich zu RSpec?

Cydonia7
quelle

Antworten:

13

Mein 'ah-ha!' Momente über das Testen in Ruby und Rails kamen, als ich mich wirklich hinsetzte und die endgültigen Ressourcen zu diesem Thema las, die Bücher Rspec und Cucumber . Ich teilte Ihre anfängliche Verachtung von Gurke, aber dann wurde mir klar, dass ich das Bild aus einem völlig falschen Blickwinkel betrachtete.

Grundsätzlich geht es bei Cucumber um BDD (verhaltensgesteuerte Entwicklung) - Sie verwenden Cucumber, um Ihre Funktionen zu planen und woran Sie als Nächstes arbeiten werden. Hmm, als nächstes möchten Sie, dass Benutzer Beiträge in einem Forum oder etwas anderem bewerben können (um ein Beispiel zu stehlen;)). Also schreiben Sie etwas Einfaches.

Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.

Beachten Sie, dass es dort so ziemlich keine Verweise auf Code gibt. Das kommt in deinen Schritten. Wenn Sie Ihren Code umgestalten, müssen Sie möglicherweise Ihre Schrittdefinitionen ändern, aber das Verhalten (Ihre Funktion) muss sich nie ändern.

Jedes Mal, wenn Sie Ihre Gurkenfunktion ausführen, werden Sie so ziemlich durch das Testen der Funktion mit TDD (Test Driven Development) geführt. Dies erfolgt auf einer niedrigeren Ebene mit RSpec.

Erster Lauf - meine Definition für den ersten Schritt ist undefiniert. Kopieren Sie den Block, um ihn beispielsweise in user_steps.rb oder sogar session_steps.rb zu definieren, da er sich auf Benutzer und deren Sitzungen bezieht. Wie definieren Sie nun, dass ein Benutzer angemeldet ist? Sie können sie durch den Anmeldevorgang führen.

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

Sollte alles glücklich sein. Zweiter Schritt.

Given /^I can see the post "(.+)"$/ do |name|
  visit post_path(Post.find_by_name(name))
end

Wieder ziemlich einfach. Beachten Sie, dass wir das Verhalten nicht ändern müssen, wenn wir unseren Anmeldevorgang vollständig wiederholen oder wie unsere Beiträge definiert und angezeigt werden. Dritter Schritt.

When /^I vote the post up$/ do
  pending 
end 

Hier fangen Sie an, über neue Funktionen zu sprechen, aber Sie wissen noch nicht genau, wie es funktionieren wird. Wie stimmst du einen Beitrag ab? Sie können auf ein Bild von +1 oder etwas klicken, das einen Ajax-Beitrag an einen Controller sendet, der JSON zurückgibt, oder auf ein ähnliches. Jetzt können Sie mit reinen Rspec-Tests beginnen.

  • Testen Sie Ihre Ansicht, um sicherzustellen, dass das Bild +1 angezeigt wird.
  • Testen Sie Ihren Controller, ob er sich korrekt verhält, wenn er eine bestimmte Ajax-Anfrage im richtigen Format erhält (sowohl die glücklichen als auch die unglücklichen Pfade - was passiert, wenn eine ungültige Post-ID empfangen wird? Was passiert, wenn der Benutzer seine 25 Upvotes an einem Tag aufgebraucht hat? Erhöht es die Anzahl der Stimmen korrekt?)
  • Testen Sie Ihr Javascript so, dass es korrekt reagiert, wenn ein JSON-Blob im richtigen Format angezeigt wird (aktualisiert es das + 1-Bild, um anzuzeigen, dass es verwendet wurde? (Denken Sie hier an Google+ ...) Zeigt es die Dankesnachricht an? Usw. )

All dies hat keinen Einfluss auf das Verhalten. Wenn Sie jedoch mit den Tests auf niedrigerer Ebene fertig sind, ist es trivial, die Schrittdefinition für die Abstimmung eines Beitrags einzugeben. Es könnte so einfach sein wie click_link '+1'. Der Rest der Schritte sind Testergebnisse, was wiederum einfach zu bewerkstelligen sein sollte. Und wenn Sie fertig sind, wissen Sie, dass Ihre Funktion vollständig und abgeschlossen ist. Wenn sich das erforderliche Verhalten ändert, können Sie Ihre Funktion optimieren, andernfalls können Sie Ihren Implementierungscode in perfekter Sicherheit optimieren.

Ich hoffe das macht Sinn. Es war alles verrückt, aber ich denke, es zeigt den Unterschied zwischen BDD und TDD und warum Gurke und RSpec unterschiedliche Bedürfnisse bedienen.

Sevenseacat
quelle
Das war sehr hilfreich für mich. Aber ich habe noch eine Frage: Ich habe ein Projekt gestartet, bei dem RSpec zum Testen von Controllern und Ansichten verwendet wird. Der Code ist zu etwa 90% mit Tests abgedeckt. Glaubst du, ich brauche wirklich Gurke und verbringe jetzt Zeit damit, Schritte und Szenarien zu schreiben? Ich meine, ich kann das alles sowieso mit RSpec machen.
Cydonia7
@ Skydreamer: Wahrscheinlich nicht notwendig, aber es könnte eine gute Praxis sein. Solange Sie testen, sind Sie auf dem richtigen Weg :)
Sevenseacat
10

Testen ist meiner Meinung nach eine Kunst. Wenn Sie TDD (mit RSpec oder einem anderen Framework) ausführen, haben Sie zunächst das Gefühl, "Ihre Zeit zu verschwenden". Dies ist verständlich, da Sie keinen Produktionscode schreiben.

Sie sehen jedoch den Vorteil von TDD, wenn Sie Ihre Codebasis verbessern und gleichzeitig sicherstellen müssen, dass alles andere noch funktioniert. Mit TDD können Sie Regressionsfehler so früh wie möglich erkennen. Dadurch hat mich gerettet Tage der Arbeit , weil ich fokussierte Tests hatte die meine Fehler hingewiesen.

Darüber hinaus können Tests für Codeüberprüfungen von Vorteil sein, da Ihr Prüfer sehen kann, welche Szenarien Sie testen und wie Ihr Code verwendet werden soll.

Sobald Sie in den Schwung von TDD geraten sind, fühlt sich alles andere falsch an.

David Weiser
quelle
2
+1 Obwohl aus Erfahrung gesprochen, ist "in den Schwung von TDD zu geraten" eine herkulische Anstrengung an und für sich und für die Mehrheit der Entwickler sehr schwer zu tun.
Wayne Molina
@ Wayne M: Einverstanden. Der Einstieg in den TDD-Groove ist schwierig, aber die Vorteile sind enorm. :)
David Weiser
Es ist schwer, es leicht auszudrücken. Ich habe jahrelang versucht, mich darum
Wayne Molina
Oh ja, die Mühe lohnt sich.
Sevenseacat
2

Meiner Meinung nach sind Sie direkt an der Gurkenfront. Das Schreiben all dieser Schritte ist eine Menge Mühe, und die Vorteile rechtfertigen den Schmerz nicht. Ich habe hier ausführlich über die sechs Nachteile der Verwendung von Gurken geschrieben: Warum sich mit Gurkentests abmühen?

Unit-Tests und regelmäßige Integrationstests, die entweder mit Rspec oder Test :: Unit durchgeführt werden, sind sehr sinnvoll, aber zum Glück sind diese Tests viel schneller zu schreiben als Gurkentests. Zum einen können Sie reines Ruby verwenden, anstatt gegen Gherkins wortreiche und umständliche Syntax kämpfen zu müssen.

Jack Kinsella
quelle
2
Ich kann mit Sicherheit sagen, dass ich mit jedem Ihrer Punkte zum Thema Gurkentests nicht einverstanden bin. * Gute Texteditoren werden nicht beschädigt (mein gedit hebt sie hervor und vervollständigt sie automatisch). * Sie sollten kein Test-Setup von Ihrem vorhandenen Rspec-Setup in Ihr Cucumber-Setup kopieren (die beiden Testreihen laufen auf sehr unterschiedlichen Ebenen der Granularität), * wenn Sie bei der Benennung Ihrer Seiten nicht konsequent sein können, was nicht die Schuld von Cucumber ist (Rails lässt Sie an verschiedenen Tagen keine Routen mit unterschiedlichen Dingen aufrufen, warum sollte Cucumber dann?) (Fortsetzung
folgt
1
* Sie sagen, was die Konvention über Schrittdateien ist, sagen dann aber, Sie würden nicht wissen, wo Sie suchen müssen, um der Konvention zu folgen? Warum sollte die Werbung für einen Beitrag in etwas anderem als post_steps.rb erfolgen? * Ihre Funktionen sollten kein Code sein, daher spielt die Worthaftigkeit keine Rolle. Ihre Funktionen sind eine Dokumentation zum Verhalten Ihrer App. * Und schließlich kann ich nur kritisieren, dass die Wiederverwendung von Code entmutigt wird, wenn Sie es falsch machen .
Sevenseacat
2

Was ich persönlich glaube, ist das RSpec testing is a definite must. Angenommen, Sie möchten eine neue Funktion schreiben, die auch auf eine andere Funktion verweist, und auf diese Funktion wird möglicherweise mit einem anderen Modul oder anderen Methoden verwiesen. Wie können Sie also sicherstellen, dass das, was Sie schreiben, keinen anderen Teil der Anwendung beschädigt?

Angenommen, Sie haben eine große Anwendung und haben im Vergleich zur Gesamtanwendung etwas Triviales codiert. Werden Sie die gesamte Anwendung erneut testen, indem Sie auf jeden Link in der Anwendung klicken, um sicherzustellen, dass sie bei jeder Änderung einer einzelnen Codezeile funktioniert?

Ich glaube jedoch, dass Gurkentests kein Muss sind. Ich denke, dass Integrationstests mit RSpec selbst sinnvoller sind, bis Sie Tests von Ihrem Kunden überprüfen lassen müssen. Was meiner Erfahrung nach SELTEN ist. Wenn Ihr Team ausschließlich aus Entwicklern besteht, sollten Sie die Gurkenschritte für das Testen von RSpec-Funktionen lieber ersetzen. Und ich denke, nach dem RSpec 3 DSL sind die Tests ziemlich gut lesbar.

Ex :

Gurkenschritt Definition:

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

RSpec-Funktionstest:

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

Ich denke, dass RSpec-Funktionen nicht über Gurkenfunktionen verfügen, sondern dasselbe tun, ohne dass zusätzliche Kopfschmerzen beim Schreiben weiterer Schrittdefinitionen auftreten.

Davon abgesehen ist es auch nur Ihre eigene Präferenz.

Hoffe das könnte dir helfen ein bisschen zu verstehen.

Sankalp Singha
quelle
0

Meiner Meinung nach ist das erste, was zwischen Praktiken und konkreten Rahmenbedingungen zu unterscheiden ist. Gurke ist nicht BDD, RSpec ist nicht TDD.

Wenn Sie Ihr System RSpec testen möchten, ist es ein gutes Tool. Sie können TDD oder BDD mit RSpec ausführen. Tatsächlich sind TDD und BDD dasselbe. Jemand sagt "BDD hat sein TDD richtig gemacht" und ich stimme dem vollkommen zu. Bei BDD geht es hauptsächlich darum, Funktionen / Verhaltensweisen zu testen, anstatt Methoden / Klassen zu testen. Tatsächlich beschreibt das TDD, das Kent Beck beschreibt, die Funktionen, aber das BDD hilft vielen Menschen, diesen entscheidenden Unterschied zu verstehen, und es ist ein großer Beitrag von Dan North zur Entwicklungsgemeinschaft.

Verwenden Sie Cucumber, wenn Sie der Meinung sind, dass Sie ein besseres Tool für die Kommunikation mit Geschäftsleuten benötigen, z. B. wenn Gurke zulässt, dass Ihre Geschäftsleute oder Product Owner dem Team beim Schreiben oder Überarbeiten von Szenarien helfen. Andere Leute mögen Gurke, weil diese Szenarien eine wirklich gute Live-Dokumentation eines Systems sind. Wenn Sie der Meinung sind, dass Sie diese Art von Dokumentation benötigen, versuchen Sie es mit Gurke.

In Summe:

  • Wenn Sie TDD / BDD selbst oder in Ihrem Team durchführen möchten -> versuchen Sie es mit RSpec
  • Wenn Sie mit User Histories und Szenarien besser mit dem Geschäft kommunizieren möchten, versuchen Sie es mit Gurke
  • Wenn Sie eine Live-Dokumentation Ihrer Systemfunktionen wünschen -> versuchen Sie es mit Gurke.

Natürlich sind die letzten beiden mit hohen Kosten verbunden. Sie müssen bewerten, ob Sie das wirklich brauchen und die Mühe wert sind. Dieser Off-Course hängt ganz von Ihrem Projekt und Ihrer Umgebung ab und die Entscheidung liegt bei Ihnen.

Denken Sie jedoch immer daran, dass RSpec und Cucumber nur Werkzeuge sind und Werkzeuge konkrete Probleme lösen. Welches Problem möchten Sie lösen? Stellen Sie sich diese Frage und Sie sind wahrscheinlich in einer besseren Position, um das richtige Werkzeug auszuwählen. Seien Sie ein besserer Programmierer, es geht darum, diese Entscheidungen zu treffen, nicht um X- oder Y-Framework / Tool / Bibliothek / Technologie.

AlfredoCasado
quelle