Testen Sie Ihren Ruby-Code mit Guard, RSpec & Pry Teil 2

Willkommen zurück! Wenn Sie den ersten Teil unserer Reise bisher verpasst haben, möchten Sie vielleicht zuerst zurückkehren.

Bisher haben wir einen Test-Driven-Entwicklungsprozess für die Erstellung unserer Anwendung angewendet und das beliebte RSpec-Testframework verwendet. Von hier aus werden wir einige andere RSpec-Funktionen untersuchen sowie die Verwendung des Pry-Edelsteins untersuchen, um Sie beim Debuggen und Schreiben Ihres Codes zu unterstützen.

Andere RSpec-Funktionen

Nehmen wir uns einen Moment Zeit, um einige andere RSpec-Funktionen zu überprüfen, die wir in dieser einfachen Beispielanwendung nicht benötigt haben. Es kann jedoch hilfreich sein, an Ihrem eigenen Projekt zu arbeiten.

Ausstehende Erklärung

Stellen Sie sich vor, Sie schreiben einen Test, sind aber unterbrochen, oder Sie müssen zu einer Besprechung gehen und haben noch nicht den erforderlichen Code eingegeben, um den Test bestehen zu können.

Sie können den Test löschen und später erneut schreiben, wenn Sie sich wieder Ihrer Arbeit widmen können. Alternativ können Sie den Code einfach auskommentieren, aber das ist ziemlich hässlich und definitiv nicht gut, wenn Sie ein Versionskontrollsystem verwenden.

In dieser Situation ist es am besten, wenn Sie unseren Test als "ausstehend" definieren. Wenn also die Tests ausgeführt werden, ignoriert das Testframework den Test. Dazu müssen Sie die steht aus Stichwort:

beschreiben "einige Methode" do it "sollte etwas tun" ausstehendes Ende 

Aufstellen und Abreißen

Bei allen guten Testframeworks können Sie Code vor und nach jedem Test ausführen. RSpec ist nicht anders.

Es liefert uns Vor und nach dem Methoden, die es uns ermöglichen, einen bestimmten Status für den Test einzurichten und diesen Zustand nach dem Test zu bereinigen (dies bedeutet, dass der Status nicht ausläuft und das Ergebnis nachfolgender Tests beeinträchtigt)..

Beschreiben Sie "einige Methode", bevor Sie (: Each) # einige Setup-Codes enden, nachdem (: Each) # einige Tear-Down-Codes enden, und es sollte "etwas tun" 

Kontextblöcke

Wir haben das schon gesehen beschreiben Block; aber es gibt einen anderen Block, der funktional gleichwertig ist Kontext. Sie können es überall verwenden, wo Sie es verwenden würden beschreiben.

Der Unterschied zwischen ihnen ist subtil, aber wichtig: Kontext erlaubt uns, einen Zustand für unseren Test zu definieren. Nicht explizit (wir setzen den Zustand nicht wirklich durch die Definition von a.) Kontext block - stattdessen dient es der Lesbarkeit, so dass die Absicht des folgenden Codes klarer ist.

Hier ist ein Beispiel:

beschreiben "einige Methode" do context "-Block bereitgestellt" do it "führt zum Blockieren" doending end end context "kein Block bereitgestellt." do it "ruft eine Fallback-Methode auf" do pending end end end " 

Stubs

Wir können die verwenden Stummel Methode, um eine gefälschte Version eines vorhandenen Objekts zu erstellen und einen vorbestimmten Wert zurückgeben zu lassen.

Dies ist hilfreich, wenn Sie verhindern möchten, dass unsere Tests Live-Service-APIs berühren, und führen Sie unsere Tests durch vorhersagbare Ergebnisse aus bestimmten Aufrufen.

Stellen Sie sich vor, wir haben eine Klasse aufgerufen Person und dass diese Klasse eine sprechen Methode. Wir möchten testen, dass diese Methode so funktioniert, wie wir es erwarten. Dazu stubben wir die sprechen Methode mit folgendem Code:

