Testlücke zwischen Einheit und Integration: Integration in die Integrationstests für kleine Komponenten, Komponenten und Einheiten

9

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 Aund Bbeide verwenden Komponenten C. Allerdings Aund Bhaben leicht unterschiedliche Anforderungen an und machen leicht unterschiedliche Annahmen über C. Wenn ich der Entwickler bin, Awie und wo teste ich meine Annahmen C?

Offensichtlich sind Unit-Tests Amit verspotteten Annahmen Cfür Aisolierte 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 AEntwicklung übermäßig umständlich sein wird, die Tests Cmit sich entwickelnden Annahmen von zu ändern A. In der Tat hat der AEntwickler 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. Aund Bhä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 Cbehandelt werden, klein und können ohne nennenswerte Blockierung synchron gelesen werden. Der Entwickler von Berkennt jedoch, dass seine Dateien sehr groß werden und Czu einem asynchronen Lesevorgang wechseln müssen . Dies führt zu einem sporadischen Synchronisationsfehler A, bei dem immer noch davon ausgegangen Cwird, 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 As Unit-Tests erfasst, da die As-Annahmen verspottet werden. Es könnte jedoch leicht von einem "Mini" -Integrationstest erfasst werden, der nur Aund 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 Aund Cfü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?

mjhm
quelle
1
Haben Sie überlegt, die Module AC zu versionieren und eine Form des Abhängigkeitsmanagements zu verwenden?
Miraculixx
1
@gnat Danke für den Tipp. Ich habe die Frage weniger vage gemacht.
mjhm
@miraclixx Danke für deinen Vorschlag. Könnten Sie näher darauf eingehen? Wenn Sie so etwas wie blog.nodejitsu.com/package-dependencies-done-right meinen, denke ich, dass dies ein anderes Problem löst, als ich es mir vorstelle . Die Komponenten, auf die ich mich beziehe, sind im Allgemeinen zu klein, um als Knotenmodul unabhängig voneinander ausgeführt zu werden - beispielsweise als Modell- oder Controller-Komponentendatei. Darüber hinaus gibt die Versionierung nur Hinweise zur Sicherheit und zu Fehlerquellen, anstatt explizite Tests auf bestimmte Probleme durchzuführen.
mjhm

Antworten:

6

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,

gbjbaanb
quelle
Ja, das denke ich irgendwie. Dies geht über den Umfang und den Zweck von Unit-Tests hinaus. Leider lebe ich nicht in einer Software-Welt, in der abhängige Komponenten perfekt entworfen, getestet und dokumentiert sind. Und die wenigen Integrationstests, die wir haben, sind im Allgemeinen durchgängig und werden von QS-Spezialisten und nicht von den Quellentwicklern durchgeführt. Wie Sie vielleicht vermuten, gibt es Management- und Organisationsprobleme in der Mischung.
mjhm
Ich denke, Sie müssen Ihre eigenen Integrationstests hinzufügen, aber nennen Sie sie Unit-Tests. "Wir testen das Kunden-Anmeldemodul auf Unit- Tests", wenn Sie Gurke oder Selen verwenden.
Gbjbaanb