Unit-Test Anti-Muster-Katalog
anti-pattern : es müssen mindestens zwei Schlüssel-Elemente, die formal zu unterscheiden ist eine eigentliche anti-pattern aus eine einfache schlechte Angewohnheit, schlechte Praxis, oder schlechte Idee:
- Einige wiederholte Muster der Aktion, Prozess oder Struktur, die zunächst vorteilhaft erscheint, aber letztlich produziert mehr negative Folgen als positive Ergebnisse, und
- Umgestalteten Lösung, das ist klar dokumentiert, bewährt in der Praxis und wiederholbar.
Stimme für die TDD anti-Muster, die Sie gesehen haben, "in der wildnis" ein mal zu viel.
Der blog-post von James Carr und Zugehörige Diskussion auf testdrivendevelopment yahoogroup
Wenn Sie gefunden haben, eine 'Unbenannte'. post 'em zu. Einen Beitrag pro anti-pattern bitteum die Stimmen zählen für etwas.
Mein persönliches Interesse ist, finden Sie die top-n-Teilmenge, so dass ich diskutieren können 'em in einer lunchbox treffen in Naher Zukunft.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bürger zweiter Klasse - test-code ist nicht so gut umgestaltet werden, da die Produktion code, die eine Menge duplizierten code, so dass es schwer zu pflegen tests.
InformationsquelleAutor der Antwort
Die Freie Fahrt /Piggyback -- James Carr, Tim Ottinger
Anstatt zu schreiben einen neuen Testfall-Methode zu testen, andere/unterschiedliche feature/Funktionalität, eine neue Behauptung (und der entsprechenden Maßnahmen Handeln, d.h. die Schritte, die von AAA) Fahrten entlang in einem bestehenden Testfall.
InformationsquelleAutor der Antwort
Glücklich Weg
Den test bleibt auf glückliche Pfade (erwartete Ergebnisse) ohne Prüfung für Grenzen und Ausnahmen.
JUnit-Antipatterns
InformationsquelleAutor der Antwort
Der Lokalmatador
Einen Testfall abhängig ist, auf etwas bestimmtes an die Entwicklungsumgebung es wurde geschrieben, um zu laufen. Das Ergebnis ist der test bestanden, auf die Entwicklung-Boxen, aber nicht, wenn jemand versucht, führen Sie es an anderer Stelle.
Die Versteckte Abhängigkeit
Eng mit den lokalen Helden, einen unit-test erfordert, dass einige der bestehenden Daten aufgefüllt wurden irgendwo, bevor der test ausgeführt wird. Wenn die Daten nicht aufgefüllt, wird der test fehlschlagen und lassen wenig Hinweis auf die Entwickler, was Sie wollte, oder warum... Sie zu zwingen, Graben Sie sich durch die Hektar-code herauszufinden, wo die Daten, die verwendet wurde wurde kommen soll.
Leider sehen dies viel zu viele Zeiten mit der alten .dlls die von nebulösen und abwechslungsreich .ini-Dateien ständig synchron auf einem bestimmten Produktionssystem, geschweige denn vorhanden auf Ihrem Computer ohne ausführliche Konsultationen mit den drei Entwicklern verantwortlich für diese dlls. Seufz.
InformationsquelleAutor der Antwort
Chain Gang
Ein paar tests ausgeführt werden müssen in einer bestimmten Reihenfolge, D. H. einen test verpasst dem globalen Zustand des Systems (Globale Variablen, Daten in der Datenbank) und der nächste test(s) abhängt.
Häufig sehen Sie dies in der Datenbank tests. Anstatt das zu tun einen rollback in
teardown()
tests commit für Ihre änderungen an der Datenbank. Eine weitere häufige Ursache ist, dass änderungen an den globalen Zustand nicht eingewickelt in ein try/finally-Blöcken, die Aufräumen sollte der test fehlschlagen.InformationsquelleAutor der Antwort
Den Spott
Manchmal spöttischen, kann gut sein, und handlich. Aber manchmal können die Entwickler verlieren sich selbst und in Ihren Bemühungen zu verspotten heraus, was nicht getestet. In diesem Fall, ein unit-test enthält so viele mocks, stubs, und/oder Fälschungen, die das system unter test gar nicht getestet, sondern Daten zurückgegeben, die von mocks ist, was getestet wird.
Quelle: James Carr ' s post.
InformationsquelleAutor der Antwort
Die Silent-Catcher -- Kelly?
Ein test, der bestanden, wenn eine Ausnahme geworfen wird.. auch wenn der Ausnahme, dass tatsächlich Eintritt, ist eine, die anders ist als die, die der Entwickler bestimmt.
Siehe Auch: Geheimnis Catcher
InformationsquelleAutor der Antwort
Der Inspektor
Ein unit-test gegen Kapselung in einer Anstrengung, um eine 100% code coverage, aber so viel weiß über das, was Los ist in das Objekt, dass jeder Versuch, umgestalten, zerstören die vorhandenen test-und erfordern keine änderung spiegelt sich in der unit-test.
'wie kann ich testen, meine member-Variablen, ohne öffentlich zu machen... nur für unit-Tests?'
InformationsquelleAutor der Antwort
Übermäßige Setup -- James Carr
Ein test, der erfordert ein riesiges setup, um selbst mit dem testen beginnen. Manchmal mehrere hundert Zeilen code verwendet werden, zum vorbereiten der Umgebung für ein test, mit dem mehrere Objekte beteiligt sind, die können machen es schwierig wirklich festzustellen, was getestet wird, aufgrund der "Lärm" von allen setup Los. (Src: James Carr ' s post)
InformationsquelleAutor der Antwort
Anal Sonde
Einem test zu verwenden, verrückt, illegal oder anderweitig ungesunde Wege, um seine Aufgabe zu erfüllen wie: Lesen von private Felder in der Java - setAccessible(true) oder erweitern einer Klasse für den Zugriff auf geschützte Felder/Methoden oder dass die Probe in einem bestimmten Paket access Paket Globale Felder/Methoden.
Wenn Sie dieses Muster sehen, die die Klassen unter test zu viel Daten versteckt.
Den Unterschied zwischen diesem und Dem Inspektor ist, dass die Klasse unter test versucht zu verbergen, auch Dinge, die Sie brauchen, um zu testen. Also Ihr Ziel ist nicht zu erreichen 100% test-Abdeckung, aber um testen zu können, überhaupt nichts. Denken Sie an eine Klasse, die nur private Felder, ein
run()
- Methode ohne Argumente und keine Getter überhaupt. Es gibt keine Möglichkeit, dies zu testen, ohne zu brechen die Regeln.Kommentar von Michael Borgwardt: Das ist nicht wirklich ein test antipattern, es ist Pragmatismus zum Umgang mit Mängeln in den code getestet. Natürlich ist es besser, zu beheben die Mängel, aber das kann nicht möglich sein, im Falle von 3rd-party-Bibliotheken.
Aaron Digulla: ich Stimme zu. Vielleicht dieser Eintrag ist wirklich besser geeignet für einen "JUnit HOWTO" wiki und nicht ein antipattern. Kommentare?
InformationsquelleAutor der Antwort
Der Test Mit No-Name -- Nick Pellow
Den test, der Hinzugefügt wird, reproduzieren die einen bestimmten bug in den bug-tracker und dessen Autor denkt nicht gewährleisten, dass Sie einen eigenen Namen. Statt der Erweiterung einer bestehenden, Mangels test, ein neuer test erstellt namens testForBUG123.
Zwei Jahre später, wenn dieser test fehlschlägt, müssen Sie möglicherweise zu ersten versuchen und zu finden, FEHLER-123 in Ihrem bug-tracker, um herauszufinden, die test ' s Absicht.
InformationsquelleAutor der Antwort
Die Slow Poke
Einen unit test, der läuft unglaublich langsam. Als Entwickler von kick it aus, Sie haben Zeit auf die Toilette zu gehen, schnappen Sie sich eine Rauchen, oder noch schlimmer, kick den test aus, bevor Sie nach Hause gehen am Ende des Tages. (Src: James Carr ' s post)
ein.k.ein. die tests, die einen nicht führen Sie so oft wie Sie sollten
InformationsquelleAutor der Antwort
Der Schmetterling
Haben Sie, etwas zu testen, die Daten enthält, ändert sich die ganze Zeit, wie eine Struktur, die enthält das aktuelle Datum, und es gibt keinen Weg, um Nagel-das Ergebnis nach unten auf einen festen Wert. Der unschöne Teil ist, dass Sie sich nicht über diesen Wert. Es macht gerade Ihre Prüfung komplizierter, ohne Wert.
Die Fledermaus Ihre Flügel kann die Ursache für einen Wirbelsturm auf der anderen Seite der Welt. -- Edward Lorenz, The Butterfly Effect
InformationsquelleAutor der Antwort
Das Flackern Test (Quelle : Romilly Cocking)
Einen test, der nur gelegentlich scheitert, nicht zu bestimmten Zeiten, und ist in der Regel aufgrund von Rasse Bedingungen innerhalb der test. In der Regel tritt auf, wenn etwas testen, ist asynchron, so wie JMS.
Eventuell ein super-set auf der " Abwarten und Sehen, 'anti-pattern und" Der Schlafwagen ' anti-pattern.
Der build fehlgeschlagen ist, naja, nur laufen die wieder aufzubauen. -- Anonyme Entwickler
InformationsquelleAutor der Antwort
Warten und Sehen,
Einen test, der läuft einige set-up-code und muss dann 'warten' eine bestimmte Menge an Zeit, bevor es "sehen" kann, wenn der getestete code funktioniert wie erwartet. Ein testMethod verwendet-Thread.sleep () - oder gleichwertig ist sicherlich ein "Abwarten und Sehen" test.
In der Regel können Sie sehen, wenn der test ist Test-code generiert ein Ereignis externen system wie ein E-Mail, http-request oder schreibt eine Datei auf die Festplatte.
Solch ein test kann auch ein Lokalmatador da wird es SCHEITERN, wenn die Ausführung auf einer langsameren Kiste oder eine überladene CI-server.
Warten und Sehen, anti-Muster ist nicht zu verwechseln mit Der Schlafwagen.
InformationsquelleAutor der Antwort
Unangemessen Shared Fixture -- Tim Ottinger
Mehrere Testfälle in der test-fixture nicht selbst verwenden oder müssen Sie den setup /teardown. Teilweise aufgrund developer Trägheit zum erstellen einer neuen Testgruppe... einfacher, fügen Sie einfach eine weitere test-Fall auf den Haufen
InformationsquelleAutor der Antwort
Der Riese
Einen unit-test, dass, obwohl es ist gültig die Prüfung der Prüflinge, umfassen kann, Tausende Zeilen und enthalten viele, viele Testfälle. Dies kann ein Indikator sein, dass das system unter tests ist ein Gott-Objekt (James Carr ' s post).
Ist das ein Sicheres Zeichen für diese ist ein test, der sich über mehr als ein paar Zeilen code. Oft, der test ist so kompliziert, dass es beginnt zu enthalten, die Fehler des eigenen oder schuppige Verhalten.
InformationsquelleAutor der Antwort
Ich werde es glauben, wenn ich sehe, einige blinken GUIs
Eine ungesunde Fixierung/obsession mit dem testen der app über Ihre GUI 'nur wie ein echter user'
"Sie müssen verstehen, dass das sehen ist glauben, aber auch wissen, ist zu sehen glauben." -- Denis Waitley
InformationsquelleAutor der Antwort
Der Schläfer aka der Vesuv -- Nick Pellow
Einen test, der ist zum SCHEITERN verurteilt, auf einige bestimmte Zeit und ein Datum in der Zukunft. Dies wird oft verursacht durch falsche bounds checking beim testen von code, der verwendet ein Date-oder Calendar-Objekt. Manchmal, wird der test möglicherweise fehl, wenn auf einer ganz bestimmten Zeit des Tages, wie Mitternacht.
'Der Schläfer' ist nicht zu verwechseln mit dem 'Abwarten Und Sehen,' anti-pattern.
Dieser code wird ersetzt wurden, die lange vor dem Jahr 2000 -- Viele Entwickler 1960
InformationsquelleAutor der Antwort
Toten Baum
Einen test, wo ein stub angelegt wurde, aber der test war nicht wirklich geschrieben.
Habe ich tatsächlich gesehen, wie dieser in unseren Produktions-code:
Ich weiß gar nicht, was ich davon halten soll.
InformationsquelleAutor der Antwort
bekam etwas von heute:
Nassen Boden:
Die test-Daten erstellt, die persistent ist irgendwo, aber der test nicht sauber, wenn Sie fertig sind. Dies bewirkt, dass die tests (die gleiche Prüfung, oder möglicherweise andere tests) Fehler bei der nachfolgenden test läuft.
In unserem Fall der test-Links eine Datei herumliegen, die "temp" - Verzeichnis mit den Berechtigungen des Benutzers ausgeführt, der den test das erste mal. Wenn ein anderer Benutzer versucht, zu testen, auf der gleichen Maschine: boom. In den Kommentaren zu James Carr ' s Website, Joakim Ohlrogge bezeichnet dies als die "Sloppy Worker", und es war ein Teil der inspiration für die "Großzügige Reste". Ich mag meinen Namen für Sie besser (weniger beleidigen, mehr vertraut).
InformationsquelleAutor der Antwort
Der Kuckuck -- Frank Carver
Ein unit-test, die sitzt in einem test mit mehreren anderen, und genießt die gleichen (möglicherweise sehr langen) setup-Prozess als die anderen tests in der test-Fall, aber dann verwirft alle oder einige der Artefakte aus der setup-und schafft sich seine eigenen.
Erweiterte Symptom : Unangemessen Shared Fixture
InformationsquelleAutor der Antwort
Das Geheimnis Catcher -- Frank Carver
Ein test, der auf den ersten Blick zu sein scheint dabei keine Tests, aufgrund der Abwesenheit von Behauptungen. Aber "Der Teufel steckt in den details".. der test ist wirklich unter Berufung auf eine Ausnahme geworfen werden und erwartet das Rahmenwerk für die Erfassung der Ausnahme-und berichten Sie es an den Benutzer als ein Fehler.
InformationsquelleAutor der Antwort
Die Umwelt Vandal
Einer "Einheit" - test, die für die verschiedenen "Anforderungen" beginnt verschütten heraus in seine Umwelt, die Nutzung und das setzen von environment-Variablen /- ports. Zwei dieser tests gleichzeitig durchgeführt werden, dazu führen, "port nicht verfügbar" Ausnahmen etc.
Diese tests werden zeitweise, und lassen Sie die Entwickler, Dinge zu sagen wie "just führen Sie es erneut'.
Einer Lösung die Ich gesehen habe ist, um nach dem Zufallsprinzip wählen Sie eine port-Nummer zu verwenden. Dies verringert die Möglichkeit, einen Konflikt, aber offensichtlich nicht das problem zu lösen. Also, wenn Sie können, immer verspotten Sie den code so, dass es nicht wirklich zuordnen unsharable Ressource.
InformationsquelleAutor der Antwort
Den Turing-Test
Einen testcase automatisch generiert, durch einige teure tool hat viele, viele behauptet, die er in der Klasse unter test mit einigen too-clever-by-half-Daten-flow-Analyse. Flauten-Entwickler in einem falschen Gefühl der zuversicht, dass Ihr code gut getestet, freizusprechen Sie von der Verantwortung der Gestaltung und Pflege von hoher Qualität-tests. Wenn die Maschine schreiben kann, der die Prüfungen für Sie, warum kann Sie nicht ziehen Sie Ihre finger heraus und schreiben die app selbst!
Hallo dumm. -- Weltweit intelligenteste computer auf neuen Lehrling (aus einem alten Amiga-comic).
InformationsquelleAutor der Antwort
Der Forty Foot Pole-Test
Angst davor, zu nah an der Klasse, die Sie versuchen zu testen, diese tests wirken auf Entfernung, getrennt durch unzählige Ebenen der Abstraktion und Tausende Zeilen code aus der Logik prüfen. Als solche sind Sie sehr spröde und anfällig für alle Arten von Nebenwirkungen, die passieren, auf die epische Reise zu und von der Klasse von Interesse.
InformationsquelleAutor der Antwort
Doppelgänger
In Ordnung, etwas zu testen, kopieren Sie Teile der getestete code in eine neue Klasse mit dem gleichen Namen und mit Paket und Sie müssen die classpath-Magie oder eine benutzerdefinierte Klassenlader, um sicherzustellen, es ist sichtbar, erste (also Ihre Kopie abgeholt wird).
Dieses Muster weist auf eine ungesunde Menge an versteckten Abhängigkeiten, die Sie nicht kontrollieren können, sind von einem test.
Ich sah in sein Gesicht ... mein Gesicht! Es war wie ein Spiegel, aber mein Blut in den Adern gefrieren.
InformationsquelleAutor der Antwort
Die Glucke -- Frank Carver
Eine gängige Einstellung, die nicht viel mehr als die eigentlichen Testfälle müssen. Zum Beispiel, um alle Arten von komplexen Datenstrukturen gefüllt mit scheinbar wichtige und einzigartige Werte, wenn die tests nur geltend machen, für die Anwesenheit oder Abwesenheit von etwas.
Erweiterte Symptom: Unangemessen Shared Fixture
Ich weiß nicht, was es tut ... ich bin das hinzufügen es sowieso, nur für den Fall. -- Anonyme Entwickler
InformationsquelleAutor der Antwort
Im Test Alle
Ich kann nicht glauben, dass dies noch nicht erwähnt worden bis jetzt, aber die tests sollten nicht brechen, die Prinzip der Einzigen Verantwortung.
Ich bin gekommen, über das so viele Male, tests, die diese Regel verletzen, werden per definition ein Alptraum zu verwalten.
InformationsquelleAutor der Antwort
Linie hitter
Auf den ersten Blick tests deckt alles und die code-coverage-tools bestätigt es zu 100%, aber in Wirklichkeit tests nur Treffer code ohne output-Analysen.
Abdeckung-vs-erreichbar-code
InformationsquelleAutor der Antwort