beschreiben Person do it "speak ()" do bob = stub () bob.stub (: speak) .and_return ('hallo') Person.any_instance.stub (: initialize) .and_return (bob) Instanz = Person.new erwarten ( instance.speak) .to eq ('hallo') end end 

In diesem Beispiel sagen wir, dass 'jede Instanz' der Person Klasse sollte es haben initialisieren Methode stubbed, damit das Objekt zurückgegeben wird Bob.

Das wirst du merken Bob ist selbst ein Stub, der so eingerichtet ist, dass jeder Timecode versucht, das auszuführen sprechen Methode wird "Hallo" zurückkehren.

Dann erstellen wir ein neues Person Instanz und übergeben den Anruf von Instanz.Speak in RSpecs erwarten von Syntax.

Wir sagen RSpec, dass wir erwarten, dass dieser Aufruf den String "Hallo" ergibt..

Aufeinanderfolgende Rückgabewerte

In den vorherigen Beispielen haben wir die RSpec-Funktion verwendet und zurück um anzuzeigen, was unser Stub zurückgeben soll, wenn er aufgerufen wird.

Bei jedem Aufruf des Stubs können Sie einen anderen Rückgabewert angeben, indem Sie dem Argument mehrere Argumente angeben und zurück Methode:

obj = stub () obj.stub (: foo) .and_return (1, 2, 3) erwartet (obj.foo ()). zu Gleichung (1) erwartet (obj.foo ()). zu Gleichung (2) erwartet (obj.foo ()). zu eq (3) 

Mocks

Mocks ähneln Stubs darin, dass wir falsche Versionen unserer Objekte erstellen. Statt jedoch einen vordefinierten Wert zurückzugeben, werden die Routen unserer Objekte genauer spezifiziert Muss Nehmen Sie an, dass der Test gültig ist.

Dazu benutzen wir die spotten Methode:

beschreiben Obj do it "testing ()" do bob = mock () bob.should_receive (: testing) .with ('content') Obj.any_instance.stub (: initialize) .and_return (bob) Instanz = Obj.new Instanz. Ende des Tests ('irgendein Wert') 

Im obigen Beispiel erstellen wir ein neues Objekt Instanz und dann nennen Sie es testen Methode.

Hinter den Kulissen dieses Codes erwarten wir die testen Methode, die mit dem Wert aufgerufen werden soll 'Inhalt'. Wenn es nicht mit diesem Wert aufgerufen wird (was im obigen Beispiel nicht der Fall ist), wissen wir, dass ein Teil unseres Codes nicht ordnungsgemäß funktioniert hat.

Betreffsperre

Das Gegenstand Das Keyword kann auf verschiedene Arten verwendet werden. Alle sind darauf ausgelegt, die Code-Duplizierung zu reduzieren.

Sie können es implizit verwenden (beachten Sie unsere es Block referenziert nicht Gegenstand überhaupt):

beschreiben Array do beschreiben "mit 3 Elementen" do Betreff [1,2,3] it should_not be_empty end end 

Sie können es explizit verwenden (beachten Sie unsere es Block bezieht sich auf Gegenstand direkt):

beschreiben MyClass do beschreiben "Initialisierung" do Subject MyClass es "erstellt eine neue Instanz" do Instanz = subject.new Expect (Instanz) .to be_a (MyClass) end end end 

Anstatt ständig auf einen Betreff in Ihrem Code zu verweisen und verschiedene Werte für die Instantiierung anzugeben, z.

Beschreibe "Foo" do Kontext "A" do it "Bar" do baz = Baz.new ('a') erwartet (baz.type) .to eq ('a') End-End-Kontext "B" do it "Bar" do baz = Baz.new ('b') erwartet (baz.type) .zum eq ('b') Ende-Ende-Kontext "C" do it "Bar" do baz = Baz.new ('c') erwartet (baz .type) .zum eq ('c') end end end 

