Was ist ein Integrationstest genau?

110

Meine Freunde und ich hatten Mühe, genau zu klassifizieren, was ein Integrationstest ist.

Jetzt, auf meinem Heimweg, wurde mir klar, dass es sich jedes Mal, wenn ich versuche, ein reales Beispiel für einen Integrationstest zu geben, um einen Akzeptanztest handelt, d. H. Etwas, das ein Geschäftsmann laut aussprechen würde und das genau angibt, was das System liefern soll.

Ich habe die Ruby on Rails-Dokumentation auf ihre Klassifizierung dieser Testtypen überprüft, und sie hat mich jetzt völlig umgehauen.

Können Sie mir eine kurze akademische Beschreibung eines Integrationstests mit einem realen Beispiel geben?

Martin Blore
quelle
76
Übrigens, wenn Sie eine Nominalphrase haben ("Ich und ein paar Freunde"), müssen Sie vorsichtig sein, welchen Singular aus der ersten Person Sie verwenden. Hier ist der Test. Lass die Freunde fallen und sieh nach, ob es noch funktioniert. „Ich habe zu kämpfen“ vs „Ich habe zu kämpfen“. Dieser Test sagt Ihnen, dass es "Ich und meine Freunde ..." ist und - um höflich zu sein - wir zuerst andere auflisten. "Meine Freunde und ich". Testen ist wichtig.
S.Lott
58
Ich denke, S.Lott hat Ihnen gerade einen Grammatik-> Gesellschaft-Integrationstest gegeben.
Jordanien

Antworten:

78

Im Moment gefällt mir diese Aussage: "Es ist nicht wichtig, wie du es nennst, sondern was es tut", die von Gojko Adzic in diesem Artikel gemacht wurde .

Sie müssen mit den Leuten, die über die Tests sprechen, genau angeben, was Sie testen möchten.

Es gibt viele Menschen, die unterschiedliche Ansichten haben, je nachdem, welche Rolle sie spielen.

Für Tester ist TMap eine allgemein anerkannte Testmethode in den Niederlanden . TMap unterscheidet Folgendes.

  • Gerätetest
  • Unit-Integrationstest
  • Systemtest
  • Systemintegrationstest
  • Abnahmetest (alle Arten / Stufen)
  • Funktionsabnahmeprüfung
  • Benutzerakzeptanztest
  • produktionsabnahme test

Sie haben spezifischere Arten von Tests, die innerhalb der oben genannten Tests durchgeführt werden können. Schauen Sie sich dieses Word-Dokument für eine Übersicht an.

Wikipedia hat auch einen schönen Überblick .

Das Buch, das der pragmatische Programmierer sagt:

  • Ein Unit Test ist ein Test, der ein Modul ausübt
  • Integrationstests zeigen, dass die Hauptteile eines Systems gut zusammenarbeiten

Wenn ich diese verschiedenen Quellen betrachte und einige meiner eigenen Erfahrungen und Meinungen einbringe, würde ich zunächst drei Kategorien unterscheiden

  • Wer führt die Tests im Allgemeinen durch?
  • was getestet wird
  • Was ist das Ziel des Tests

    • Unit Test : Testen Sie die Logik in Klassen von Programmierern, um die Richtigkeit der Codeebene zu zeigen. Sie sollten schnell sein und nicht von anderen Teilen des Systems abhängen, die Sie nicht testen möchten
    • Functional Acceptance Test : Test-Use-Case-Szenarien für einen begrenzten (speziell erstellten) Datensatz, die von der Testabteilung durchgeführt wurden, um zu zeigen, dass jedes angegebene Szenario wie angegeben funktioniert.
    • Benutzerakzeptanztest : Testen Sie produktive Anwendungsszenarien wie Daten, die von Vertretern der Benutzer erstellt wurden, damit diese den Antrag formell akzeptieren
    • Integrationstest : Testen Sie die Kommunikationswege zwischen verschiedenen Teilen des Moduls, die von der Testabteilung oder von den Entwicklern durchgeführt wurden, um zu zeigen, dass alle Module ordnungsgemäß zusammenarbeiten.

