Ich habe so gearbeitet, wie du arbeitest. Und ich werde dir nicht sagen, dass du es nicht kannst. Ich werde Sie vor etwas warnen, auf das Sie stoßen können.
Wenn jeder Unit-Test nur eine Nachrüstung ist, ist es schwer zu lernen, sie flexibel zu gestalten. Sie sind in der Regel nichts anderes als Regressionstests. Da Sie sie nie als Refactor verwendet haben, ist es sehr einfach, die Arten von Tests zu schreiben, die das Refactoring tatsächlich erschweren. Dies neigt dazu, außer Kontrolle zu geraten, bis Sie jegliches Vertrauen in TDD verlieren.
Sie arbeiten jedoch bereits an etwas. Ich werde dir nicht sagen, dass du aufhören sollst. Ich werde sagen, es könnte sich lohnen, etwas anderes zu beginnen, für das Sie Zeit haben, den rot-grünen Refaktor-Zyklus von Anfang an zu erkunden und zu verfolgen. Stellen Sie sicher, dass Sie die Tests tatsächlich verwenden, um die Umgestaltung zu unterstützen. Bis Sie diese Arbeitsweise beherrschen, verwenden Sie sie sparsam für etwas, das wichtig ist. Dies ist eine ganz andere Art des Codierens und gewöhnungsbedürftig. Es auf halbem Weg zu tun, wird niemandem nützen.
Das gesagt
Ich finde es immens einfacher, zuerst Integrationstests zu schreiben, am Code zu arbeiten und dann, sobald die API etwas gehärtet ist, tatsächlich Unit-Tests hinzuzufügen. Die Arten von Tests, die ich sozusagen für meine Hauptfunktion ausführen kann und die mehr "Ende-zu-Ende" sind als alles andere.
Verstehen Sie, dass ein Komponententest NICHT einfach ein Test ist, der auf eine Klasse angewendet wird. Solange die API, an der Sie arbeiten, getestet werden kann, ohne eine der folgenden Aktionen auszuführen, führen Sie Unit-Tests problemlos durch :
- Es spricht mit der Datenbank
- Es kommuniziert über das Netzwerk
- Es berührt das Dateisystem
- Es kann nicht gleichzeitig mit einem Ihrer anderen Komponententests ausgeführt werden
- Sie müssen spezielle Dinge an Ihrer Umgebung tun (z. B. das Bearbeiten von Konfigurationsdateien), um sie auszuführen.
Michael Feathers: Eine Reihe von Unit-Testing-Regeln
Wenn Ihr End-to-End-Test also mehr als ein Objekt umfasst, ist das in Ordnung. Dies ist Unit-Test, kein Objekttest.
So wie private Methoden nicht mehr getestet werden müssen, als sie durch Testen der öffentlichen Methoden, die sie verwenden, getestet werden, müssen Objekte zunächst nicht unter ihrem eigenen Testgeschirr entwickelt werden. Nur wenn Objekte für die Verwendung unabhängig von der End-to-End-Story in Betracht gezogen werden, müssen sie wirklich so behandelt werden, als hätten sie ihre eigene Schnittstelle und ihr eigenes Verhalten, um dies zu bestätigen. Wenn Sie vorsichtig sind, machen Sie diese Objekte öffentlich. Auf diese Weise machen Sie keine Versprechungen, die Sie nicht getestet haben.