Sie können stattdessen verwenden Gegenstand zusammen mit Lassen um die doppelung zu reduzieren:

Beschreibe "Person" do subject Person.new (name) # Person hat einen get_name-Methodenkontext "Bob" do (: name) 'Bob' seinen (: get_name) soll == 'Bob' Endekontext "Joe" lässt (: Name) 'Joe' seinen (: get_name) sollte == 'Joe' Endekontext "Smith" soll (: Name) 'Smith' sein (: get_name) sollte == 'Smith' Ende Ende 

Es gibt viele weitere Funktionen, die für RSpec verfügbar sind, aber wir haben uns die wichtigsten angesehen, die Sie beim Schreiben von Tests mit RSpec häufig verwenden werden.

Randomisierte Tests

Sie können RSpec so konfigurieren, dass Ihre Tests in zufälliger Reihenfolge ausgeführt werden. Auf diese Weise können Sie sicherstellen, dass keiner Ihrer Tests von den anderen umliegenden Tests abhängig ist.

RSpec.config do | config | config.order = "zufälliges" Ende 

Sie können dies mit dem Befehl über den Befehl einstellen --Auftrag Flagge / Option. Zum Beispiel: rspec - Reihenfolge zufällig.

Wenn Sie das verwenden --zufällig bestellen Die Option RSpec zeigt die Zufallszahl an, mit der der Algorithmus erstellt wurde. Sie können diesen "Startwert" erneut verwenden, wenn Sie der Meinung sind, dass Sie in Ihren Tests ein Abhängigkeitsproblem festgestellt haben. Wenn Sie das Problem behoben haben, können Sie den Seed-Wert an RSpec übergeben (z. B. wenn der Seed war) 1234 dann ausführen --Auftrag zufällig: 1234) und es wird denselben randomisierten Seed verwenden, um zu sehen, ob es den ursprünglichen Abhängigkeitsfehler replizieren kann.

Globale Konfiguration

Sie haben gesehen, dass wir in unserem Projekt eine projektspezifische Gruppe von Konfigurationsobjekten hinzugefügt haben Rakefile. Sie können Konfigurationsoptionen jedoch global festlegen, indem Sie sie einem hinzufügen .rspec Datei in Ihrem Heimatverzeichnis.

Zum Beispiel innen .rspec:

--Farbformat verschachtelt 

Debuggen mit Pry

Jetzt können wir uns überlegen, wie wir unsere Anwendung und unseren Testcode mit dem Pry-Edelstein debuggen können.

Es ist wichtig zu verstehen, dass Pry zwar gut für das Debuggen von Code ist, aber eigentlich als verbessertes Ruby REPL-Tool gedacht ist (als Ersatz für irb) und nicht zu strengen Zwecken der Fehlersuche; So gibt es beispielsweise keine integrierten Funktionen wie: Steigen Sie ein, gehen Sie über oder treten Sie aus usw., die Sie normalerweise in einem für das Debugging entwickelten Werkzeug finden würden.

Aber als Debugging-Tool ist Pry sehr fokussiert und schlank.

Wir werden gleich zum Debuggen zurückkehren, aber lassen Sie uns zunächst prüfen, wie wir Pry zunächst verwenden werden.

Code-Beispiel aktualisiert

Um Pry zu demonstrieren, füge ich meiner Beispielanwendung mehr Code hinzu (dieser zusätzliche Code beeinflusst unseren Test in keiner Weise).

class RSpecGreeter attr_accessor: test @@ class_property = "Ich bin eine Klassen-Eigenschaft" def greet binding.pry @instance_property = "Ich bin eine Instanz-Eigenschaft" pubs privs "Hallo RSpec!" end def pubs test_var = "Ich bin eine Testvariable" test_var end private def privs setzt "I'm private" Ende 

