Neu im Komponententest, wie man großartige Tests schreibt?
Ich bin ziemlich neu in der unit-Tests Welt, und ich habe gerade entschieden, um die Testabdeckung für meine bestehende app in dieser Woche.
Dies ist eine riesige Aufgabe, vor allem, weil die Anzahl der Klassen zu testen, sondern auch, weil das schreiben von tests ist alles neu für mich.
Habe ich bereits geschrieben-tests für eine Reihe von Klassen, aber jetzt Frage ich mich, ob ich es richtig machen.
Wenn ich das schreiben von tests für eine Methode, habe ich das Gefühl zu umschreiben, ein zweites mal, was ich schrieb schon in der Methode selbst.
Meine tests scheint einfach so fest an die Methode (alle zu testen, der Code, in der Erwartung, einige innere Methoden aufgerufen werden, eine Anzahl von Zeiten, mit bestimmten Argumenten), dass es scheint, dass, wenn ich jemals die Umgestaltung der Methode, werden die tests fehlschlagen, auch wenn die endgültige Verhalten der Methode nicht geändert.
Dies ist nur ein Gefühl, und wie vorhin schon gesagt, ich habe keine Erfahrung mit Tests. Wenn einige mehr erfahrene Tester gibt, konnte mir Tipps, wie zu schreiben, tolle tests für eine bestehende app, würde dies sehr geschätzt werden.
Edit : ich würde lieben, zu danken, Stack Overflow, hatte ich große Eingänge in weniger als 15 Minuten beantwortet mehr Stunden online lese ich gerade getan habe.
InformationsquelleAutor der Frage pixelastic | 2010-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich finde du machst es falsch.
Unit Tests sollte:
Es sollte sich nicht nur innerhalb der Methode, um zu sehen, was es tut, so dass die änderung der Einbauten sollte nicht dazu führen, die Prüfung zu Versagen. Sollten Sie nicht direkt testen, dass private Methoden aufgerufen werden. Wenn Sie daran interessiert sind, ob Ihre privaten code getestet wird dann mit einem code-coverage-tool. Aber nicht besessen von dieser: eine 100% ige Abdeckung nicht erforderlich ist.
Wenn Ihr Methode ruft öffentliche Methoden in anderen Klassen, und diese Anrufe sind garantiert durch die Schnittstelle, dann kann man testen, dass diese Anrufe werden durch die Verwendung eines mocking-Frameworks.
Sollten Sie nicht verwenden die Methode selbst (oder der interne code, der es verwendet, zu generieren, dass das erwartete Ergebnis dynamisch. Das erwartete Ergebnis sein sollte, hart-codiert in Ihre test-Fall, so dass es sich nicht ändern, wenn die Umsetzung änderungen. Hier ist ein Vereinfachtes Beispiel von dem, was ein unit-test tun sollten:
Beachten Sie, dass, wie das Ergebnis berechnet wird, wird nicht geprüft - nur, dass das Ergebnis korrekt ist. Halten Sie das hinzufügen mehr und mehr von einfachen test-Fälle wie die oben, bis Sie bedeckt haben so viele Szenarien wie möglich. Verwenden Sie Ihre code-coverage-tool, um zu sehen, wenn Sie verpasst haben, interessante Wege.
InformationsquelleAutor der Antwort Mark Byers
Für unit-Tests, fand ich beide Probe Gefahren (ersten tests, code-zweite) und die erste code -, test-zweiten um extrem nützlich zu sein.
Anstatt code zu schreiben, dann test schreiben. Code schreiben und dann schauen, was Sie DENKE, der code tun sollte. Denken Sie an all die gedacht, verwendet und dann einen test schreiben für jeden. Ich finde das schreiben von tests werden schneller, aber auch mehr beteiligt, als die Codierung selbst. Die Prüfungen sollten in der test-Absicht. Auch denken über die Absichten, die Sie wind-up finden Ecke Fälle in den test schreiben-phase. Und natürlich auch beim schreiben von tests finden Sie vielleicht eine der wenigen Anwendungen verursacht einen Fehler (etwas, was ich oft finde, und ich bin sehr froh, dass dieser bug nicht korrupte Daten und unkontrolliert).
Doch die Prüfung ist fast wie Codierung zweimal. In der Tat hatte ich Anwendungen, wo es war mehr test-code (Menge) als code für die Anwendung. Ein Beispiel war eine sehr komplexe state machine. Ich hatte, um sicherzustellen, dass nach dem hinzufügen von mehr Logik, um es, die gesamte Sache, die immer funktioniert auf allen bisherigen Anwendungsfällen. Und da diese Fälle waren sehr schwer zu Folgen, indem Sie sich den code, gewickelt ich eine so gute test-suite für diese Maschine, die ich war mir sicher, dass es nicht zu brechen, auch nachdem Sie die änderungen vorgenommen, und die tests mir den Arsch gerettet ein paar mal. Und als Benutzer oder Tester waren zu finden Fehler mit der Strömung oder an der Ecke Fälle ungeklärt, ratet mal, was Hinzugefügt tests und nie wieder passiert. Diese hat der Benutzer Vertrauen in meine Arbeit zusätzlich zu machen das ganze super stabil. Und wenn es musste neu geschrieben werden aus performance-Gründen, erraten, was, es funktioniert wie erwartet, auf alle Eingänge Dank der tests.
Alle einfache Beispiele wie
function square(number)
ist toll und alles, und sind wahrscheinlich schlechte Kandidaten verbringen viel Zeit mit dem testen. Diejenigen, die wichtig sind, die business-Logik, das ist, wo die Tests wichtig ist. Test der Anforderungen. Nicht nur testen Sie die Sanitär. Wenn sich die Anforderungen ändern, dann ratet mal, was die tests müssen auch.Tests sollten nicht wörtlich zu testen, dass die Funktion foo aufgerufen wird die Funktion bar 3 mal. Das ist falsch. Überprüfen Sie, ob die Folge-und Nebenwirkungen sind richtig, nicht die innere mechanik.
InformationsquelleAutor der Antwort Dmitriy Likhten
Es ist erwähnenswert, dass retro-fitting unit-tests in bestehende code ist weit schwieriger als treibende Kraft bei der Bildung, dass der code mit tests in den ersten Platz. Das ist eine der großen Fragen im Umgang mit legacy-Anwendungen... wie unit-Tests? Dies wurde schon oft gefragt (so Sie kann geschlossen werden, wie eine dupe-Frage), und die Menschen in der Regel bis Ende hier:
Verschieben vorhandener code, Test Driven Development
Ich zweite die akzeptierte Antwort, Buch-Empfehlung, aber darüber hinaus gibt es weitere Informationen in Links in den Antworten gibt.
InformationsquelleAutor der Antwort David
Nicht mit dem schreiben von tests zu erhalten eine volle Abdeckung des Codes. Schreiben tests, die garantieren, dass Ihre Anforderungen. Sie können entdecken, codepaths, die unnötig sind. Umgekehrt, wenn Sie notwendig sind, sind Sie dort zu erfüllen, irgendeine Art von Anforderung; finden, was es ist, und testen Sie die Anforderung (nicht den Pfad).
Halten Sie Ihre kleine tests: ein test pro Anforderung.
Später, wenn Sie eine änderung vornehmen müssen (oder neuen code schreiben), schreiben Sie ein test erste. Nur eine. Dann haben Sie den ersten Schritt in test-driven development.
InformationsquelleAutor der Antwort Jon Reid
Unit-Tests ist über die Ausgabe, die man aus einer Funktion/Methode/Anwendung.
Es spielt überhaupt keine Rolle, wie das Ergebnis erzeugt wird, ist es nur relevant, dass es korrekt ist.
Daher, Ihre Herangehensweise zu zählen, ruft innere Methoden und solche falsch ist.
Was ich eher zu tun ist, sich hinzusetzen und zu schreiben, was die Methode zurückgeben soll, bestimmte input-Werte oder eine bestimmte Umgebung, dann schreiben Sie einen test, der vergleicht den ist-Wert zurückgegeben, mit dem, was ich kam mit.
InformationsquelleAutor der Antwort fresskoma
Schreiben Sie einen Unit Test schreiben, bevor die Methode es wird zu testen.
Das wird auf jeden Fall zwingen Sie zu denken, ein wenig anders, wie die Dinge getan. Sie haben keine Ahnung, wie die Methode, die zur Arbeit gehen, genau das, was es tun soll.
Sollten Sie immer Tests werden die Ergebnisse von der Methode, nicht, wie die Methode ruft diese Ergebnisse.
InformationsquelleAutor der Antwort Justin Niessner
tests sollen zur Verbesserung der Wartbarkeit. Wenn Sie ändern eine Methode und ein test bricht, dass kann eine gute Sache sein. Auf der anderen Seite, wenn Sie sich Ihre Methode als eine black-box, als es nicht darauf ankommt, was innerhalb der Methode. Die Tatsache ist, müssen Sie zu verspotten, Dinge, die für einige tests, und in diesen Fällen kann man wirklich nicht behandeln die Methode, die wie eine black box. Die einzige Sache, die Sie tun können, ist wrte ein integration-test-Sie laden, bis eine vollständig instanziierte Instanz des service im test und haben es seine Sache, wie würde es laufen in Ihrem app. Dann können Sie behandeln Sie wie eine black box.
Dies ist, weil Sie schreiben Ihre tests durchführen, nachdem Sie schrieb Ihrem code. Wenn du es geschafft hast den anderen Weg entlang (schrieb die ersten tests) es würde auf diese Weise fühlen.
InformationsquelleAutor der Antwort hvgotcodes
Dies ist das beste Buch für unit-Tests:
http://www.manning.com/osherove/
Es erklärt alle best practices, do 's und dont' s für unit-Tests.
InformationsquelleAutor der Antwort Ervi B