Meine obige Liste ist nur ein Anfang und ein Vorschlag, aber ich denke wirklich: "Es ist nicht wichtig, wie du es nennst, aber was es tut."

Hoffe das hilft.

26-10-2016 Bearbeiten: Vor kurzem wurde eine sehr schöne Einführung in YouTube Unit Tests vs. Integration Tests - MPJs Musings - FunFunFunction # 55 gegeben

KeesDijk
quelle
3
+1 Für die "es spielt keine Rolle, wie Sie es nennen". Leider gibt es keine universelle Definition für irgendeine Art von Test. Auch der gute alte Unit-Test ist ein bisschen variabel. Wird das Testen des DOM für eine Web-App als Komponententest betrachtet? Manche sagen ja, manche sagen nein.
Laurent Bourgault-Roy
2
Der Link zum Wort doc ist nicht verfügbar.
Paul Rougieux
6
"Es ist nicht wichtig, wie Sie es nennen" gilt für die gesamte Informatik und in der Tat für fast alle Bereiche. Ich finde, viele der heftigen Auseinandersetzungen, auf die die Leute stoßen, lassen sich in "Wir streiten über die Definition einer willkürlichen Phrase" zusammenfassen.
Gardenhead
+1 Ich stimme den Definitionen zu: Ich war an einem Ort, an dem "Unit Test" erwähnte, dass der Programmierer das System mit mindestens einer Beispieleingabe ausprobierte ... manuell ... und die Ausgabe visuell überprüfte, ob sie "richtig schien". . Kein Vertrag darüber, was erwartet wurde, keine kontrollierten Eingaben usw.
Newtopian
Der Link zu Gojko gibt eine 404 zurück. Sie können hier auf ein Archiv zugreifen: web.archive.org/web/20150104002755/http://gojko.net/2011/01/12/…
Eduardo
32

Integrationstest erweist sich als Abnahmetest

Offensichtlich.

Diese beiden sind fast dasselbe. Die Testspezifikation weist jedoch einige geringfügig unterschiedliche Dimensionen auf.

Integration == das Gesamtsystem.

Akzeptanz == das System als Ganzes.

Der einzige Unterschied - und das ist subtil - ist die Definition der Testfälle.

Integration == Testfälle, um die Tiefe und den Grad der Integration zu testen. Funktioniert es für alle Edge Cases und Corner Cases? Testfälle sind in der Regel technisch und werden von Designern und Programmierern geschrieben.

Akzeptanz == Testfälle, um nur die auf den Endbenutzer ausgerichteten 80% des Funktionsumfangs auszuüben. Nicht alle Kanten- und Eckfälle. Testfälle sind in der Regel nicht technisch und werden von Endbenutzern geschrieben.