Sie werden feststellen, dass wir einige zusätzliche Methoden, Instanz- und Klasseneigenschaften hinzugefügt haben. Wir rufen auch zwei der neuen Methoden an, die wir aus unserer eigenen hinzugefügt haben grüßen Methode.

Zuletzt werden Sie die Verwendung von feststellen bindung.pry.

Haltepunkte einstellen mit bindung.pry

Ein Haltepunkt ist eine Stelle in Ihrem Code, an der die Ausführung anhält.

Sie können mehrere Haltepunkte in Ihrem Code festlegen und diese mithilfe von erstellen bindung.pry.

Wenn Sie Ihren Code ausführen, werden Sie feststellen, dass das Terminal stoppt und Sie in den Code Ihrer Anwendung genau an der Stelle einfügt, an der Ihre Bindung platziert wurde.

Unten ist ein Beispiel, wie es aussehen könnte…

 8: def greet => 9: binding.pry 10: pubs 11: privs 12: "Hallo RSpec!" 13: ende 

Ab diesem Zeitpunkt hat Pry Zugriff auf den lokalen Bereich, sodass Sie Pry genauso wie Sie verwenden können irb und geben Sie beispielsweise Variablen ein, um zu sehen, welche Werte sie enthalten.

Sie können das ausführen Ausfahrt Befehl zum Beenden von Pry und zur weiteren Ausführung des Codes.

Wo Sie sich befinden: wo bin ich

Bei Verwendung vieler bindung.pry Haltepunkte Es kann schwierig sein zu verstehen, wo Sie sich in der Anwendung befinden.

Um einen besseren Überblick darüber zu erhalten, wo Sie sich gerade befinden, können Sie die wo bin ich Befehl.

Wenn Sie es alleine ausführen, sehen Sie etwas Ähnliches, als Sie es verwendet haben bindung.pry (Sie sehen die Linie, auf die der Haltepunkt gesetzt wurde, und ein paar Zeilen darüber und darunter). Der Unterschied ist, wenn Sie ein zusätzliches numerisches Argument wie übergeben wo 5 Sie sehen fünf zusätzliche Zeilen darüber, wo die bindung.pry wurde platziert. Sie können beispielsweise anfordern, 100 Zeilen um den aktuellen Haltepunkt zu sehen.

Mit diesem Befehl können Sie sich in der aktuellen Datei orientieren.

Stapelverfolgung: wtf

Das wtf Der Befehl steht für "What the F ***" und bietet eine vollständige Stack-Ablaufverfolgung für die letzte Ausnahme, die ausgelöst wurde. Es kann Ihnen helfen, die Schritte zu verstehen, die zu dem aufgetretenen Fehler führen.

Inspektion: ls

Das ls Der Befehl zeigt an, welche Methoden und Eigenschaften für Pry verfügbar sind.

Wenn es läuft, zeigt es Ihnen etwas wie…

RSpecGreeter # -Methoden: Begrüßungspubs test test = Klassenvariablen: @@ class_property-Locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ 

Im obigen Beispiel sehen wir, dass es vier öffentliche Methoden gibt (denken Sie daran, dass wir unseren Code aktualisiert haben, um einige zusätzliche Methoden aufzunehmen und dann Prüfung und test = wurden bei der Verwendung von Ruby erstellt attr_accessor kurze Hand).

Es zeigt auch andere Klassen- und lokale Variablen an, auf die Pry zugreifen kann.

Eine weitere nützliche Sache ist, die Ergebnisse nur für das zu durchsuchen, was Sie interessiert. Sie müssen sich mit regulären Ausdrücken auskennen, aber es kann eine praktische Technik sein. Hier ist ein Beispiel…

ls -p -G ^ p => RSpecGreeter # -Methoden: Privs 

