Bist du neu bei Rails? Neu beim Codieren? Neugierig auf RSpec und wie Sie mit dem Testen beginnen können? Wenn ja, sollte dieser Artikel ein guter Ausgangspunkt für eine testgetriebene Entwicklung sein. Es wird Ihnen das Warum und Wie erläutern und Sie erhalten ein Überlebenskit für Ihren ersten Testrausch.
Wofür ist RSpec gut? RSpec ist auf Unit-Test-Ebene sehr nützlich und testet die Details und die Geschäftslogik Ihrer App. Das bedeutet, dass Sie die Interna wie Modelle und Controller Ihrer App testen. Tests, die Ihre Ansichten abdecken, oder Funktionstests, die vollständigere Benutzerabläufe simulieren, wie z. B. der Kauf eines Artikels, stehen nicht im Fokus von RSpec. RSpec verwendet keinen Web-Treiber, wie es beispielsweise Capybara tut, der die Interaktionen eines Benutzers mit einer tatsächlichen Site oder einer Darstellung davon simuliert.
Testgetriebene Entwicklung (TDD), was ist der Sinn? Nun, das ist nicht so einfach zu beantworten, ohne einige Klischees zu füttern. Ich hoffe das klingt nicht ausweichend. Ich könnte eine schnelle Antwort geben, aber ich möchte vermeiden, Sie nach einem kleinen Imbiss hungrig nach Hause zu schicken. Das Ergebnis dieser kleinen Serie über RSpec und das Testen sollte Ihnen nicht nur alle Informationen geben, um diese Frage selbst zu beantworten, sondern auch die Mittel und das Verständnis bieten, um mit dem Testen zu beginnen, während Sie sich bereits ein wenig zuversichtlich fühlen.
Für Anfänger scheint es schwieriger zu sein, sich mit RSpec und dem TDD-Workflow zu beschäftigen, als mit Ruby oder Rails gefährlich zu werden. Warum das? Ich kann an dieser Stelle nur vermuten, aber zum einen scheint sich die Literatur hauptsächlich auf Leute zu konzentrieren, die bereits Programmierkenntnisse haben, und zum anderen ist es alles, was man braucht, um ein klares Verständnis zu haben ein bisschen entmutigend. Die Lernkurve kann ziemlich steil sein, nehme ich an. Für ein effektives Testen sind viele bewegliche Teile erforderlich. Neulinge, die gerade erst begonnen haben, ein Framework wie Rails zu verstehen, müssen viel nachfragen, um den Vorgang des Erstellens einer App aus der entgegengesetzten Perspektive zu betrachten und eine völlig neue API zum Schreiben von Code für Ihren Code zu lernen.
Ich dachte darüber nach, wie ich an dieses „Dilemma“ für die nächste Generation von Programmierern herangehen könnte, die nur einen ruhigeren Start in diese ganze Sache suchen. Das ist was ich mir ausgedacht habe. Ich werde die wichtigste Syntax für Sie aufschlüsseln, ohne viel mehr als nur Grundkenntnisse in Ruby und etwas Rails anzunehmen. Anstatt jeden möglichen Winkel abzudecken und Sie zu Tode zu verwirren, werden wir Ihr grundlegendes Survival-Kit durchgehen und versuchen, das größere Bild zu malen. Wir werden das „Wie?“ Ziemlich wortreich diskutieren, um auf dem Weg keine neuen Codierer zu verlieren. Der zweite Teil der Gleichung erklärt das "Warum".
Wenn ich Glück habe, bekommen Sie eine gute Basis für fortgeschrittenere Bücher und fühlen sich zuversichtlich, was das Ganze betrifft. Ok, lass uns gehen!
Kommen wir zum Zweck des Testens zurück. Ist das Testen nützlich, um bessere Apps zu schreiben? Nun, das kann heiß diskutiert werden, aber im Moment würde ich diese Frage mit einem Ja beantworten - ich bin im Hipster-TDD-Lager, denke ich. Lassen Sie uns sehen, warum Tests Ihren Apps einige Vorteile bieten, die schwer zu ignorieren sind:
Sie prüfen, ob Ihre Arbeit wie vorgesehen funktioniert. Die ständige Überprüfung, dass Sie Code schreiben, der funktioniert, ist für die Integrität Ihrer Anwendung und die Vernunft Ihres Teams unerlässlich.
Sie testen Dinge, die Sie nicht von Hand testen möchten, langwierige Überprüfungen, die Sie von Hand durchführen könnten - vor allem, wenn Sie dies ständig überprüfen müssen. Sie möchten so sicher wie möglich sein, dass Ihre neue Funktion oder Ihre neue Klasse oder was auch immer zu Nebenwirkungen in möglicherweise völlig unvorhergesehenen Bereichen Ihrer App führt. Die Automatisierung dieser Art rettet Sie nicht nur Tonne aber auch Testszenarien konsistent und reproduzierbar machen. Dies allein macht sie viel zuverlässiger als fehleranfällige Tests von Hand.
Wir möchten sicherstellen, dass sich die App erwartungsgemäß verhält. Tests können in einem hohen Maße sicherstellen, dass die Benutzer mit Ihrer App interagieren und Fehlszenarien vermeiden, die Sie voraussehen konnten. In Tests wird überprüft, ob Ihre Anwendung so funktioniert, wie Sie sie entworfen haben. Sie funktioniert auch, nachdem Sie Änderungen vorgenommen haben. Dies ist besonders wichtig, wenn Ihre Testsuite Sie über fehlgeschlagene Szenarien über Implementierungen Ihrer App informiert, die möglicherweise alt sind und daher nicht mehr im Hinterkopf liegen und nicht berücksichtigt werden, während Sie einige neue Funktionen eingeführt haben. Kurz gesagt, es hilft, Ihre App gesund zu halten, und vermeidet die Installation von Bugs.
Durch die Automatisierung von Tests können Sie tatsächlich häufiger testen. Stellen Sie sich vor, Sie müssen aus irgendeinem Grund zum 40. Mal etwas testen. Wenn es nur ein bisschen zeitaufwändig ist, wie leicht wird es sein, sich zu langweilen und den Prozess ganz auszulassen? Diese Art von Dingen ist der erste Schritt auf einer glatten Steigung, wo Sie einen anständigen Prozentsatz der Codeabdeckung zum Abschied küssen können.
Tests funktionieren als Dokumentation. Huh Die von Ihnen verfassten Daten geben anderen Teammitgliedern einen schnellen Einstiegspunkt, um eine neue Codebasis zu erlernen und zu verstehen, was sie tun soll. Das Schreiben Ihres Codes in RSpec ist zum Beispiel sehr ausdrucksstark und bildet gut lesbare Codeblöcke, die eine Geschichte erzählen, wenn Sie es richtig machen. Da RSpec sehr beschreibend geschrieben werden kann und gleichzeitig eine sehr prägnante domänenspezifische Sprache (Domain Specific Language, DSL) ist, trifft RSpec zwei Fliegen mit einer Klappe: Sie sind nicht in ihrer API ausführlich und bieten Ihnen alle Möglichkeiten, um sehr verständliche Testszenarien zu schreiben. Das hat mir schon immer gut gefallen und warum ich mich nie so richtig mit Cucumber angefreundet habe, das dasselbe Problem auf eine zu kundenfreundliche Art gelöst hat, denke ich.
Sie können den Code, den Sie schreiben, minimieren. Anstatt wie verrückt herumzuspielen, etwas mehr Freestyle auszuprobieren, können Sie beim Testen des Codes nur den Code schreiben, der zum Bestehen der Tests erforderlich ist. Kein übermäßiger Code. Was Sie in Ihrer zukünftigen Karriere oft hören werden, ist, dass der beste Code Code ist, den Sie nicht schreiben müssen oder so. Warum? In der Regel erfordern elegantere Lösungen weniger Code und auch Code, den Sie nicht schreiben - was möglicherweise unnötig ist - führt nicht zu zukünftigen Fehlern und muss nicht gewartet werden. Wenn Sie also zuerst die Tests schreiben, bevor Sie die Implementierung schreiben, haben Sie einen klaren Fokus darauf, welches Problem Sie als nächstes lösen müssen. Das Schreiben von nur Code, der erforderlich ist und nicht aus Versehen mehr, ist möglicherweise ein unterschätzter Nebeneffekt, den TDD Ihnen bieten kann.
Sie wirken sich positiv auf Ihr Design aus. Das Verstehen dieses Teils hat für mich eine Glühbirne eingeschaltet und ich habe die ganze Testphase wirklich schätzen gelernt. Wenn Sie Ihre Implementierungen um sehr fokussierte Testszenarien schreiben, wird sich Ihr Code höchstwahrscheinlich viel kompartimentierter und modularer entwickeln. Da wir alle Freunde von DRY sind - „Wiederholen Sie sich nicht!“ - und so wenig Kopplungen zwischen den Komponenten in Ihrer App wie möglich, ist dies eine einfache, aber effektive Disziplin, um Systeme zu erreichen, die von Grund auf gut entwickelt sind. Ich denke, dieser Aspekt ist der wichtigste Vorteil. Ja, die anderen sind auch ziemlich gut, aber wenn Tests auch zu Apps führen, deren Qualität aufgrund eines verfeinerten Designs besser ist, würde ich sagen, Jackpot!
Es geht auch ums Geld. Wenn Sie über eine stabile App verfügen, die leicht zu warten und zu ändern ist, sparen Sie auf lange Sicht eine Menge Geld. Unnötige Komplexität kann leicht zu Projekten führen und die Motivation wird nicht allzu hoch sein, wenn Ihr Team gegen den Code kämpfen muss, weil es spröde und schlecht gestaltet ist. Gutes Anwendungsdesign kann Ihre Geschäftsziele absolut unterstützen - und umgekehrt. Möchten Sie einige neue Funktionen einführen, die für Ihr Unternehmen von entscheidender Bedeutung sind, aber Sie kämpfen ständig um Ihre Architektur, weil sie auf Sand gebaut wurde? Natürlich nicht, und wir haben alle viele Beispiele von Unternehmen gesehen, die aus genau diesem Grund schnell verschwunden sind. Gute Testgewohnheiten können für solche Situationen eine effektive Verteidigungslinie sein.
Ein weiteres wichtiges Ziel ist die Qualität Ihres Codes selbst. Die Software, die Sie schreiben, sollte für andere Entwickler leicht verständlich sein, zumindest so weit wie möglich. Ihre Tests können wirklich dazu beitragen, die Funktionalität und die Absicht Ihrer Anwendung zu vermitteln - nicht nur für andere Mitglieder eines Teams, sondern auch für Ihr zukünftiges Selbst. Wenn Sie einen bestimmten Abschnitt Ihres Codes längere Zeit nicht berühren, ist es wirklich praktisch, Ihre Erinnerung darüber aufzufrischen, wie und warum Sie eine Software mit der Dokumentation geschrieben haben, die ein Tool wie RSpec bereitstellt - und RSpec das wirklich gut, ausnahmsweise eigentlich.
Da sich Ihr Code immer ändern wird, sollte und sollte ein Refactoring Ihres Codes immer Teil der Softwareentwicklung sein. Und da Änderungen in diesem Prozess so eingebettet sind, müssen Sie sicherstellen, dass diese Änderungen an überraschenden Orten keine unerwarteten Nebenwirkungen verursachen. Die Testsuite bietet Ihnen ein ziemlich engmaschiges Sicherheitsnetz, um sich komfortabler zu fühlen und sich mit Freude umgestalten zu können. Neben den Design-Vorteilen, die TDD Ihnen bieten kann, ist dieser Aspekt mein bevorzugter Vorteil, mit dem eine Testsuite Ihnen helfen kann. Das Ändern und Erweitern Ihres Codes ist ein wesentlicher Bestandteil der Erneuerung Ihres bereits veröffentlichten „Produkts“. Sie benötigen ein Werkzeug, das Ihnen bei diesem Prozess so viel Freiheit wie möglich bietet. Ich bin mir nicht sicher, ob Menschen, die kritisch sind, eine umfangreiche Testsuite zu schreiben, sehr besorgt sind.
Sie haben eine gute Chance, in späteren Stadien schneller Neues zu erstellen, da das Feedback der Testsuite Ihnen Rückmeldungen zu Fehlern, Fehlern und Einschränkungen liefert - viel schneller, als ein Mensch natürlich testen kann. Außerdem erhalten Sie die Sicherheit, mit einem Sicherheitsnetz zu arbeiten, das umso wertvoller wird, je länger Sie gehen.
Sie möchten in Ihren Apps, insbesondere wenn sie erheblich gewachsen sind, Ihrer Software vertrauen können. 100% ige Codeabdeckung klingt viel süßer, wenn Sie eine Site haben, die ein paar Jahre alt ist und von Hunderten von Entwicklern berührt wird. In der Lage zu sein, dem neuen Code, den Sie einführen, zu vertrauen und darauf aufzubauen, ist eine der Glückseligkeiten der Softwareentwicklung, die Geld später nicht kaufen kann.
Schienen neue your_app -T
-T
können Sie Test Unit, das mit Rails gelieferte Test-Framework, überspringen.
Gruppe: Entwicklung,: test do ed 'rspec-rail' ende
bündeln
Danach müssen wir einen Generator laufen lassen, der mit RSpec geliefert wird:
Schienen generieren rspec: install
create .rspec create spec create spec / spec_helper.rb erstellen spec / schienen_helper.rb
Hierdurch wird die Grundstruktur für Ihre RSpec-Tests in Rails festgelegt. Wie Sie der obigen Ausgabe entnehmen können, hat dieser Generator a initialisiert spez
Verzeichnis mit einigen Dateien, die Sie später benötigen. Das .rspec
Datei ist eine Konfigurationsdatei, die wir vorerst nicht bearbeiten müssen. Ich wollte Sie nur wissen lassen, was Sie vor sich haben. Die anderen Dateien sind selbsterklärend, aber ich wollte ihre Unterschiede erwähnen.
spec_helper.rb
ist für Spezifikationen, die nicht von Rails abhängen.schienen_helper.rb
, Auf der anderen Seite ist es für Spezifikationen, die davon abhängen.Es ist nicht offensichtlich, dass eine dieser Dateien zusätzlich zu Ihren Spezifikationsdateien (Testdateien) erforderlich ist, um Ihre Tests ausführen zu können. Lass uns einen kurzen Blick darauf werfen! Wenn Sie ein Modell generieren mit:
Schienen generieren den Modell-Dummy-Modellnamen: String
invoke active_record db / migrate / 20160521004127_create_dummy_models.rb erstellen app / models / dummy_model.rb aufrufen rspec create spec / models / dummy_model_spec.rb erstellen
Rails hat nicht nur die verknüpften erstellt _spec.rb
Dateien für Sie haben Ihre Angaben auch automatisch erfordern 'schienen_helfer'
standardmäßig über Ihren Spec-Dateien. Das bedeutet, dass Sie sofort loslegen können.
erfordern 'schienen_helfer'…
Mit diesem Setup können Sie Ihre Rails-App testen, zum Beispiel Ihre Modelle, und RSpec wird nicht mit Modellklassen in Rails verwirrt. Dies ist erforderlich, wann immer Sie etwas brauchen Aktiver Rekord
, ApplicationController
und so weiter. Dies ist also Ihr normales Szenario und sollte daher Ihre erste logische Wahl als Anfänger sein.
Anfordernd spec_helper.rb
, Auf der anderen Seite wird ein Fehler ausgegeben, wenn Sie Tests schreiben, die Geschäftslogik aus Ihrer Rails-App enthalten. In diesem Szenario weiß RSpec nicht, worüber Sie sprechen, wenn Sie beispielsweise ein Rails-Modell testen möchten.
So lange Geschichte, super kurz, spec_helper
lädt nicht Rails-das ist es! Natürlich können Sie mit Konfigurationen wild gehen, aber das ist nichts, worüber ich Ihnen Sorgen machen sollte. Konzentrieren wir uns auf die Grundlagen, wie Tests ausgeführt werden, und auf die Syntax. Das sollte für den Anfang genügen. Lass uns weitermachen!
Sie sind bereit, Ihre Tests durchzuführen. RSpec erfordert, dass Ihre Testdateien ein bestimmtes Suffix haben _spec
zu verstehen, welche Dateien ausgeführt werden sollen. Wenn Sie einen Generator verwenden, ist dies kein Problem. Wenn Sie jedoch Testdateien selbst schreiben möchten, müssen sie auf diese Weise beendet werden. Sie müssen also eine Datei wie your_first_test_spec.rb
in deiner spez
Verzeichnis.
Die Verwendung des Generators zum Erstellen eines Dummy-Modells hat uns bereits zur Verfügung gestellt spec / models / dummy_model_spec.rb
. Nicht schlecht! Eine Sache bleibt, bevor die Tests fertig sind:
rake db: migrieren rake db: test: vorbereiten
Diese Befehle führen die Migration für das Dummy-Modell aus, das wir oben erstellt haben, und richten die Testdatenbank auch mit diesem Modell ein. Jetzt führen wir den Test tatsächlich durch:
Rechen
Das Rechen
Der Befehl führt alle Ihre Tests aus, die vollständige Testsuite. Normalerweise sollten Sie diesen Befehl verwenden, wenn Sie einige Funktionen beendet haben und die gesamte Testsuite testen möchten.
* Ausstehend: (Die hier aufgeführten Fehler werden erwartet und wirken sich nicht auf den Status Ihrer Suite aus) .rb # Noch nicht implementiert # ./spec/models/dummy_model_spec.rb:4 Beendet in 0,00083 Sekunden (das Laden der Dateien dauerte 1,94 Sekunden) 1 Beispiel, 0 Fehler, 1 ausstehend
Herzliche Glückwünsche! Sie haben gerade Ihren ersten RSpec-Test durchgeführt. Nicht so schlimm, oder? Natürlich war dies ein Dummy-Test für jetzt - mit Dummy-Testcode, der von Rails generiert wurde. Bei der fokussierteren Version der Tests - Sie haben tatsächlich viel mehr Optionen als nur diese - können Sie beispielsweise eine einzelne Datei ausführen. So was:
Bündel exec rspec spec / models / dummy_model_spec.rb
Dadurch wird nur eine einzige Testdatei anstelle der gesamten Testsuite ausgeführt. Bei größeren Anwendungen, die von einer großen Anzahl von Testdateien abhängig sind, wird dies zu einer echten Zeitersparnis. Im Hinblick auf Zeitersparnis und Testspezifität ist dies jedoch nur ein Kratzen der Oberfläche, um ehrlich zu sein. Ich denke, wir werden im dritten Artikel dieser Serie mehr darüber berichten, wie man beim Testen viel Zeit sparen kann. Mal sehen, wie weit wir kommen!
Die andere Möglichkeit, die gesamte Testsuite zu trainieren, ist das einfache Ausführen rspec
-mit oder ohne Bündel exec,
abhängig von Ihrem Setup.
Bündel exec rspec
Eine weitere Sache, die ich erwähnen sollte, bevor wir fortfahren, Sie können auch nur eine bestimmte Teilmenge von Tests ausführen. Angenommen, Sie möchten nur alle Tests für Ihren Modellcode ausführen:
Bündel Exec Rspec Spezifikation / Modelle
So einfach ist das!
Ich empfehle, mit den Grundlagen zu beginnen und einige weitere Optionen zu prüfen, die RSpec in den nächsten beiden Artikeln bietet. Werfen wir einen Blick auf die grundlegende Struktur eines Tests und tauchen Sie in fortgeschrittenere Gewässer ein, wenn wir diesen nicht zur Verfügung haben.
beschreiben
Dies wird Ihr Brot und Butter sein, weil es Ihre Angaben organisiert. Sie können Strings oder Klassen selbst referenzieren:
beschreiben Benutzer beenden Ende beschreiben einige Zeichenfolgen Ende
beschreiben
Abschnitte sind die grundlegenden Bausteine, um Ihre Tests in logische, kohärente Testgruppen zu organisieren. Grundsätzlich ein Bereich für verschiedene Teile Ihrer Anwendung, die Sie testen möchten.
beschreiben Benutzer tun… Ende beschreiben Gast tun… Ende beschreiben Angreifer tun… Ende
Ein guter Tipp ist, den Umfang noch weiter zu straffen. Da einige Klassen beträchtlich wachsen werden, ist es nicht ratsam, alle Methoden zu haben, die Sie für eine Klasse in einer einzigen Klasse testen möchten beschreiben
Block. Sie können natürlich mehrere dieser Blöcke erstellen und stattdessen auf Instanz- oder Klassenmethoden fokussieren. Um Ihre Absicht klarer zu machen, müssen Sie nur den Klassennamen mit einer zusätzlichen Zeichenfolge versehen, die auf die Methode verweist, die Sie testen möchten.
Beschreibe Agent, '#favorite_gadget' do ... Ende Beschreibe Agent, '#favorite_gun' do ... Ende Beschreibe Agent, '.gambler' do ... Ende
Auf diese Weise erhalten Sie das Beste aus beiden Welten. Sie kapseln verwandte Tests in ihren repräsentativen Gruppen und behalten dabei die Fokussierung und Größe bei. Für Benutzer, die mit Ruby Land noch nicht vertraut sind, sollte ich das erwähnen #
referenziert einfach eine Instanzmethode während der Punkt .
ist für Klassenmethoden reserviert. Da sie sich in Strings befinden, haben sie hier keine technischen Implikationen, aber sie signalisieren Ihre Absicht anderen Entwicklern und Ihrem zukünftigen Ich. Vergessen Sie nicht das Komma nach dem Klassennamen - ohne es funktioniert es nicht! In einer Minute, wenn wir ankommen erwarten von
, Ich zeige Ihnen, warum dieser Ansatz sehr praktisch ist.
es
Im Rahmen von beschreiben
Gruppen verwenden wir einen anderen Bereich von es
Blöcke. Diese sind für die tatsächlichen getesteten Beispiele gemacht. Wenn Sie die Instanzmethode testen möchten #favorite_gadget
auf der Agent
Klasse, würde es so aussehen:
beschreiben Sie den Agenten, '#favorite_gadget' do it 'gibt ein Element zurück, das bevorzugte Gadget des Agenten' do… end end
Die Zeichenfolge, die Sie dem bereitstellen es
Block dient als Hauptdokumentation für Ihren Test. Darin legen Sie genau fest, welches Verhalten Sie von der fraglichen Methode erwarten oder erwarten. Meine Empfehlung ist, nicht über Bord zu gehen und zu wortreich darüber zu sein, aber gleichzeitig nicht übermäßig kryptisch zu sein und andere mit zu intelligenten Beschreibungen zu verwechseln.
Überlegen Sie, was die kleinste und einfachste Implementierung dieses Teils des Puzzles leisten kann und soll. Je besser Sie diesen Teil schreiben, desto besser wird die Gesamtdokumentation für Ihre App sein. Überstürzen Sie diesen Teil nicht, weil es nur eine Saite ist, die keinen Schaden anrichten kann - zumindest nicht an der Oberfläche.
erwarten von()
Jetzt werden wir mehr zum Kern der Dinge. Mit dieser Methode können Sie den Teil des Systems überprüfen oder verfälschen, den Sie testen möchten. Gehen wir zurück zu unserem vorherigen Beispiel und sehen es in (begrenzter) Aktion:
beschreiben Agent, '#favorite_gadget' do it 'gibt ein Element zurück, das bevorzugte Gadget des Agenten' erwartet (agent.favorite_gadget) .zur Endung 'Walther PPK'
erwarten von()
ist die "neue" Assertionssyntax von RSpec. Früher haben wir verwendet sollte
stattdessen. Eine andere Geschichte, aber ich wollte es erwähnen, falls Sie darauf stoßen. erwarten von()
erwartet, dass Sie es mit einem Objekt versehen und die zu testende Methode darauf ausüben. Zum Schluss schreiben Sie das gesicherte Ergebnis auf die rechte Seite.
Sie haben die Möglichkeit, die positive oder negative Route zu wählen .zu eq
oder .not_to eq
zum Beispiel (Gl
kurz für gleich natürlich). Sie können die Logik immer umdrehen - was immer Ihren Bedürfnissen entspricht. Lassen Sie uns diesen unsinnigen Test ausführen und uns auf die Ausgabe konzentrieren, die wir als Ergebnis unseres Testaufbaus erhalten haben:
rspec spec / models / agent_spec.rb
Fehler: 1) Agent-Nr. Favorite_gadget gibt ein Element zurück, das bevorzugte Gadget des Agenten. Failure / Error: Expect (agent.favorite_gadget) .to eq 'Walther PPK'
Liest sehr schön, oder?? ** "Agent # favorite_gadget
gibt ein Element und das Lieblings-Gadget des zurück Agent"**
sagt Ihnen alles, was Sie wissen müssen:
Wenn wir die Zeichenfolge weggelassen hätten, die die Methode in der beschreibt beschreiben
blockieren, dann wäre die Ausgabe viel weniger klar und lesbar gewesen:
beschreiben Agent do it 'gibt ein Element zurück, das bevorzugte Gadget des Agenten' erwartet (agent.favorite_gadget). zum Ende des 'Walther PPK'
Fehler: 1) Agent gibt ein Element zurück, das bevorzugte Gadget des Agenten. Fehler / Fehler: erwarten (agent.favorite_gadget) .to eq 'Walther PPK'
Sicher, es gibt andere Möglichkeiten, dies zu umgehen und diese Informationen über Ihr System weiterzugeben es
Block zum Beispiel - aber der andere Ansatz ist einfach und funktioniert. Was auch immer dein Blut zum Fließen bringt!
Best Practices beim Testen empfehlen, dass wir unsere Tests in vier verschiedenen Phasen zusammenstellen:
Diese vier Phasen dienen größtenteils der besseren Lesbarkeit und geben Ihren Tests eine herkömmliche Struktur. Es handelt sich um ein sogenanntes Testmuster, im Grunde genommen eine Praxis, die weithin vereinbart wurde, nützlich und empfohlen zu sein. Dieses ganze Musterthema ist ein tiefes Kaninchenloch, also weißt du, dass ich einen Haufen weglasse, um die Anfänger unter euch nicht zu Tode zu verwirren.
Während des Setups bereiten Sie das Szenario vor, unter dem der Test ausgeführt werden soll. In den meisten Fällen sind dies auch Daten, die für eine bestimmte Übung erforderlich sind. Kleiner Tipp: Machen Sie nicht zu komplizierte Dinge und stellen Sie nur die Mindestmenge ein, die für den Test erforderlich ist.
agent = Agent.create (Name: 'James Bond') Mission = Mission.create (Name: 'Moonraker', Status: 'Briefing')
In diesem Teil wird tatsächlich das ausgeführt, was Sie in dieser Spezifikation testen möchten. Könnte so einfach sein wie:
status = mission.agent_status
Nun überprüfen Sie, ob Ihre Aussage zum Test erfüllt wird oder nicht. Sie testen das System also gegen Ihre eigenen Erwartungen.
Expect (Status) .not_to EQ 'MIA')
Das Framework kümmert sich um Speicher- und Datenbankbereinigungsprobleme - im Grunde ein Reset. Sie müssen an dieser Stelle nichts anfangen. Das Ziel ist, einen ursprünglichen Zustand wiederzuerlangen, um neue Tests ohne Überraschungen von den gerade laufenden Tests durchzuführen. Mal sehen, was das in einem Dummy-Beispiel bedeuten würde:
Agent beschreiben, '#favorite_gadget' do it 'gibt ein Element zurück, das bevorzugte Gadget des Agenten' do # Setup agent = Agent.create (Name: 'James Bond'). q = Quartermaster.create (Name: 'Q'). q .technical_briefing (agent) # Übung favorite_gadget = agent.favorite_gadget # Verify Expect (favorite_gadget) .to eq 'Walther PPK' # Teardown wird fürs Erste hauptsächlich von RSpec selbst bearbeitet
Wie Sie sehen, haben wir in diesem Beispiel die Übung und die Überprüfungsphasen klar voneinander getrennt, in den anderen Dummy-Beispielen oben, erwarten (agent.favorite_gadget). an eq 'Walther PKK
, Wir haben beide Phasen miteinander vermischt. Beide sind gültige Szenarien und haben ihren Platz. Die neuen Linien helfen auch visuell zu unterscheiden, wie der Test aufgebaut ist.
Nun kommt der schwierige Teil, was zu testen ist und wie. Meiner Meinung nach ist dies der Testaspekt, der für Neuankömmlinge am verwirrendsten ist - und das verständlich! Sie sind neu in der Sprache und im Rahmen und wissen oft noch nicht einmal, was Sie nicht wissen. Wie schreibt man Tests dafür? Sehr gute Frage.
Ich werde sehr offen sein, Sie tun es höchstwahrscheinlich nicht, und Sie werden es eine ganze Weile nicht tun. Sich mit diesem Zeug vertraut zu machen, dauert eine Weile. Wenn Sie einen Mentor haben oder ein Boot Camp besuchen, haben Sie die Möglichkeit, direkt von erfahrenen Menschen zu lernen. In diesem Fall sind Ihre Fortschritte in dieser Abteilung natürlich anders.
Auf der anderen Seite, wenn Sie - wie so viele andere da draußen - sich das selbst beibringen, wird Geduld der Schlüssel sein. Wenn Sie alle Bücher und Artikel lesen, gelangen Sie sicherlich in die richtige Richtung. Ich denke jedoch, dass beim Testen eine Menge fortgeschrittener Puzzleteile erforderlich sind, damit Sie einen vollständigen Sinn machen und vielleicht sogar noch wichtiger sind, bevor Sie sich damit wohl fühlen.
Die "gute" Nachricht ist, dass dies nicht ungewöhnlich ist und wir alle dort waren. Ausdauer ist wichtig. Sie können dies tun, es ist keine Raketenwissenschaft, aber es wird eine Weile dauern, bis Sie eine Anwendung effektiv andersherum schreiben können - aus der Sicht von Tests, meine ich. Drücke weiter, habe Spaß, mache Fehler, schreibe Apps, kopiere Tutorials und so weiter, bis die Glühbirne erlischt.
Wenn Sie Ihre individuellen Tests schreiben, möchten Sie, dass ihre Objekte das Einfachste tun, um Ihr Ziel zu erreichen - hoch fokussierte Tests sind wirklich der Schlüssel. Sie möchten Ihre Anwendung mit sehr einfachen Schritten entwerfen und dann den Fehlern folgen, die Ihnen Ihre Testsuite bereitstellt.
Implementiere nur das, was nötig ist, um die App grün zu bekommen. Nicht mehr, nicht weniger! Das ist der „getriebene“ Teil der testgetriebenen Entwicklung. Ihre Arbeit orientiert sich an den Bedürfnissen Ihrer Tests.