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.
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.
quelle
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.
quelle
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:
RSpec-Funktionstest:
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.
quelle
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:
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.
quelle