Im obigen Beispiel verwenden wir die -p und -G Optionen / Flags, die Pry mitteilen, dass wir nur öffentliche und private Methoden sehen möchten, und verwenden den Regex ^ p (was bedeutet, dass alles passt, das mit ... p) als unser Suchmuster, um die Ergebnisse zu filtern.

Laufen ls - hilfe zeigt Ihnen auch alle verfügbaren Optionen.

Bereich ändern: CD

Sie können den aktuellen Bereich mit der Taste ändern CD Befehl.

In unserem Beispiel, wenn wir laufen CD / Pubs Das bringt uns zum Ergebnis dieses Methodenaufrufs.

Wenn wir jetzt rennen wo bin ich Sie werden sehen, dass es angezeigt wird Innerhalb "Ich bin eine Testvariable".

Wenn wir rennen selbst dann wirst du sehen, dass wir bekommen "Ich bin eine Testvariable" ist zurückgekommen.

Wenn wir rennen Selbstklasse wir werden sehen String ist zurückgekommen.

Sie können die Scope-Kette mit nach oben verschieben CD… oder Sie können mit zur obersten Ebene des Bereichs zurückkehren cd /.

Hinweis: Wir könnten noch einen hinzufügen bindung.pry in der Pubs Methode und dann wäre unser Geltungsbereich innerhalb dieser Methode und nicht das Ergebnis der Methode.

Sehen, wie tief Sie sind: Verschachtelung

Betrachten Sie das vorige Beispiel der Ausführung CD-Pubs. Wenn wir das laufen lassen Verschachtelung Mit dem Befehl erhalten Sie einen Überblick über die Anzahl der Kontexte / Ebenen, die Pry derzeit hat:

Verschachtelungsstatus: - 0. # (oberste Ebene von Pry) 1. "Ich bin eine Testvariable" 

Von dort können wir rennen Ausfahrt um zum vorherigen Kontext zurückzukehren (z. B. im grüßen Methode)

Laufen Ausfahrt wieder bedeutet dies, dass wir den letzten Kontext schließen, den Pry hat, und so endet Pry und unser Code läuft weiter.

Finde jede Methode: find-Methode

Wenn Sie nicht sicher sind, wo Sie eine bestimmte Methode finden, können Sie die find-Methode Befehl, um alle Dateien in Ihrer Codebasis anzuzeigen, die über eine Methode verfügen, die Ihrer Suche entspricht:

find-method priv => Kernel Kernel # private_methods Modul Modul # private_instance_methods Modul # private_constant Modul # private_method_defined? Modul # private_class_method Modul # private RSpecGreeter RSpecGreeter # privs 

Sie können auch die -c Option / Flag, um stattdessen den Inhalt von Dateien zu durchsuchen:

find-method -c greet => RSpecGreeter RSpecGreeter: def greet RSpecGreeter # privs: greet 

Klassisches Debugging: Nächster, Schritt, fortsetzen

Obwohl die oben genannten Techniken nützlich sind, wird das Debugging nicht in dem Sinne durchgeführt, wie Sie es wahrscheinlich gewohnt sind.

Für die meisten Entwickler stellt der Editor oder Browser ihnen ein integriertes Debugging-Tool zur Verfügung, mit dem sie ihren Code tatsächlich Zeile für Zeile durchgehen und der Route folgen können, die der Code bis zum Abschluss durchläuft.

Da Pry entwickelt wurde, um als REPL verwendet zu werden, heißt das nicht, dass es nicht für das Debugging nützlich ist.

Eine naive Lösung wäre, mehrere zu setzen bindung.pry Anweisungen durch eine Methode und Verwendung ctrl-d durch jeden Haltepunktsatz gehen. Das ist aber immer noch nicht gut genug.

Für ein schrittweises Debugging können Sie das gem-pry-nav laden…

source "https://rubygems.org" gem 'rspec'-Gruppe: Entwicklung do gem' guard 'gem' guard-rspec 'gem' pry '# Fügt dem Pry Debugging-Schritte hinzu # weiter, Schritt, nächster Edelstein' pry-remote ' edelstein 'pry-nav' ende 

