TDD ERSTE Prinzip
Ich bin nicht zu verstehen, wie die TDD ERSTE Prinzip nicht beachtet wird in dem folgenden code.
Dies sind meine Notizen über das ERSTE Prinzip:
- Schnell: laufen (einige) tests schnell (seit Sie laufen die ganze Zeit)
- Unabhängige: keine tests von anderen abhängen, so können beliebige Teilmenge in beliebiger Reihenfolge
- Wiederholbare: run N Zeiten, gleiche Ergebnis (zum isolieren von Fehlern und ermöglichen die Automatisierung)
- Selbstkontrolle: test kann automatisch erkennen, wenn bestanden (keine menschliche Kontrolle des Ausgangs)
- Rechtzeitige: geschrieben etwa zur gleichen Zeit wie code under test (mit TDD, zuerst geschrieben!)
Die quiz-Frage:
Sally will Ihre website, um ein spezielles layout auf den ersten Dienstag jeden Monats. Sie hat die folgenden controller und test-code:
# HomeController def index if Time.now.tuesday? render 'special_index' else render 'index' end end # HomeControllerSpec it "should render special template on Tuesdays" do get 'index' if Time.now.tuesday? response.should render_template('special_index') else response.should render_template('index') end end
Was den ERSTEN Grundsatz nicht befolgt wird?
- Schnell
- Unabhängige
- Wiederholbare
- Selbstkontrolle
- Rechtzeitige
Ich bin mir nicht sicher, das ERSTE Prinzip wird nicht eingehalten:
- Schnell: Der code scheint zu sein, schnell, da ist nichts Komplex über seine tests.
- Unabhängige: Der test hängt nicht von anderen Prüfungen.
- Wiederholbare: Der test das gleiche Ergebnis erhalten, jedes mal.
'special_index'
wenn es ist Dienstag und'index'
wenn es nicht Dienstag. - Selbstkontrolle: Der test kann automatisch erkennen, wenn es übergeben wird.
- Rechtzeitige: Sowohl der code und test-code sind hier auf der gleichen Zeit.
Wählte ich Rechtzeitige auf das quiz, denn der test-code vorgestellt wurde, nachdem der controller-code. Aber ich hab die Frage falsch, und im Nachhinein war dies keine gute Wahl. Ich bin mir nicht sicher, das ERSTE Prinzip wird nicht gefolgt hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht
Repeatable
wie nicht jeder Tag ist Dienstag 🙂 Wenn Sie diesen test ausführen, am Montag erhalten Sie ein Ergebnis, wenn man es am Dienstag, eine andere.Unabhängig und Wiederholbar
Nicht unabhängig von Datum und dann würde es ausführen können, wiederholen Sie aber technisch das gleiche Ergebnis erhalten, weil Sie wählen, um
Der richtige Weg, um einen test zu machen für den HomeController in Bezug auf ERSTE Konzept ist die Zeit zu ändern, bevor die Bewertungsphase
Ja, die Verwirrung ist teilweise der Grund dafür, dass die F. I. R. S. T.-Prinzip nicht vollständig oder präzise genug, was das "ich". In Kursen, die ich besuchte, das Prinzip hieß F. I. R. S. T.
Das zweite "I" steht für "Isoliert". Der test oben ist unabhängig von anderen tests, aber nicht isoliert in einer separaten Klasse oder Projekt.
[Aktualisiert]:
Isolation bedeuten kann:
Einer unit-tests Isolate Funktionalität aus einem SUT (system unter test). Sie isolieren Funktionen auch aus einer einzigen Funktion. Dies zeichnet die Linie zwischen unit-tests und deren verwandten Komponenten-tests und integration-tests, und natürlich auch auf system-Prüfungen.
"Tests isolieren Ausfälle. Ein Entwickler sollte nie müssen Sie ein reverse-Engineering-tests oder der code wird getestet, um zu wissen, was falsch gelaufen ist. Jede test-Klasse name und Prüfverfahren-Namen mit der text soll die Aussage genau angeben, was falsch ist und wo." Ref.: Geschichte der ERSTE Grundsatz
Einen unit-test isoliert werden konnte aus dem SUT, die es tests in einem anderen Entwickler Artefakt (Klasse, Paket, Entwicklung, Projekt) und/oder die Lieferung Artefakt (Dll -, Paket -, Montage).
Unit-tests, die Prüfung der gleichen SUT, vor allem Ihre mit Behauptet, sollte isoliert von einander in verschiedenen test-Funktionen, aber dies ist nur eine Empfehlung. Ideal in jeder unit-test enthält nur eine geltend machen.
Unit-tests testen der verschiedenen SUTs, sollen voneinander isoliert werden oder aus anderen Arten von tests, die natürlich weiterhin in anderen Klassen oder anderen erwähnten Artefakte.
Unabhängigkeit bedeuten kann:
Unit-tests sollten Sie sich nicht auf die jeweils anderen (expliziten Unabhängigkeit), mit Ausnahme der speziellen "setup" und "teardown" - Funktionen, aber auch das ist Thema für eine Diskussion.
Insbesondere unit-tests sein sollte, um-unabhängig (implizite Unabhängigkeit). Das Ergebnis sollte nicht davon abhängen, unit-tests ausgeführt, bevor. Das klingt zwar trivial, ist es nicht. Es gibt tests, die kann nicht vermeiden, Initialisierungen und/oder ab-Laufzeiten. Nur eine freigegebene (z.B. Klassen -) Variablen und der SUT könnte anders reagieren, wenn es gestartet wurde, vor. Stellen Sie einen externen Anruf an das Betriebssystem? Einige dll wird geladen erste mal? Sie haben bereits eine potenzielle Abhängigkeit, zumindest auf OS-Ebene - manchmal nur Kleinigkeiten, die manchmal unerlässlich, um nicht entdecken zu einem Fehler. Es kann notwendig sein, um hinzuzufügen, cleanup-code, um zu erreichen optimale Unabhängigkeit der tests.
Unit-tests sollte sein, die unabhängig sind, so viel wie möglich von der runtime-Umgebung und nicht abhängig von einer bestimmten test-Umgebung oder Umgebung. Das gehört auch zum Teil zu "Wiederholbar".
Keine Notwendigkeit, fillout zwanzig Dialoge vor. Keine Notwendigkeit, den server zu starten. Keine Notwendigkeit, die Datenbank verfügbar machen. Keine Notwendigkeit für eine andere Komponente. Keine Notwendigkeit für ein Netzwerk. Um das zu erreichen, oft test doubles verwendet werden (stubs, verspottet, Fälschungen, Attrappen, Spione, ..).
(Gerard Meszaros' klassisches Werk über: xUnit-Muster, hier prägen Sie den Namen 'test double" und der Definition der verschiedenen Arten von)
(Test Doppel-zoo schnell erklärt)
(Folgen Sie Martin Fowler 2007, darüber nachzudenken, stubs, mocks, etc. Classic)
Während ein unit test ist nie völlig unabhängig von der SUT, es sollte im Idealfall unabhängig, so viel wie möglich von der aktuellen Umsetzung und nur verlassen sich auf die öffentliche Schnittstelle der Klasse oder Funktion getestet (SUT).
Fazit: In diesen Interpretationen das Wort "isolation", betont mehr den physischen Standort, die oft impliziert logische Unabhängigkeit zu einem gewissen Grad (z.B. Klasse Niveau isolation).
Keine Vollständigkeit bezüglich potenziell mehr Akzentuierungen und Bedeutungen behauptet.
Siehe auch Kommentare hier.
Aber es gibt noch mehr Eigenschaften von (guten) unit-tests: Roy Osherove fand einige weitere Attribute in seinem Buch "The art of unit testing", die ich nicht finden, genau in die F. I. R. S. T.-Prinzip (link zu seinem Buch Website), und die zitiert werden hier mit meinen eigenen Worten (und Abkürzung):
Full Kontrolle von SUT: der unit-test sollte die volle Kontrolle über das SUT. Ich sehe das im Prinzip identisch wie die Unabhängigkeit von der test-und Laufzeit-Umgebung (z.B. mit mocks, etc.). Aber wegen der Unabhängigkeit ist so ambigous, macht es Sinn, verbringen Sie einen separaten Brief.
Eineutomated (bezogen auf wiederholbare und selbst-Kontrolle, aber nicht das gleiche)
identisch). Dies erfordert eine Prüfung (Läufer -) Infrastruktur.
Rzuständige: Der test relevant sein sollte morgen. Dies ist eines der schwierigsten Anforderungen zu acchieve, und je nach "Schule" möglicherweise gibt es eine Notwendigkeit für temporäre unit-tests bei TDD auch. Wenn ein test ist nur die Prüfung der Verträge, das ist acchieved, aber das kann nicht genug für die hohe code-Abdeckung Anforderungen.
Consistent Ergebnis: Effektiv ein Ergebnis von "genügend" Unabhängigkeit. Konsistenz ist, was einige Leute auch in "Wiederholbar". Es ist ein wesentlicher überlappung, aber Sie sind nicht identisch.
Angesichts all dieser spedific Punkte sollten es werden, mehr klar als vorher, es ist aber einfach zu schreiben (gut) unit-tests.