In den letzten Wochen habe ich darüber nachgedacht, wie ich eine Lücke in unserer Testmethode schließen kann. Vereinfacht ausgedrückt sind Unit-Tests zu klein und herkömmliche Integrationstests zu groß.
Ein häufiges Szenario kommt, wo A
und B
beide verwenden Komponenten C
. Allerdings A
und B
haben leicht unterschiedliche Anforderungen an und machen leicht unterschiedliche Annahmen über C
. Wenn ich der Entwickler bin, A
wie und wo teste ich meine Annahmen C
?
Offensichtlich sind Unit-Tests A
mit verspotteten Annahmen C
für A
isolierte Tests in Ordnung , aber sie testen die Annahmen selbst nicht.
Eine andere Möglichkeit besteht darin, Unit-Tests für hinzuzufügen C
. Dies ist jedoch nicht ideal, da es während der A
Entwicklung übermäßig umständlich sein wird, die Tests C
mit sich entwickelnden Annahmen von zu ändern A
. In der Tat hat der A
Entwickler möglicherweise nicht einmal ausreichenden Zugriff auf die Komponententests von C
(z. B. einer externen Bibliothek).
Um dies mit einem konkreteren Beispiel zu versehen: Angenommen, dies ist eine Knotenanwendung. A
und B
hängen davon ab C
, eine Datei zu lesen (unter anderem) und den Dateiinhalt in einem Objekt zu speichern, an das übergeben wird C
. Zunächst sind alle Dateien, die C
behandelt werden, klein und können ohne nennenswerte Blockierung synchron gelesen werden. Der Entwickler von B
erkennt jedoch, dass seine Dateien sehr groß werden und C
zu einem asynchronen Lesevorgang wechseln müssen . Dies führt zu einem sporadischen Synchronisationsfehler A
, bei dem immer noch davon ausgegangen C
wird, dass Dateien synchron gelesen werden.
Dies ist die Art von Fehler, die bekanntermaßen bei vollständigen Integrationstests nur schwer aufzuspüren ist und möglicherweise überhaupt nicht in Integrationstests abgefangen wird. Es wird auch nicht von A
s Unit-Tests erfasst, da die A
s-Annahmen verspottet werden. Es könnte jedoch leicht von einem "Mini" -Integrationstest erfasst werden, der nur A
und trainiert C
.
Ich habe nur wenige Hinweise auf diese Art von Tests gefunden. Integration in den Small , Component Integration Testing , Unit Integration Testing. Es bezieht sich auch eher auf die BDD-Testrichtung als auf formale TDD-Einheitentests.
Wie fülle ich diese Testlücke? Speziell - wo stelle ich solche Tests? Wie verspotte ich die Eingaben von A
und C
für "Mini" -Integrationstests? Und wie viel Aufwand sollte betrieben werden, um Testprobleme zwischen diesen Tests und Unit-Tests zu trennen? Oder gibt es einen besseren Weg, um die Testlücke zu schließen?
Antworten:
Mir scheint, Sie haben ein grundlegendes Problem mit Ihren Komponenten.
C sollte das tun, was C tun muss, und dafür getestet, dokumentiert und entworfen werden. Wenn Sie eine Situation haben, in der C darauf ausgelegt ist, "das zu tun, was B will", haben Sie eine missbräuchliche Beziehung, die sehr deutlich wird, wenn A eintrifft und C etwas anderes tun soll.
Was Sie nicht tun sollten, ist Unit-Test C im Kontext von A und insbesondere nicht A im Kontext von C - Sie testen A unabhängig und geben die Ergebnisse eines verspotteten C an A. Wenn die reale Version von C liefert nicht die gleichen Ergebnisse, dann haben Sie einen Fehler oder Konstruktionsfehler in C, der bei der Durchführung Ihrer großen Integrationstests abgefangen wird. Unit-Tests waren schon immer so - Sie können eine Einheit nicht testen, indem Sie gleichzeitig eine andere Einheit testen. Unit-Tests sind einfach nicht dafür ausgelegt.
Integrationstests müssen nicht "das gesamte Programm" sein, obwohl sie häufig so eingerichtet sind. Sie können ein Prüfstand sein, auf dem A und C zusammen ausgeführt werden, ohne den Rest des Programms auszuführen (oder so wenig davon, wie Sie davonkommen können). An dieser Stelle kann ich nicht weiter raten, da es davon abhängt, was diese Komponenten tun und wie sie mit dem Rest Ihres Programms interagieren. In der Regel können Sie jedoch einen Prüfstand schreiben, der eine Testabdeckung beider Komponenten bietet. Ob es sich lohnt, dies zu tun, oder ob es effizienter ist, das gesamte Programm als eines zu integrieren (selbst wenn Sie eine Teilmenge der Integrationstests ausführen), können nur Sie beantworten. Die meisten Integrationstests bestehen aus vielen Abschnitten. Hoffentlich sollten Sie nur die für diese beiden Komponenten relevanten ausführen können (und wenn nicht,
quelle