Dieser Edelstein erweitert Pry, sodass die folgenden Befehle verstanden werden:

  • Nächster (weiter zur nächsten Zeile)
  • Schritt (Gehen Sie zur nächsten Zeile und wenn es eine Methode ist, dann gehen Sie zu dieser Methode über.)
  • Fortsetzen (Ignorieren Sie weitere Haltepunkte in dieser Datei.)

Kontinuierliche Integration mit Travis-CI

Als zusätzlichen Bonus integrieren wir unsere Tests mit dem Online-CI-Service (Continuous Integration) Travis-CI.

Das Prinzip von CI besteht darin, frühzeitig ein Commit / Push durchzuführen und häufig Konflikte zwischen Ihrem Code und dem Master-Zweig zu vermeiden. Wenn Sie dies tun (in diesem Fall verpflichten wir uns bei GitHub), sollte auf Ihrem CI-Server ein Build erstellt werden, auf dem die relevanten Tests ausgeführt werden, um sicherzustellen, dass alles so funktioniert, wie es sein sollte.

Mit TDD als primärer Entwicklungsmethode treten Sie bei jedem Push wahrscheinlich weniger Fehler auf, da Ihre Tests ein wesentlicher Bestandteil Ihres Entwicklungsworkflows sind. Bevor Sie also einen Push durchführen, werden Sie bereits über Fehler oder Regressionen informiert. Dies schützt Sie jedoch nicht unbedingt vor Fehlern, die bei Integrationstests auftreten (bei dem der gesamte Code über mehrere Systeme hinweg ausgeführt wird, um sicherzustellen, dass das System als Ganzes ordnungsgemäß funktioniert.).

Unabhängig davon sollte Code niemals auf irgendeine Weise direkt an Ihren Live-Produktionsserver übertragen werden. Es sollte immer zuerst an einen CI-Server weitergeleitet werden, um mögliche Fehler zu ermitteln, die sich aus den Unterschieden zwischen Ihrer Entwicklungsumgebung und der Produktionsumgebung ergeben.

In vielen Unternehmen gibt es noch mehr Umgebungen, in denen der Code passieren kann, bevor er den Live-Produktionsserver erreicht.

Bei BBC News haben wir zum Beispiel:

  • CI
  • Prüfung
  • Bühne
  • Leben

Obwohl jede Umgebung im Aufbau identisch sein sollte, besteht das Ziel darin, verschiedene Testtypen zu implementieren, um sicherzustellen, dass viele Fehler abgefangen und behoben werden, bevor der Code "live" wird..

Travis-CI

Travis CI ist ein gehosteter fortlaufender Integrationsservice für die Open Source-Community. Es ist in GitHub integriert und bietet erstklassigen Support für mehrere Sprachen

Dies bedeutet, dass Travis-CI kostenlose CI-Services für Open Source-Projekte anbietet und außerdem ein kostenpflichtiges Modell für Unternehmen und Organisationen bietet, die ihre CI-Integration privat halten möchten.

Wir werden das kostenlose Open-Source-Modell in unserem Beispiel-GitHub-Repository verwenden.

Der Prozess ist folgender:

  • Registrieren Sie ein Konto bei GitHub
  • Melden Sie sich mit Ihrem GitHub-Konto bei Travis-CI an
  • Gehen Sie zu Ihrer "Konten" -Seite
  • Aktivieren Sie alle Repositorys, auf denen Sie CI ausführen möchten
  • Ein ... kreieren .travis.yml Datei im Stammverzeichnis Ihres Projekts und übergeben Sie es an Ihr GitHub-Repository

Der letzte Schritt ist der wichtigste (Erstellen eines .travis.yml Datei), da dies die Konfigurationseinstellungen für Travis-CI bestimmt, so dass es weiß, wie die Tests für Ihr Projekt ausgeführt werden.