S.Lott
quelle
7
Das einzige, was ich hinzufügen möchte, ist, dass Integrationstests auch nur einen Teil des Systems testen können, jedoch jeweils mehr als ein Teil. Jedes Mal, wenn Sie nach Fehlern suchen, die durch zwei oder mehr Teile des Systems verursacht werden, die zusammenarbeiten (zusammen integriert sind), führen Sie Integrationstests durch. Die Integration erstreckt sich von zwei Komponenten, die real und alles andere verspottet sind, bis zur gesamten Anwendungssuite, die zusammenarbeitet, und kann sogar so weit gehen, die Integration mit anderen Anwendungen zu überprüfen (z. B. "Wie funktioniert MS Office mit Internet Explorer?").
Ethel Evans
1
@Ethel Evans: Guter Punkt. Der Test bleibt zwischen Integration und Akzeptanz verschwommen, auch wenn nur ein Teil des Systems betroffen ist. Die Tests werden auf einem Niveau durchgeführt, bei dem sich Akzeptanz und Integration ähnlich anfühlen.
S.Lott
3
Integrationstests testen "das System als Ganzes" sicher nicht (und sollten es wahrscheinlich auch nicht). Überall dort, wo zwei oder mehr Komponenten zusammen getestet werden, insbesondere beim Testen mit externen Komponenten (Datenbank, Netzwerk usw.), führen Sie Integrationstests durch. Aufgrund der hohen Kosten für das Testen des gesamten Systems möchten Sie dies so weit wie möglich vermeiden. Versuchen Sie stattdessen, mehr Tests für die Integration von Teilsystemen durchzuführen (siehe Testpyramide
Schneider,
1
@Schneider sagt es gut, Integrationstests sollten "das System als Ganzes" nicht testen. Solche Tests werden als "End-to-End-Tests" oder "Systemtests" betrachtet, je nachdem, welchen Umfang Sie in Ihrem Projekt berücksichtigen. End-to-End-Tests können einen Datenfluss "als Ganzes" abdecken, der mehrere Systeme durchläuft, und Systemtests nur "ein System als Ganzes".
RoyB
Hier ist, wie ich sie definiere, um die Verwirrung um die breite Verwendung des "Integration" -Tests zu vermeiden. Komponententests -> testet die kleinste Arbeitseinheit, eine Methode in einer Klasse, die keinen anderen Code außerhalb dieser Methode aufruft (ggf. Abhängigkeiten ausspotten) und sollten Schichten einer Anwendung testen, die zusammenarbeiten, aber NICHT die gesamte Anwendung, die irgendwo bereitgestellt wurde.) Funktionstests / Abnahmetest -> Tests, die eine bereitgestellte Version der Anwendung testen
Kevin M
16

Ich persönlich stelle mir einen Integrationstest gerne als Funktionstest vor, wenn jede Komponente des Systems echt ist und keine Scheinobjekte.

Ein echtes Repository, eine echte Datenbank, eine echte Benutzeroberfläche. Sie testen bestimmte Funktionen, wenn das System vollständig zusammengebaut ist und der erwarteten Bereitstellung entspricht.


quelle
4
Ich stimme zu, außer es muss kein "vollständig zusammengebautes" System sein. Sie können (und sollten) Integrationstests mit Teilmengen des Gesamtsystems durchführen, da dies normalerweise billiger / einfacher ist.
Schneider
Die Integration zwischen 2 Einheiten / Komponenten kann auch "Integrationstest" durchgeführt werden, während der Rest noch verspottet wird. Daher erlauben viele Integrationstest-Frameworks das Verspotten :)
RoyB
1
Ich habe Tests in einer Spring Boot-App, die das Front-End (API-Vertrag) innerhalb eines Spring-Containers testet, aber die Repository- / Datenschicht verschleiert. Es werden also verspottete Repositorys / Daten verwendet, aber die Controller-Ebene wird zusammengeführt und das Jackson-Marshalling usw. ausgeführt. Integrationstest.
Kevin M
8

In meiner (ich gebe zu) geringen Erfahrung habe ich verstanden, dass das Wort Integration wirklich Missverständnisse hervorrufen kann: Es ist wirklich schwierig, etwas vollständig isoliert in einem System zu finden, einige Elemente erfordern mit Sicherheit eine Integration.

So habe ich mich daran gewöhnt, folgende Unterscheidungen zu treffen:

  • Ich benutze Unit-Tests , um alle Verhaltensweisen zu identifizieren, zu dokumentieren und zu betonen, für deren Ausführung die Klasse verantwortlich ist, die ich teste.
  • Ich führe Integrationstests durch, wenn ich eine Komponente (möglicherweise mehr als eine) in meinem System habe, die sich mit einem anderen " externen " System unterhält. (weiter unten ...)
  • Ich führe einen Abnahmetest durch , um einen bestimmten Workflow zu definieren, zu dokumentieren und zu betonen, der vom System erwartet wird.

