Testen Sie Ihren Code wie jemanden, der ihn nach dem Lesen der Dokumentation verwenden würde. Testen Sie nichts basierend auf Ihrem Wissen, da Sie den Code geschrieben oder gelesen haben. Sie möchten sicherstellen, dass sich Ihr Code wie erwartet verhält .
Im besten Fall sollten Sie Ihre Tests als Beispiele verwenden können. Doctests in Python sind hierfür ein gutes Beispiel.
Wenn Sie diese Richtlinien befolgen, sollte das Ändern der Implementierung kein Problem sein.
Auch nach meiner Erfahrung ist es empfehlenswert, jede "Schicht" Ihrer Anwendung zu testen. Sie haben atomare Einheiten, die an sich keine Abhängigkeiten haben, und Sie haben Einheiten, die von anderen Einheiten abhängen, bis Sie schließlich zu der Anwendung gelangen, die an sich eine Einheit ist.
Sie sollten jede Schicht testen und sich nicht darauf verlassen, dass Sie durch Testen von Einheit A auch Einheit B testen, von der Einheit A abhängt (die Regel gilt auch für die Vererbung). Auch dies sollte als Implementierungsdetail behandelt werden obwohl Sie vielleicht das Gefühl haben, sich zu wiederholen.
Beachten Sie, dass sich geschriebene Tests wahrscheinlich nicht ändern, während sich der zu testende Code fast definitiv ändert.
In der Praxis gibt es auch das Problem von E / A und der Außenwelt. Daher möchten Sie Schnittstellen verwenden, damit Sie bei Bedarf Mocks erstellen können.
In dynamischeren Sprachen ist dies kein so großes Problem. Hier können Sie Ententypisierung, Mehrfachvererbung und Mixins verwenden, um Testfälle zu erstellen. Wenn Sie anfangen, Vererbung im Allgemeinen nicht zu mögen, machen Sie es wahrscheinlich richtig.