Werfen wir einen Blick auf die .travis.yml Datei, die wir für unser Beispiel-GitHub-Repository verwenden:

sprache: ruby ​​cache: bundler rvm: - 2.0.0 - 1.9.3 script: 'bundle exec rake spec' bundler_args: --ohne Entwicklungszweige: nur: - Masterbenachrichtigungen: E-Mail: - [email protected] 

Brechen wir das Stück für Stück ab ...

Zuerst legen wir fest, welche Sprache wir in unserem Projekt verwenden. In diesem Fall verwenden wir Ruby: Sprache: Rubin.

Da das Ausführen von Bundler etwas langsam sein kann und wir wissen, dass sich unsere Abhängigkeiten nicht ändern werden, können wir die Abhängigkeiten oft zwischenspeichern, so dass wir dies festlegen Cache: Bundler.

Travis-CI verwendet RVM (Ruby Version Manager) zur Installation von Rubies auf ihren Servern. Wir müssen also angeben, mit welchen Ruby-Versionen unsere Tests ausgeführt werden sollen. In diesem Fall haben wir gewählt 2,0 und 1.9.3 Dies sind zwei beliebte Ruby-Versionen (technisch verwendet unsere Anwendung Ruby 2, aber es ist gut zu wissen, dass unsere Code-Pässe auch in anderen Ruby-Versionen vorhanden sind):

rvm: 2,0,0 - 1,9,3 

Um unsere Tests durchzuführen, wissen wir, dass wir den Befehl verwenden können Rechen oder Rechenspek. Travis-CI führt standardmäßig den Befehl aus Rechen Aufgrund der Installation von Gems auf Travis-CI mit Bundler müssen wir jedoch den Standardbefehl ändern: Skript: 'Bündel Exec Rake Spec'. Wenn wir das nicht tun würden, hätte Travis-CI ein Problem bei der Suche nach dem rspec / core / rake_task Datei, die in unserem angegeben wird Rakefile.

Hinweis: Wenn Sie Probleme mit Travis-CI haben, können Sie dem IRC-Freenode-Kanal #travis beitreten, um Hilfe bei der Beantwortung eventueller Fragen zu erhalten. Dort habe ich die Lösung für mein Problem gefunden, da Travis-CI nicht in der Lage ist, meine Tests mit seiner Standardeinstellung auszuführen Rechen Befehl und den Vorschlag, die Standardeinstellung mit zu überschreiben Bündel Exec Rake dieses Problem gelöst.

Da wir nur an unseren Tests interessiert sind, können wir Travis-CI mit zusätzlichen Argumenten versehen, um Edelsteine ​​zu filtern, die nicht installiert werden sollen. Für uns möchten wir also die Installation der als Entwicklung gruppierten Edelsteine ​​ausschließen: bundler_args: --ohne Entwicklung (Dies bedeutet, dass wir Edelsteine ​​ausschließen, die nur für die Entwicklung und das Debugging verwendet werden, z. B. Pry und Guard.).

Es ist wichtig anzumerken, dass ich ursprünglich Pry in unseren geladen habe spec_helper.rb Datei. Dies führte zu einem Problem, wenn der Code unter Travis-CI ausgeführt wurde, da ich jetzt 'Entwicklungs-Edelsteine' ausschließe. Also musste ich den Code so anpassen:

'pry' benötigen, wenn ENV ['APP_ENV'] == 'debug' 

Sie können sehen, dass das Pry-Juwel jetzt nur noch ist benötigen'ed, wenn eine Umgebungsvariable von APP_ENV ist auf debuggen eingestellt. Auf diese Weise können wir verhindern, dass Travis-CI Fehler ausgibt. Dies bedeutet, dass Sie beim lokalen Ausführen des Codes die Umgebungsvariable festlegen müssen, wenn Sie den Code mit Pry debuggen möchten. Das Folgende zeigt, wie dies in einer Zeile geschehen kann:

APP_ENV = debug & & ruby ​​lib / example.rb

Es gab zwei weitere Änderungen, die ich vorgenommen habe Gemfile. Eine sollte klarer machen, welche Edelsteine ​​zum Testen benötigt wurden und welche für die Entwicklung erforderlich waren, und die andere wurde ausdrücklich von Travis-CI verlangt:

Quelle "https://rubygems.org" Gruppe: test do ed 'rake' gem 'rspec' Endgruppe: Entwicklung do gem 'guard' gem 'guard-rspec' gem 'pry' # fügt dem Pry Debugging-Schritte hinzu # continue, Schritt, nächster Edelstein "Pry-Remote" Edelstein "Pry-Nav" Ende 

Schauen Sie sich das oben an Gemfile Wir können sehen, dass wir den RSpec-Edelstein in einen neuen verschoben haben Prüfung Gruppe, also sollte jetzt klarer sein, welchen Zweck jeder Edelstein hat. Wir haben auch ein neues hinzugefügt Juwel "Rechen". Die Travis-CI-Dokumentation besagt, dass dies explizit angegeben werden muss.

Der nächste Abschnitt ist optional und ermöglicht es Ihnen, bestimmte Zweige in Ihrem Repository in die Whitelist (oder Black List) aufzunehmen. Travis-CI führt also standardmäßig Tests für alle Ihre Niederlassungen durch, sofern Sie nichts anderes sagen. In diesem Beispiel sagen wir, wir wollen nur, dass es gegen unsere läuft Meister Ast:

Äste: nur: - Master 

Wir könnten sagen, dass jeder Zweig 'außer' einen bestimmten Zweig ausführen soll, wie folgt:

Äste: außer: - some_branch_I_dont_want_run 

Der letzte Abschnitt teilt Travis-CI mit, wohin Benachrichtigungen gesendet werden sollen, wenn ein Build fehlschlägt oder erfolgreich ist:

Benachrichtigungen: E-Mail: - [email protected] 

Sie können mehrere E-Mail-Adressen angeben, wenn Sie möchten:

Benachrichtigungen: E-Mail: - [email protected] - [email protected] - [email protected] 

Sie können präziser sein und angeben, was bei einem Misserfolg oder Erfolg passieren soll (z. B. interessieren sich mehr Leute nur für den Fall, dass die Tests fehlschlagen, anstatt jedes Mal eine E-Mail zu erhalten):

Benachrichtigungen: E-Mail: Empfänger: - [email protected] on_failure: change on_success: never 

Das obige Beispiel zeigt, dass der Empfänger niemals eine E-Mail erhält, wenn die Tests bestanden werden. Er wird jedoch benachrichtigt, wenn sich der Fehlerstatus ändert (der Standardwert für beide ist) immer was bedeutet, dass Sie immer benachrichtigt werden, unabhängig vom Status des Status).

Hinweis: Wenn Sie explizit eine on_failure oder on_success Sie müssen die E-Mail-Adresse (n) innerhalb von verschieben Empfänger Schlüssel.

Fazit

Dies ist das Ende unseres zweiteiligen Einblicks in RSpec, TDD und Pry.

In Teil 1 haben wir es geschafft, unsere Anwendung mithilfe des TDD-Prozesses und des RSpec-Testframeworks zu schreiben. In dieser zweiten Hälfte haben wir auch Pry verwendet, um zu zeigen, wie wir eine laufende Ruby-Anwendung einfacher debuggen können. Schließlich konnten wir unsere Tests als Teil eines kontinuierlichen Integrationsservers unter Verwendung des beliebten Travis-CI-Dienstes einrichten.

Hoffentlich hat Ihnen dies genug Geschmack gegeben, so dass Sie jede dieser Techniken näher untersuchen möchten.