it-swarm.com.de

Was ist der Unterschied zwischen Unit-, Funktions-, Akzeptanz- und Integrationstests?

Was ist der Unterschied zwischen Unit-, Funktions-, Akzeptanz- und Integrationstests (und allen anderen Arten von Tests, die ich nicht erwähnt habe)?

778
Andrew

Je nachdem, wo Sie suchen, erhalten Sie leicht unterschiedliche Antworten. Ich habe viel über das Thema gelesen und hier ist meine Destillation; Auch diese sind leicht wollig und andere können anderer Meinung sein.

nit Tests

Testet die kleinste Funktionseinheit, in der Regel eine Methode/Funktion (z. B. sollte bei einer Klasse mit einem bestimmten Status der Aufruf der x-Methode für die Klasse dazu führen, dass y auftritt). Unit-Tests sollten sich auf eine bestimmte Funktion konzentrieren (z. B. sollte der Aufruf der pop-Methode, wenn der Stack leer ist, ein InvalidOperationException auslösen). Alles, was es berührt, sollte im Gedächtnis geschehen; Dies bedeutet, dass der Testcode nd der zu testende Code nicht:

  • Rufen Sie (nicht-triviale) Mitarbeiter an
  • Greifen Sie auf das Netzwerk zu
  • Schlagen Sie eine Datenbank
  • Verwenden Sie das Dateisystem
  • Einen Faden aufdrehen
  • usw.

Jede Art von Abhängigkeit, die langsam/schwer zu verstehen/zu initialisieren/zu manipulieren ist, sollte unter Verwendung der entsprechenden Techniken unterdrückt/verspottet werden, damit Sie sich darauf konzentrieren können, was die Codeeinheit tut, nicht darauf, was ihre Abhängigkeiten tun.

Kurz gesagt, Unit-Tests sind so einfach wie möglich, leicht zu debuggen, zuverlässig (aufgrund reduzierter externer Faktoren), schnell auszuführen und helfen zu beweisen, dass die kleinsten Bausteine ​​Ihres Programms wie beabsichtigt funktionieren, bevor sie zusammengesetzt werden. Die Einschränkung ist, dass, obwohl Sie nachweisen können, dass sie perfekt für sich arbeiten, die Codeeinheiten in der Kombination explodieren können, was uns zu ...

Integrationstests

Integrationstests bauen auf Komponententests auf, indem sie die Codeeinheiten kombinieren und prüfen, ob die resultierende Kombination korrekt funktioniert. Dies kann entweder die Innereien eines Systems sein oder das Zusammenführen mehrerer Systeme, um etwas Nützliches zu bewirken. Eine andere Sache, die Integrationstests von Unit-Tests unterscheidet, ist die Umgebung. Integrationstests können und werden Threads verwenden, auf die Datenbank zugreifen oder alles Erforderliche tun, um sicherzustellen, dass der gesamte Code nd die verschiedenen Umgebungsänderungen ordnungsgemäß funktionieren.

Wenn Sie einen Serialisierungscode erstellt haben und das Gerät seine Innereien getestet hat, ohne die Festplatte zu berühren, woher wissen Sie dann, dass es beim Laden und Speichern auf der Festplatte funktioniert? Vielleicht haben Sie vergessen, die Dateistreams zu löschen und zu entsorgen. Möglicherweise sind Ihre Dateiberechtigungen nicht korrekt und Sie haben die Innereien mit in Speicher-Streams getestet. Die einzige Möglichkeit, dies sicher herauszufinden, besteht darin, es in einer Umgebung zu testen, die der Produktion am nächsten kommt.

Der Hauptvorteil besteht darin, dass sie Fehler finden, die bei Komponententests nicht auftreten können, wie z. B. Verdrahtungsfehler (z. B. eine Instanz der Klasse A empfängt unerwartet eine Nullinstanz von B) und Umgebungsfehler (auf meinem Computer mit einer CPU funktioniert dies einwandfrei, aber auf meinem Die 4-Kern-Maschine des Kollegen kann die Tests nicht bestehen. Der Hauptnachteil ist, dass Integrationstests mehr Code berühren, weniger zuverlässig sind, Fehler schwerer zu diagnostizieren sind und die Tests schwerer zu warten sind.

Integrationstests beweisen außerdem nicht unbedingt, dass eine vollständige Funktion funktioniert. Der Benutzer kümmert sich möglicherweise nicht um die internen Details meiner Programme, aber ich!

Funktionstests

Funktionstests prüfen ein bestimmtes Merkmal auf Richtigkeit, indem sie die Ergebnisse für eine bestimmte Eingabe mit der Spezifikation vergleichen. Funktionstests befassen sich nicht mit Zwischenergebnissen oder Nebenwirkungen, sondern nur mit dem Ergebnis (es ist ihnen egal, dass das Objekt y nach x den Zustand z hat). Sie wurden geschrieben, um einen Teil der Spezifikation zu testen, z. B. "Aufrufen der Funktion Square (x) mit dem Argument 2 gibt 4 zurück".

Abnahmetests

Akzeptanztests scheinen in zwei Typen unterteilt zu sein:

Beim Standard-Abnahmetest wird das gesamte System getestet (z. B. mithilfe Ihrer Webseite über einen Webbrowser), um festzustellen, ob die Funktionalität der Anwendung der Spezifikation entspricht. Z.B. "Durch Klicken auf ein Zoom-Symbol sollte die Dokumentansicht um 25% vergrößert werden." Es gibt kein wirkliches Kontinuum von Ergebnissen, nur ein Bestehen oder Nichtbestehen.

Der Vorteil ist, dass die Tests in einfachem Englisch beschrieben werden und die Software als Ganzes vollständig ist. Der Nachteil ist, dass Sie eine weitere Stufe in der Testpyramide aufgestiegen sind. Akzeptanztests berühren Berge von Code, daher kann es schwierig sein, einen Fehler aufzuspüren.

Bei der agilen Softwareentwicklung umfasst das Testen der Benutzerakzeptanz auch das Erstellen von Tests, um die vom/für den Kunden der Software während der Entwicklung erstellten User Stories widerzuspiegeln. Wenn die Tests bestanden werden, bedeutet dies, dass die Software die Anforderungen des Kunden erfüllen sollte und die Geschichten als vollständig betrachtet werden können. Eine Abnahmetestsuite ist im Grunde eine ausführbare Spezifikation, die in einer domänenspezifischen Sprache geschrieben ist und die Tests in der Sprache beschreibt, die von den Benutzern des Systems verwendet wird.

Fazit

Sie ergänzen sich alle. Manchmal ist es vorteilhaft, sich auf einen Typ zu konzentrieren oder ihn ganz zu vermeiden. Der Hauptunterschied für mich ist, dass einige der Tests die Dinge aus der Perspektive eines Programmierers betrachten, während andere einen Kunden-/Endbenutzerfokus verwenden.

1329
Mark Simpson

Wichtig ist, dass Sie wissen, was diese Begriffe für Ihre Kollegen bedeuten. Verschiedene Gruppen haben leicht unterschiedliche Definitionen, was sie bedeuten, wenn sie beispielsweise "vollständige Ende-zu-Ende-Tests" sagen.

Ich bin kürzlich auf das Namenssystem von Google für ihre Tests gestoßen, und es gefällt mir eher - sie umgehen die Argumente, indem sie nur Klein, Mittel und Groß verwenden. Um zu entscheiden, in welche Kategorie ein Test passt, untersuchen sie einige Faktoren - wie lange dauert die Ausführung, greift auf das Netzwerk, die Datenbank, das Dateisystem, externe Systeme usw. zu.

http://googletesting.blogspot.com/2010/12/test-sizes.html

Ich würde mir vorstellen, dass der Unterschied zwischen Klein, Mittel und Groß für Ihren aktuellen Arbeitsplatz von dem von Google abweichen könnte.

Es geht jedoch nicht nur um den Umfang, sondern auch um den Zweck. Marks Hinweis auf unterschiedliche Perspektiven für Tests, z. Programmierer vs Kunde/Endbenutzer, ist wirklich wichtig.

86
testerab

http://martinfowler.com/articles/microservice-testing/

In Martin Fowlers Blogpost geht es um Strategien zum Testen von Code (insbesondere in einer Mikrodienstarchitektur), aber das meiste davon gilt für jede Anwendung.

Ich zitiere aus seiner Zusammenfassung:

  • Unit-Tests - Testen Sie die kleinsten Teile der testbaren Software in der Anwendung, um festzustellen, ob sie sich wie erwartet verhalten.
  • Integrationstests - Überprüfen Sie die Kommunikationspfade und Interaktionen zwischen Komponenten, um Schnittstellendefekte zu erkennen.
  • Komponententests - Beschränken Sie den Umfang der ausgeführten Software auf einen Teil des zu testenden Systems, manipulieren Sie das System über interne Codeschnittstellen und verwenden Sie Test-Doubles, um den zu testenden Code von anderen Komponenten zu isolieren.
  • Vertragstests - Überprüfen Sie die Interaktionen an der Grenze eines externen Dienstes und stellen Sie sicher, dass dieser den Vertrag erfüllt, den ein konsumierender Dienst erwartet.
  • End-to-End-Tests - Vergewissern Sie sich, dass ein System die externen Anforderungen erfüllt und seine Ziele erreicht. Testen Sie das gesamte System von Ende zu Ende.
58
Maxim

Unit Testing - Wie der Name schon sagt, wird diese Methode auf Objektebene getestet. Einzelne Softwarekomponenten werden auf Fehler geprüft. Für diesen Test sind Programmkenntnisse erforderlich, und die Testcodes werden erstellt, um zu überprüfen, ob sich die Software wie beabsichtigt verhält.

Funktionsprüfung - Wird ohne Kenntnis der internen Funktionsweise des Systems durchgeführt. Der Tester versucht, das System zu verwenden, indem er nur die Anforderungen befolgt, verschiedene Eingänge bereitstellt und die generierten Ausgänge testet. Dieser Test wird auch als Closed-Box-Test oder Black-Box-Test bezeichnet.

Abnahmeprüfung - Dies ist der letzte Test, der durchgeführt wird, bevor die Software an den Kunden übergeben wird. Es wird ausgeführt, um sicherzustellen, dass die entwickelte Software alle Kundenanforderungen erfüllt. Es gibt zwei Arten von Abnahmetests: die von den Mitgliedern des Entwicklungsteams durchgeführten internen Abnahmetests (Alpha-Tests) und die vom Kunden oder Endbenutzer durchgeführten Beta-Tests.

Integrationstests - Einzelne Module, die bereits einem Unit-Test unterzogen wurden, werden miteinander integriert. Im Allgemeinen werden die beiden Ansätze verfolgt:

1) Von oben nach unten
2) Bottom-Up

29
Shah

Das ist sehr einfach.

  1. Unit-Test: Dies ist der Test, der von Entwicklern durchgeführt wird, die über Programmierkenntnisse verfügen. Dieser Test wird in der Codierungsphase durchgeführt und ist Teil des White-Box-Tests. Wenn eine Software zur Entwicklung kommt, wird sie zu einem Teil des Codes oder zu Codeschnitten entwickelt, die als Einheit bezeichnet werden. Und einzelne Tests dieser Einheiten, so genannte Unit-Tests, werden von Entwicklern durchgeführt, um menschliche Fehler wie das Fehlen von Aussagen usw. herauszufinden.

  2. Funktionstests: Diese Tests werden in der Testphase (QS) durchgeführt und sind Teil der Black-Box-Tests. Die tatsächliche Ausführung der zuvor geschriebenen Testfälle. Diese Tests werden tatsächlich von Testern durchgeführt. Sie ermitteln das tatsächliche Ergebnis aller Funktionen auf der Site und vergleichen dieses Ergebnis mit dem erwarteten Ergebnis. Wenn sie Unterschiede feststellen, ist dies ein Fehler.

  3. Abnahmeprüfung: bekannt als UAT. Und das tatsächlich vom Tester, den Entwicklern, dem Managementteam, dem Autor, den Autoren und allen, die an diesem Projekt beteiligt sind. Damit das Projekt endlich fehlerfrei ausgeliefert werden kann.

  4. Integrationstest: Die Codeeinheiten (in Punkt 1 erklärt) werden miteinander integriert, um das Projekt zu vervollständigen. Diese Codeeinheiten können in einer anderen Codierungstechnologie oder in einer anderen Version geschrieben sein. Daher werden diese Tests von den Entwicklern durchgeführt, um sicherzustellen, dass alle Codeeinheiten mit anderen kompatibel sind und keine Integrationsprobleme auftreten.

17
Rakesh Kumar
6
cdunn2001

Ich werde Ihnen dies anhand eines praktischen Beispiels und ohne theoretisches Material erklären:

Ein Entwickler schreibt den Code. Es ist noch keine GUI implementiert. Das Testen auf dieser Ebene bestätigt, dass die Funktionen korrekt funktionieren und die Datentypen korrekt sind. Diese Testphase wird Unit-Test genannt.

Wenn eine GUI entwickelt und eine Anwendung einem Tester zugewiesen wird, überprüft er die Geschäftsanforderungen mit einem Kunden und führt die verschiedenen Szenarien aus. Dies nennt man Funktionstest. Hier bilden wir die Client-Anforderungen mit Anwendungsflüssen ab.

Integrationstests: Angenommen, unsere Anwendung besteht aus zwei Modulen: HR und Finanzen. HR-Modul wurde zuvor geliefert und getestet. Jetzt wird Finance entwickelt und steht zum Testen zur Verfügung. Die voneinander abhängigen Funktionen sind jetzt ebenfalls verfügbar. In dieser Phase testen Sie die Kommunikationspunkte zwischen den beiden und stellen sicher, dass sie den Anforderungen entsprechen.

Regressionstests sind eine weitere wichtige Phase, die nach jeder Neuentwicklung oder Fehlerbehebung durchgeführt wird. Ziel ist es, zuvor funktionierende Funktionen zu verifizieren.

5
fahad shaikh

komponententest: Das Testen eines einzelnen Moduls oder einer unabhängigen Komponente in einer Anwendung wird als Komponententest bezeichnet. Der Komponententest wird vom Entwickler durchgeführt.

integrationstest: Kombinieren aller Module und Testen der Anwendung, um zu überprüfen, ob die Kommunikation und der Datenfluss zwischen den Modulen ordnungsgemäß funktionieren oder nicht. Dieser Test wird auch von Entwicklern durchgeführt.

Funktionstest Das Prüfen der einzelnen Funktionen einer Anwendung ist ein Funktionstest

Abnahmetest Dieser Test wird vom Endbenutzer oder Kunden durchgeführt, um festzustellen, ob die Build-Anwendung den Kundenanforderungen entspricht, und nach Kundenspezifikation handelt es sich um einen Abnahmetest

4
malini