In der Definition des Integrationstests meinte ich mit extern ein System, das außerhalb meines Entwicklungsbereichs liegt : Ich kann das Verhalten aus irgendeinem Grund nicht sofort ändern. Es könnte eine Bibliothek sein, eine Komponente des Systems, die nicht geändert werden kann (dh sie wird mit anderen Projekten im Unternehmen geteilt), ein DBMS usw. Für diese Tests muss ich etwas einrichten, das der realen Umgebung des Systems sehr ähnlich ist funktioniert in: Ein externes System muss initialisiert und in einen bestimmten Zustand versetzt werden. realistische Daten müssen in der Datenbank registriert sein; usw.

Stattdessen , wenn ich die Annahme I - Tests tue gefälschte Dinge: Ich arbeite gerade an etwas anderes, ich auf den Spezifikationen des Systems gerade arbeitete, nicht auf seine Fähigkeit , mit externen Einheiten zusammenzuarbeiten.

Dies ist eine engere Sichtweise im Vergleich zu dem, was KeesDijk zuvor beschrieben hat. Ich nehme jedoch an, dass die Projekte, an denen ich bis jetzt gearbeitet habe, klein genug waren, um mir dieses Maß an Vereinfachung zu ermöglichen.

Marco Ciambrone
quelle
6

Ein Integrationstest überprüft, ob Komponenten eines komplexen Systems (z. B. Software, Flugzeuge, Kraftwerke) wie geplant zusammenarbeiten.

Stellen wir uns vor, wir sprechen von einem Flugzeug (mit Software ist es abstrakter und es ist schwierig, den Unterschied zu machen). Die Integrationstests umfassen Folgendes:

  • korrektes Zusammenspiel einiger Komponenten. Beispiel: Beim Drücken der Starttaste startet der Motor und der Propeller erreicht die erwartete Drehzahl (das Flugzeug bleibt immer noch am Boden).
  • korrektes Zusammenspiel mit externen Bauteilen. Beispiel: Überprüfen Sie, ob das eingebettete Funkgerät mit einem stationären Funkgerät (Flugzeug noch am Boden) kommunizieren kann.
  • Richtiges Zusammenspiel aller beteiligten Komponenten, damit das Gesamtsystem wie erwartet funktioniert. Beispiel: Eine Crew von Testpiloten und Ingenieuren startet das Flugzeug und fliegt damit (alle tragen Fallschirme ...).

Der Integrationstest befasst sich mit einem technischen Problem , nämlich dass das System trotz seiner Unterteilung in Komponenten funktioniert. In der Software können die Komponenten Anwendungsfälle, Module, Funktionen, Schnittstellen, Bibliotheken usw. sein.

Der Abnahmetest bestätigt die Gebrauchstauglichkeit des Produkts. Sie werden grundsätzlich vom Kunden durchgeführt. In Anlehnung an die Flugzeuganalogie wird unter anderem Folgendes überprüft:

  • Die geplanten Geschäftsszenarien führen zu dem erwarteten Ergebnis in einer nahezu realen Situation. Beispiel: Wiederholen Sie ein Boarding mit Testpassagieren, um zu überprüfen, ob das Personal das Boarding erwartungsgemäß mit den Betriebsverfahren überwachen kann. Einige Szenarien könnten so einfach sein, dass sie wie ein Komponententest aussehen, aber sie werden vom Benutzer durchgeführt (z. B. die elektrischen Stecker mit den Geräten der Unternehmen testen).
  • Das System arbeitet in einer fast realen Geschäftssituation. Beispiel: Machen Sie einen leeren Testflug zwischen zwei realen Zielen mit neu ausgebildeten Piloten der Fluggesellschaft, um zu überprüfen, ob der Treibstoffverbrauch den Erwartungen entspricht.

Der Abnahmetest befasst sich eher mit einem Verantwortungsproblem . In einer Kunden / Lieferanten-Beziehung kann es eine vertragliche Verantwortung sein (Einhaltung aller Anforderungen). In jedem Fall liegt es aber auch in der Verantwortung der nutzenden Organisation, sicherzustellen, dass ihre Aufgaben mit dem System ausgeführt werden können und umsichtig alle unvorhergesehenen Probleme zu vermeiden (z. B. dieser Eisenbahnkonzern, der bei Abnahmetests feststellte, dass sie einige Quais verkürzen mussten, weil Die neuen Wagen waren 5 cm zu groß - kein Scherz!).

