Tipps:
Vermeiden Sie das Schreiben von Verfahrenscode
Tests können ein Bär sein, wenn sie gegen prozeduralen Code geschrieben werden, der stark vom globalen Zustand abhängt oder tief im Körper einer hässlichen Methode liegt. Wenn Sie Code in einer OO-Sprache schreiben, verwenden Sie OO-Konstrukte effektiv, um dies zu reduzieren.
- Vermeiden Sie nach Möglichkeit den globalen Zustand.
- Vermeiden Sie statische Aufladungen, da diese dazu neigen, Ihre Codebasis zu durchdringen und schließlich dazu führen, dass Dinge statisch sind, die nicht sein sollten. Sie blähen auch Ihren Testkontext auf (siehe unten).
- Nutzen Sie den Polymorphismus effektiv, um übermäßige Wenns und Flaggen zu verhindern
Finden Sie, was sich ändert, kapseln Sie es und trennen Sie es von dem, was gleich bleibt.
Es gibt Drosselstellen im Code, die sich viel häufiger ändern als andere Teile. Wenn Sie dies in Ihrer Codebasis tun, werden Ihre Tests gesünder.
- Eine gute Einkapselung führt zu guten, lose gekoppelten Designs.
- Refactor und modularisieren.
- Halten Sie die Tests klein und konzentriert.
Je größer der Kontext eines Tests ist, desto schwieriger wird es, ihn aufrechtzuerhalten.
Tun Sie alles, um Tests und den umgebenden Kontext, in dem sie ausgeführt werden, zu verkleinern.
- Verwenden Sie das Refactoring von zusammengesetzten Methoden, um kleinere Codestücke zu testen.
- Verwenden Sie ein neueres Testframework wie TestNG oder JUnit4? Mit ihnen können Sie Doppelspurigkeiten in Tests entfernen, indem Sie feinkörnigere Haken in den Testlebenszyklus einbauen.
- Untersuchen Sie mithilfe von Test-Doubles (Mocks, Fakes, Stubs), um die Größe des Testkontexts zu verringern.
- Untersuchen Sie das Test Data Builder- Muster.
Entfernen Sie Duplikate aus Tests, stellen Sie jedoch sicher, dass sie den Fokus behalten.
Sie werden wahrscheinlich nicht in der Lage sein, alle Duplikate zu entfernen, aber dennoch versuchen, sie dort zu entfernen, wo sie Schmerzen verursachen. Stellen Sie sicher, dass Sie nicht so viele Duplikate entfernen, dass jemand nicht hereinkommen und auf einen Blick erkennen kann, was der Test bewirkt. ( Eine alternative Erklärung desselben Konzepts finden Sie in Paul Wheatons Artikel "Evil Unit Tests" .)
- Niemand wird einen Test reparieren wollen, wenn er nicht herausfinden kann, was er tut.
- Folgen Sie dem Muster Anordnen, Handeln, Bestätigen.
- Verwenden Sie nur eine Behauptung pro Test.
Testen Sie auf der richtigen Ebene, was Sie überprüfen möchten.
Denken Sie an die Komplexität eines Selenium-Tests zum Aufzeichnen und Wiedergeben und darüber, was sich unter Ihnen im Vergleich zum Testen einer einzelnen Methode ändern könnte.
- Abhängigkeiten voneinander isolieren.
- Verwenden Sie die Abhängigkeitsinjektion / Inversion der Kontrolle.
- Verwenden Sie Test-Doubles, um ein zu testendes Objekt zu initialisieren, und stellen Sie sicher, dass Sie einzelne Codeeinheiten isoliert testen.
- Stellen Sie sicher, dass Sie relevante Tests schreiben
- "Spring the Trap", indem Sie absichtlich einen Fehler einführen und sicherstellen, dass er von einem Test erfasst wird.
- Siehe auch: Integrationstests sind ein Betrug
Wissen, wann State Based vs Interaction Based Testing verwendet werden muss
Echte Unit-Tests erfordern echte Isolation. Unit-Tests treffen keine Datenbank und öffnen keine Sockets. Hören Sie auf, sich über diese Interaktionen lustig zu machen. Stellen Sie sicher, dass Sie korrekt mit Ihren Mitarbeitern sprechen und nicht, dass das richtige Ergebnis dieses Methodenaufrufs "42" war.
Demonstrieren Sie den Testfahrcode
Es steht zur Debatte, ob ein bestimmtes Team den gesamten Code testen oder "Tests zuerst" für jede Codezeile schreiben wird. Aber sollten sie zuerst mindestens einige Tests schreiben? Absolut. Es gibt Szenarien, in denen Test-First zweifellos der beste Weg ist, um ein Problem anzugehen.
Ressourcen: