843 Stimmen

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

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

1404voto

Mark Simpson Punkte 22759

Je nachdem, wo Sie nachschauen, erhalten Sie leicht unterschiedliche Antworten. Ich habe viel über das Thema gelesen, und hier ist meine Zusammenfassung; auch hier sind die Antworten etwas schwammig und andere mögen anderer Meinung sein.

Einheitliche Tests

Testet die kleinste Funktionseinheit, typischerweise eine Methode/Funktion (z.B. bei einer Klasse mit einem bestimmten Zustand sollte der Aufruf von Methode x der Klasse das Ereignis y auslösen). Unit-Tests sollten sich auf eine bestimmte Funktion konzentrieren (z.B. sollte der Aufruf der pop-Methode bei leerem Stack ein InvalidOperationException ). Alles, was er berührt, sollte im Speicher erfolgen; das bedeutet, dass der Testcode y der zu prüfende Code sollte das nicht:

  • Aufruf an (nicht-triviale) Mitarbeiter
  • Zugriff auf das Netz
  • Treffer in einer Datenbank
  • Verwenden Sie das Dateisystem
  • Einen Faden aufspinnen
  • usw.

Jede Art von Abhängigkeit, die langsam / schwer zu verstehen / zu initialisieren / zu manipulieren ist, sollte mit Hilfe geeigneter Techniken stubbed/mocked/whatevered werden, damit man sich auf das konzentrieren kann, was die Codeeinheit tut, und 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 zusammengefügt werden. Der Nachteil ist, dass man zwar nachweisen kann, dass sie isoliert perfekt funktionieren, aber die Code-Einheiten können bei der Kombination explodieren, was uns zu ...

Integrationstests

Integrationstests bauen auf Unit-Tests auf, indem sie die Codeeinheiten kombinieren und testen, ob die resultierende Kombination korrekt funktioniert. Dabei kann es sich entweder um das Innenleben eines Systems handeln oder um die Kombination mehrerer Systeme, um etwas Nützliches zu tun. Ein weiteres Unterscheidungsmerkmal zwischen Integrationstests und Unit-Tests ist die Umgebung. Integrationstests können und werden Threads verwenden, auf die Datenbank zugreifen oder alles tun, was erforderlich ist, um sicherzustellen, dass der gesamte Code y die verschiedenen Umgebungsänderungen korrekt funktionieren.

Wenn Sie einen Serialisierungscode erstellt haben und seine Innereien getestet haben, ohne die Festplatte zu berühren, woher wissen Sie dann, dass er beim Laden und Speichern auf der Festplatte funktioniert? Vielleicht haben Sie vergessen, Dateiströme zu spülen und zu entsorgen. Vielleicht sind Ihre Dateiberechtigungen falsch und Sie haben die Innereien mit In-Memory-Streams getestet. Die einzige Möglichkeit, dies herauszufinden, besteht darin, es in einer Umgebung zu testen, die der Produktionsumgebung am nächsten kommt.

Der Hauptvorteil ist, dass sie Fehler finden, die Unit-Tests nicht finden können, wie z. B. Verdrahtungsfehler (z. B. eine Instanz der Klasse A empfängt unerwartet eine Null-Instanz von B) und Umgebungsfehler (es läuft gut auf meinem Single-CPU-Rechner, aber der 4-Kern-Rechner meines Kollegen kann die Tests nicht bestehen). Der Hauptnachteil besteht darin, dass Integrationstests mehr Code berühren, weniger zuverlässig sind, Fehler schwieriger zu diagnostizieren sind und die Tests schwieriger zu warten sind.

Außerdem beweisen Integrationstests nicht notwendigerweise, dass eine komplette Funktion funktioniert. Der Benutzer interessiert sich vielleicht nicht für die internen Details meiner Programme, aber ich schon!

Funktionelle Tests

Funktionstests prüfen eine bestimmte Funktion auf ihre Korrektheit, indem sie die Ergebnisse für eine bestimmte Eingabe mit der Spezifikation vergleichen. Funktionale Tests befassen sich nicht mit Zwischenergebnissen oder Nebeneffekten, sondern nur mit dem Ergebnis (es ist ihnen egal, dass Objekt y nach Ausführung von x den Zustand z hat). Sie werden geschrieben, um einen Teil der Spezifikation zu testen, z. B. "der Aufruf der Funktion Square(x) mit dem Argument 2 liefert 4".

Abnahmetests

Akzeptanztests lassen sich in zwei Arten unterteilen:

Beim Standard-Akzeptanztest wird das gesamte System getestet (z. B. die Nutzung Ihrer Webseite über einen Webbrowser), um festzustellen, ob die Funktionalität der Anwendung der Spezifikation entspricht. Z.B. "Ein Klick auf ein Zoom-Symbol sollte die Dokumentenansicht um 25% vergrößern". Es gibt kein wirkliches Kontinuum von Ergebnissen, sondern nur ein bestandenes oder nicht bestandenes Ergebnis.

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

In der agilen Softwareentwicklung beinhaltet das Benutzerakzeptanztesten auch die Erstellung von Tests, die die Benutzergeschichten widerspiegeln, die vom/für den Kunden der Software während der Entwicklung erstellt wurden. Wenn die Tests erfolgreich sind, bedeutet dies, dass die Software die Anforderungen des Kunden erfüllen sollte und die Geschichten als vollständig angesehen 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 von den Benutzern des Systems verwendeten Sprache beschreibt.

Schlussfolgerung

Sie sind alle komplementär. Manchmal ist es von Vorteil, sich auf eine Art zu konzentrieren oder sie ganz zu meiden. Der Hauptunterschied besteht für mich darin, dass einige der Tests die Dinge aus der Perspektive des Programmierers betrachten, während andere den Fokus auf den Kunden/Endbenutzer legen.

98voto

testerab Punkte 1444

Das Wichtigste ist, dass Sie wissen, was diese Begriffe für Ihre Kollegen bedeuten. Verschiedene Gruppen werden leicht unterschiedliche Definitionen haben, wenn sie zum Beispiel von "vollständigen End-to-End-Tests" sprechen.

Ich bin vor kurzem auf Googles Benennungssystem für ihre Tests gestoßen, und es gefällt mir sehr gut - sie umgehen die Argumente, indem sie einfach Small, Medium und Large verwenden. Um zu entscheiden, in welche Kategorie ein Test passt, werden einige Faktoren berücksichtigt - wie lange dauert die Ausführung, greift er auf das Netzwerk, die Datenbank, das Dateisystem, externe Systeme usw. zu.

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

Ich könnte mir vorstellen, dass der Unterschied zwischen Small, Medium und Large für Ihren derzeitigen Arbeitsplatz von dem von Google abweicht.

Es geht jedoch nicht nur um den Umfang, sondern auch um den Zweck. Marks Hinweis auf unterschiedliche Perspektiven bei Tests, z. B. Programmierer vs. Kunden/Endbenutzer, ist wirklich wichtig.

74voto

Maxim Punkte 7078

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

Der Blogbeitrag von Martin Fowler befasst sich mit Strategien zum Testen von Code (insbesondere in einer Microservices-Architektur), aber das meiste davon gilt für jede Anwendung.

Ich zitiere aus seiner Übersichtsfolie:

  • Unit-Tests - testen die kleinsten Teile der testbaren Software in der Anwendung, um festzustellen, ob sie sich wie erwartet verhalten.
  • Integrationstests - Überprüfung der Kommunikationspfade und Interaktionen zwischen den Komponenten, um Schnittstellenfehler zu erkennen.
  • Komponententests - beschränken den Umfang der geprüften Software auf einen Teil des zu prüfenden Systems, wobei das System über internen Codeschnittstellen und unter Verwendung von Testdoubles zur Isolierung des von anderen Komponenten zu isolieren.
  • Vertragstests - Überprüfung der Interaktionen an der Grenze eines externen Dienstes, um sicherzustellen, dass er den von einem konsumierenden Dienst erwarteten Vertrag erfüllt Dienst erwartet.
  • End-To-End-Tests - verifizieren, dass ein System die externen Anforderungen erfüllt und seine Ziele erreicht, indem das gesamte System getestet wird, von Ende zu Ende.

35voto

Shah Punkte 513

Einheitliche Prüfung - Wie der Name schon sagt, testet diese Methode auf der Objektebene. Einzelne Softwarekomponenten werden auf Fehler getestet. Für diesen Test sind Kenntnisse über das Programm erforderlich, und die Testcodes werden erstellt, um zu prüfen, ob sich die Software so verhält, wie es beabsichtigt ist.

Funktionelle Prüfung - Wird ohne jegliche Kenntnis der internen Funktionsweise des Systems durchgeführt. Der Tester versucht, das System zu benutzen, indem er einfach den Anforderungen folgt, verschiedene Eingaben macht und die erzeugten Ausgaben testet. Dieser Test wird auch als Closed-Box-Test oder Black-Box-Test bezeichnet.

Abnahmetests - Dies ist der letzte Test, der vor der Übergabe der Software an den Kunden durchgeführt wird. Er wird durchgeführt, um sicherzustellen, dass die entwickelte Software alle Anforderungen des Kunden erfüllt. Es gibt zwei Arten von Abnahmetests - einen, der von den Mitgliedern des Entwicklungsteams durchgeführt wird, bekannt als interner Abnahmetest (Alpha-Test), und den anderen, der vom Kunden oder Endbenutzer durchgeführt wird, bekannt als (Beta-Test)

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

1) Top-Down
2) Von unten nach oben

20voto

Rakesh Kumar Punkte 307

Das ist ganz einfach.

  1. Einheitstests: Dies sind Tests, die von Entwicklern mit Programmierkenntnissen durchgeführt werden. Diese Tests werden in der Kodierungsphase durchgeführt und sind ein Teil der White-Box-Tests. Wenn eine Software entwickelt wird, wird sie in Code-Stücke oder Code-Scheiben aufgeteilt, die als Unit bezeichnet werden. Die einzelnen Tests dieser Einheiten, die Unit-Tests genannt werden, werden von den Entwicklern durchgeführt, um menschliche Fehler wie fehlende Anweisungsabdeckung usw. herauszufinden.

  2. Funktionsprüfung: Diese Tests werden in der Testphase (QA) durchgeführt und sind Teil der Blackbox-Tests. Die tatsächliche Ausführung der zuvor geschriebenen Testfälle. Diese Tests werden von Testern durchgeführt, die das tatsächliche Ergebnis einer beliebigen Funktionalität auf der Website ermitteln und mit dem erwarteten Ergebnis vergleichen. Wenn sie eine Abweichung feststellen, handelt es sich um einen Fehler.

  3. Abnahmetest: auch bekannt als UAT. Dies wird sowohl von den Testern als auch von den Entwicklern, dem Managementteam, dem Autor, den Verfassern und allen, die an diesem Projekt beteiligt sind, durchgeführt. Damit soll sichergestellt werden, dass das Projekt schließlich fehlerfrei ausgeliefert werden kann.

  4. Integrationstests: Die (in Punkt 1 erläuterten) Codeeinheiten werden miteinander integriert, um das Projekt abzuschließen. Diese Code-Einheiten können in verschiedenen Kodierungstechnologien geschrieben sein oder unterschiedliche Versionen aufweisen, so dass diese Tests von den Entwicklern durchgeführt werden, um sicherzustellen, dass alle Code-Einheiten miteinander kompatibel sind und es kein Integrationsproblem gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X