Schlussfolgerungen: Integrations- und Akzeptanztests überschneiden sich. Beide wollen zeigen, dass das System als Ganzes funktioniert. Das "Ganze" könnte jedoch für den Kunden größer sein (weil das System selbst Teil eines größeren Organisationssystems sein kann) und für den Systemintegrator technischer:

Bildbeschreibung hier eingeben

Christophe
quelle
1

Integrationstests sind nichts anderes als die Überprüfung der Verbindung und Richtigkeit des Datenflusses zwischen zwei oder mehr Modulen.

Beispiel: Wenn wir eine E-Mail (ein Modul) erstellen und an eine gültige Benutzer-ID (zweites Modul) senden, wird beim Integrationstest überprüft, ob die gesendete E-Mail in den gesendeten Elementen vorhanden ist.

Anita
quelle
3
Willkommen bei den Programmierern. Was fügt Ihre Antwort hinzu, die nicht bereits durch die vorhandenen Antworten bereitgestellt wurde? Programmierer.SE ist nicht wie traditionelle Foren. Es konzentriert sich auf qualitativ hochwertige Fragen und Antworten anstatt auf viel Geschwätz. Weitere Informationen zur Funktionsweise der Website finden Sie auf der Tour- Seite.
0

Eine praktische Definition eines Integrationstests lautet: Jeder Test, der die Interaktion mit etwas außerhalb des Prozesses erfordert.

Zum Beispiel:

  • Das Dateisystem
  • Das Netzwerk
  • Eine Datenbank
  • Eine externe API

Zwischen Ihrem Prozess und der Außenwelt besteht eine Art Vertrag, bei dem zumindest überprüft wird, ob der Vertrag das Ziel eines Integrationstests sein sollte. dh es sollte nicht mehr tun, als den Vertrag zu überprüfen. Wenn dies der Fall ist, bewegen Sie sich in Richtung System / Ende-zu-Ende-Raum.

Unit Tests sind in der Lage, die gesamte Logik innerhalb Ihrer Prozessgrenzen zu testen, und aufgrund der fehlenden Abhängigkeiten von der langsamen, fragilen und komplexen "Außenwelt" können sie dies problemlos und präzise tun .

Obwohl es Integrationstests gibt, die in dieser Definition nicht behandelt werden (weshalb ich sie als praktische Definition bezeichnet habe), sind sie meiner Meinung nach viel seltener / nützlicher.

NB Genau genommen würde diese Definition auch System- / End-to-End-Tests abdecken. In meiner Philosophie sind sie eine Form des "extremen" Integrationstests, weshalb ihre Namen einen anderen Aspekt betonen. In der anderen Richtung kann ein Komponententest als Integrationstest von Nullkomponenten betrachtet werden, dh alle Tests können als irgendwo im Integrationsspektrum liegend betrachtet werden und zwischen 0-n-Komponenten integrieren :-)

Schneider
quelle
Wenn Sie zwei Einheiten haben, testen Sie jede mit einem Einheitentest. Wenn diese beiden Einheiten miteinander integriert sind, testen Sie die Integration mit einem Integrationstest. Sie müssen nicht "out of process" sein, und diese Art von Tests sind äußerst verbreitet.
Bryan Oakley
Sie haben absolut Recht - Dinge müssen nicht aus dem Ruder laufen, um ein Integrationstest zu sein. Deshalb habe ich versucht klar zu machen, dass meine Antwort eher eine "Faustregel" war (aber vielleicht gescheitert). Ich bin jedoch nicht der Meinung, dass Integrationstests zwischen Einheiten "extrem häufig" sind. Integrationstests mit Out-of-Process sind meiner Erfahrung nach viel häufiger und oft sehr wertvoll, weshalb meine Antwort diesen Aspekt des Integrationstests hervorhebt.
Schneider