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.
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.
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
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"
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 "
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..
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 ä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.
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.
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.
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
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.
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
.
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 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.
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.
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.
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.
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.
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
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.)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:
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 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:
.travis.yml
Datei im Stammverzeichnis Ihres Projekts und übergeben Sie es an Ihr GitHub-RepositoryDer 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.
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.