Auf jeden Fall eine gute Liste. Hier ein paar Gedanken dazu:
Schreiben Sie zuerst den Test und dann den Code.
Ich stimme auf hohem Niveau zu. Aber ich würde genauer sagen: "Schreiben Sie zuerst einen Test, dann schreiben Sie gerade genug Code, um den Test zu bestehen, und wiederholen Sie den Vorgang." Andernfalls hätte ich Angst, dass meine Komponententests eher wie Integrations- oder Abnahmetests aussehen würden.
Entwurfsklassen mit Abhängigkeitsinjektion.
Einverstanden. Wenn ein Objekt seine eigenen Abhängigkeiten erstellt, haben Sie keine Kontrolle über diese. Durch Inversion der Steuerung / Abhängigkeitsinjektion erhalten Sie diese Steuerung, sodass Sie das zu testende Objekt mit Mocks / Stubs / etc. Isolieren können. So testen Sie Objekte isoliert.
Trennen Sie den UI-Code mithilfe von Model-View-Controller oder Model-View-Presenter von seinem Verhalten.
Einverstanden. Beachten Sie, dass sogar der Präsentator / Controller mit DI / IoC getestet werden kann, indem Sie ihm eine stubbierte / verspottete Ansicht und ein Modell geben. Weitere Informationen hierzu finden Sie in Presenter First TDD.
Schreiben Sie keine statischen Methoden oder Klassen.
Ich bin mir nicht sicher, ob ich damit einverstanden bin. Es ist möglich, eine statische Methode / Klasse ohne Verwendung von Mocks zu testen. Vielleicht ist dies eine der Rhino Mock-spezifischen Regeln, die Sie erwähnt haben.
Programmieren Sie Schnittstellen, keine Klassen.
Ich stimme zu, aber aus einem etwas anderen Grund. Schnittstellen bieten dem Softwareentwickler ein hohes Maß an Flexibilität - über die reine Unterstützung verschiedener Mock-Object-Frameworks hinaus. Beispielsweise ist es ohne Schnittstellen nicht möglich, DI ordnungsgemäß zu unterstützen.
Isolieren Sie externe Abhängigkeiten.
Einverstanden. Verstecken Sie externe Abhängigkeiten hinter Ihrer eigenen Fassade oder Ihrem Adapter (je nach Bedarf) mit einer Schnittstelle. Auf diese Weise können Sie Ihre Software von der externen Abhängigkeit isolieren, sei es ein Webdienst, eine Warteschlange, eine Datenbank oder etwas anderes. Dies ist besonders wichtig, wenn Ihr Team die Abhängigkeit nicht kontrolliert (auch bekannt als extern).
Markieren Sie die Methoden, die Sie verspotten möchten, als virtuell.
Das ist eine Einschränkung von Rhino Mocks. In einer Umgebung, in der handcodierte Stubs einem Scheinobjekt-Framework vorgezogen werden, wäre dies nicht erforderlich.
Und ein paar neue Punkte zu beachten:
Verwenden Sie kreative Designmuster. Dies hilft bei DI, ermöglicht es Ihnen jedoch auch, diesen Code zu isolieren und unabhängig von anderer Logik zu testen.
Schreiben Sie Tests mit der Arrange / Act / Assert-Technik von Bill Wake . Diese Technik macht sehr deutlich, welche Konfiguration erforderlich ist, was tatsächlich getestet wird und was erwartet wird.
Haben Sie keine Angst, Ihre eigenen Mocks / Stubs zu rollen. Oft werden Sie feststellen, dass die Verwendung von Scheinobjekt-Frameworks Ihre Tests unglaublich schwer lesbar macht. Wenn Sie Ihre eigenen rollen, haben Sie die vollständige Kontrolle über Ihre Mocks / Stubs und können Ihre Tests lesbar halten. (Siehe vorherigen Punkt.)
Vermeiden Sie die Versuchung, die Duplizierung Ihrer Komponententests in abstrakte Basisklassen oder Setup- / Teardown-Methoden umzugestalten. Dadurch wird der Konfigurations- / Bereinigungscode vor dem Entwickler ausgeblendet, der versucht, den Komponententest durchzuführen. In diesem Fall ist die Klarheit jedes einzelnen Tests wichtiger als das Umgestalten von Duplikaten.
Kontinuierliche Integration implementieren. Checken Sie Ihren Code an jedem "grünen Balken" ein. Erstellen Sie Ihre Software und führen Sie bei jedem Check-in Ihre gesamte Suite von Unit-Tests durch. (Sicher, dies ist per se keine Codierungspraxis; aber es ist ein unglaubliches Werkzeug, um Ihre Software sauber und vollständig integriert zu halten.)