2010-06-25 16 views
6

Ich fange an BDD kaufen. Grundsätzlich, so wie ich es verstehe, schreiben Sie ein Szenario, das gute Akzeptanzkriterien für eine bestimmte Geschichte beschreibt. Sie beginnen mit einfachen Tests, von außen nach innen, mit Mocks anstelle von Klassen, die Sie noch nicht implementiert haben. Während Sie Fortschritte machen, sollten Sie Mocks durch echte Klassen ersetzen. Von Introduction to BDD:BDD und Funktionstests

Zunächst sind die Fragmente mit Mocks implementiert ein Konto eingerichtet werden soll in Kredit oder eine Karte zu gültig sein. Diese bilden die anfänglichen Punkte für das Implementierungsverhalten. Als Sie die Anwendung implementieren, werden die Givens und Ergebnisse geändert die tatsächlichen Klassen verwenden Sie implementiert haben, so dass durch die Zeit, die Szenario abgeschlossen ist, haben sie richtigen End-to-End-Funktions Tests werden.

Meine Frage ist: Wenn Sie mit der Implementierung eines Szenarios fertig sind, sollten alle Klassen, die Sie verwenden, real sein, wie bei Integrationstests? Wenn Sie zum Beispiel DB verwenden, sollte Ihr Code in eine echte (aber leichtgewichtige, speicherinterne) DB schreiben? Sollten Sie am Ende irgendwelche Mocks in Ihren End-to-End-Tests haben?

Antwort

3

Nun, es kommt darauf an :-) Wie ich verstehe, sind die Tests, die von BDD produziert werden, noch Komponententests, also sollten Sie Mocks verwenden, um die Abhängigkeit von externen Faktoren wie DB zu beseitigen.

Bei vollwertigen Integrations-/Funktionstests sollten Sie jedoch offensichtlich ohne Mocks gegen das gesamte Produktionssystem testen.

2

Integrationstests können Stubs/Mocks enthalten, um den Code/die Komponenten außerhalb der Module, die Sie integrieren, zu fälschen.

Allerdings sollte IMHO der End-to-End-Test keine Stubs/Mocks auf dem Weg, sondern nur Produktionscode bedeuten. Oder mit anderen Worten - wenn Mocks vorhanden sind - ist es nicht wirklich ein End-to-End-Test.

0

Ich stimme mit Peter und Ratkok. Ich denke du behälst die Mocks für immer, also hast du immer Unit Tests.

Separat ist es angebracht, zusätzlich Integrationstests zu haben (keine Mocks, DB verwenden, etc. etc.).

Vielleicht finden Sie sogar Zwischendurch manchmal hilfreich (spotten Sie ein Stück von abgehängtem Code (DOC), aber kein anderes).

0

Ich habe erst vor kurzem in BDD und insbesondere jBehave gesucht. Ich arbeite in ziemlich großen Unternehmen mit vielen wasserfall- und zeremonienorientierten Menschen. Ich betrachte BDD als eine Möglichkeit, die Anwendungsfälle von Unternehmen zu nehmen und dann direkt in Tests zu wechseln, die der Entwickler dann entweder in Komponententests oder Integrationstests umwandeln kann.

BDD scheint mir nicht nur ein Weg, um die Entwickler zu verstehen, was das Unternehmen will, sondern auch eine Möglichkeit, so viel wie möglich zu gewährleisten, dass diese Anforderungen genau dargestellt werden.

Meine Ansicht, dass, wenn Sie mit Mocks zu tun haben, Sie Unit-Tests machen. Sie benötigen sowohl Komponententests, um die Details einer Klassenoperation zu testen, als auch Integrationen, um zu testen, ob die Klasse mit anderen gut funktioniert. Ich finde Entwickler oft zwischen den beiden, aber es ist am besten, so klar wie möglich zu sein und getrennt voneinander zu bleiben.

2

Ja, wenn ein Szenario läuft, werden idealerweise alle Ihre Klassen real sein. Ein Szenario übt das Verhalten aus der Sicht eines Benutzers aus, also sollte das System so sein, wie es ein Benutzer sehen würde.

In den frühen Tagen von BDD begannen wir mit Mocks in den Szenarien. Ich kümmere mich nicht mehr darum, weil es eine Menge Arbeit ist, sich weiter lustig zu machen, wenn man die Level hinuntergeht. Stattdessen werde ich manchmal Dinge wie Hard-Code-Daten oder Verhaltensweisen tun, wenn ich dadurch schneller Feedback von den Stakeholdern bekomme.

Wir behalten immer noch Mocks in den Unit-Tests.

Für Dinge wie Datenbanken, sicher, können Sie eine In-Memory-DB oder was auch immer Sie Feedback schneller erhalten. Irgendwann sollten Sie Ihre Szenarien wahrscheinlich auf einem System ausführen, das so nah wie möglich an der Produktion ist. Wenn dies zu langsam ist, können Sie es über Nacht statt als Teil Ihres normalen Build-Zyklus tun.

Was Sie tun sollten, ist das Schreiben des richtigen Codes viel komplizierter, als den Code richtig zu schreiben. Ich mache mir Sorgen darüber, meine Szenarien zu verwenden, um Feedback von den Stakeholdern und Benutzern zu erhalten, bevor ich mir Sorgen mache, wie nahe meine Umgebung an einer Produktionsumgebung ist. Wenn Sie alle paar Wochen an den Punkt kommen, an dem Änderungen alle bereitgestellt werden, dann möchten Sie wahrscheinlich mehr Gewissheit haben, dass Sie keine Fehler einführen.

Viel Glück!