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

799

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

Andrew
quelle
1
Siehe auch sqa.stackexchange.com/a/23396/8992
Michael Durrant
1
Ich denke, Sie haben vergessen, Lasttests einzuschließen!
Sprechen ist billig Zeigen Sie mir Code

Antworten:

1350

Je nachdem, wohin Sie schauen, 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.

Unit Tests

Testet die kleinste Funktionseinheit, normalerweise eine Methode / Funktion (z. B. bei einer Klasse mit einem bestimmten Status sollte das Aufrufen 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 Stapel leer ist, eine auslösen InvalidOperationException). Alles, was es berührt, sollte in Erinnerung bleiben; Dies bedeutet, dass der Testcode und 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
  • Faden spinnen
  • usw.

Jede Art von Abhängigkeit, die langsam / schwer zu verstehen / zu initialisieren / zu manipulieren ist, sollte mit den entsprechenden Techniken gestoppt / verspottet / was auch immer, damit Sie sich auf das konzentrieren können, was die Codeeinheit tut, nicht auf das, 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 beweisen können, dass sie perfekt isoliert funktionieren, die Codeeinheiten in Kombination explodieren können, was uns zu ...

Integrationstests

Integrationstests bauen auf Komponententests auf, indem sie die Codeeinheiten kombinieren und testen, ob die resultierende Kombination korrekt funktioniert. Dies können entweder die Innereien eines Systems sein oder mehrere Systeme miteinander kombinieren, um etwas Nützliches zu tun. Ein weiterer Unterschied zwischen Integrationstests und Komponententests ist die Umgebung. Integrationstests können und werden Threads verwenden, auf die Datenbank zugreifen oder alles Notwendige tun, um sicherzustellen, dass der gesamte Code und die verschiedenen Umgebungsänderungen ordnungsgemäß funktionieren.

Wenn Sie einen Serialisierungscode erstellt und die Innereien des Geräts getestet haben, ohne die Festplatte zu berühren, woher wissen Sie, dass dies beim Laden und Speichern auf der Festplatte funktioniert? Vielleicht haben Sie vergessen, Filestreams zu spülen und zu entsorgen. Möglicherweise sind Ihre Dateiberechtigungen falsch und Sie haben die Innereien in Speicherströmen 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, z. B. Verdrahtungsfehler (z. B. eine Instanz der Klasse A erhält unerwartet eine Nullinstanz von B) und Umgebungsfehler (sie läuft auf meinem Single-CPU-Computer einwandfrei, aber meine Die 4-Kern-Maschine des Kollegen kann die Tests nicht bestehen. Der Hauptnachteil besteht darin, dass Integrationstests mehr Code berühren, weniger zuverlässig sind, Fehler schwerer zu diagnostizieren und die Tests schwieriger zu warten sind.

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

Funktionstests

Funktionstests überprü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 Objekt y nach x den Zustand z hat). Sie werden geschrieben, um einen Teil der Spezifikation zu testen, z. B. "Aufruf der Funktion Square (x) mit dem Argument 2 gibt 4 zurück".

Akzeptanztests

Akzeptanztests scheinen in zwei Typen unterteilt zu sein:

Bei Standard-Abnahmetests werden Tests auf dem gesamten System durchgeführt (z. B. mithilfe Ihrer Webseite über einen Webbrowser), um festzustellen, ob die Funktionalität der Anwendung der Spezifikation entspricht. Beispiel: "Durch Klicken auf ein Zoomsymbol 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 sicherstellen, dass die gesamte Software vollständig ist. Der Nachteil ist, dass Sie die Testpyramide um eine weitere Ebene nach oben verschoben haben. Akzeptanztests berühren Berge von Code, daher kann es schwierig sein, einen Fehler aufzuspüren.

Bei der agilen Softwareentwicklung umfasst das Testen der Benutzerakzeptanz 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 sind, bedeutet dies, dass die Software die Anforderungen des Kunden erfüllen sollte und die Geschichten als vollständig betrachtet werden können. Eine Akzeptanztestsuite 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.

Fazit

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

Mark Simpson
quelle
19
+1. @Mark Simpson Könnten Funktions- und Abnahmetests als "Systemtests" zusammengefasst werden? Wo passen End-to-End-Tests hin? (zu viel anderes Vokabular für meinen Geschmack)
Torsten Engelbrecht
3
@Franz Ich habe über die Fähigkeit und Leichtigkeit gesprochen, mit der Sie das Risiko reduzieren können , indem Sie Codeeinheiten isolieren und testen. Sie haben Recht, die Sprache, die ich verwendet habe, war etwas locker, da Tests nicht beweisen können, dass Code fehlerfrei ist.
Mark Simpson
15
Trotz der positiven Stimmen ist dies völlig falsch. Unit-Tests testen nicht einmal die "trivialen" Mitarbeiter; Jede injizierte Abhängigkeit muss verspottet werden. Funktionstests testen nicht das "Verhalten"; sie testen nur "Funktion", dh "f (A) gibt B zurück". Wenn Nebenwirkungen wichtig sind, ist es "Verhalten". Wenn diese Systemaufrufe enthalten, handelt es sich auch um "System" -Tests, wie bei "Verhaltenssystemtests". (Siehe testerab @ unten.) "Akzeptanztests" sind eine Teilmenge von "Verhaltenssystemtests", die den gesamten Stapel abdecken. "Integration" testet nach oben und simuliert die tatsächliche Nutzung. Es wird getestet, ob alle Abhängigkeiten in die Praxis integriert werden können.
cdunn2001
7
@ cdunn2001: Keine Sorge, konstruktive Kritik ist immer gut :) Dein Kommentar hat mir ein paar Dinge beigebracht, die ich nicht wusste, und meine Terminologie etwas aufgeräumt. Ich bin immer daran interessiert, neue Dinge von Entwicklern zu lernen, die gerne testen. Ich erinnere mich an das erste Mal, als ich Miško Heverys Blog entdeckte - es war wie eine Schatzkammer :)
Mark Simpson
11
@ MarkSimpson Obwohl Ihre Antwort sehr gut ist, möchte ich etwas mehr Details zu Funktionstests. Ich meine, in Ihrer Antwort ist es für mich schwierig, zwischen Funktionstests und Komponententests zu unterscheiden. Ich hoffe du hast Zeit dafür, mach weiter so!
Andrei Sandulescu
90

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

Ich bin kürzlich auf das Benennungssystem von Google für ihre Tests gestoßen, und es gefällt mir sehr gut - sie umgehen die Argumente, indem sie nur Klein, Mittel und Groß verwenden. Bei der Entscheidung, in welche Kategorie ein Test passt, werden einige Faktoren berücksichtigt: Wie lange dauert die Ausführung, der Zugriff auf das Netzwerk, die Datenbank, das Dateisystem, externe Systeme usw.

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 abweicht.

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

Testerab
quelle
6
+1 für die Benennung von Google-Tests, da dies einen Einblick in die Gründe gibt, warum verschiedene Organisationen / Personen unterschiedliche Definitionen für Tests haben.
Mark Simpson
Dies ist auch ein sehr schöner Artikel darüber, warum Sie verschiedene Teststufen verwenden und was Sie daraus machen: kentcdodds.com/blog/unit-vs-integration-vs-e2e-tests
testerab
63

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

Martin Fowlers Blogbeitrag spricht über 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 - Führen Sie die kleinsten Teile der testbaren Software in der Anwendung aus, um festzustellen, ob sie sich wie erwartet verhalten.
  • Integrationstests - Überprüfen Sie die Kommunikationspfade und Interaktionen zwischen Komponenten, um Schnittstellenfehler zu erkennen.
  • Komponententests - Beschränken Sie den Umfang der ausgeübten 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 von einem konsumierenden Dienst erwarteten Vertrag erfüllt.
  • End-to-End-Tests - Stellen Sie sicher, dass ein System die externen Anforderungen erfüllt und seine Ziele erreicht, indem Sie das gesamte System von Ende zu Ende testen.
Maxime
quelle
Das ist übrigens ein großartiger Artikel. Ich verstehe jedoch nicht ganz, wofür Vertragstests sind. Sind sie angesichts von Komponenten- und Integrationstests nicht redundant?
Wheleph
In einigen Sprachen (die Herr Fowler verwendet) können Sie eine Schnittstelle implementieren, die bei Verwendung der Standarddefinition einer Klasse nicht verfügbar gemacht wird, z. B. void IMyInterface.MyMethod (). Was wiederum logischerweise seine eigenen Tests haben würde. Obwohl Sie zu diesem Zeitpunkt zurück in Richtung BDD fahren. Ironischerweise hat Herr Fowler auch einen Landraub gehabt.
Skarsnik
2
Es ist übrigens kein Fowler-Artikel, der nur dort gepostet wurde. Vertragstests sind Tests, die durchgeführt werden, nachdem Clients Ihren Service nutzen. Anschließend schreiben Sie Tests, die prüfen, ob Sie für diesen bestimmten Clients nichts kaputt gemacht haben, dh die Service-API ändern.
Rafał Łużyński
@wheleph Unit-, Integrations- und Komponententests sprechen hauptsächlich für Software-Interna, die vom Entwickler stark gesteuert werden können. Ein Problem in den ersten drei Fällen bedeutet, dass Sie Ihre Quelle ändern, um das Problem zu beheben. - Die Vertragstests berühren das, was Ihnen in der Funktionalität versprochen wird, aber Sie können sich möglicherweise nicht direkt ändern, wenn ein Defekt vorliegt. Dies erfordert das Hinzufügen von Support-Code, um diese möglichen Probleme zu umgehen, anstatt nur den Fehler zu beheben. - Sie würden also einen Webdienst umgehen, der Ihnen fehlerhaftes json zurückgibt, selbst wenn die Vertragsspezifikation Ihnen sagt, dass es sich um eine bestimmte Struktur handelt.
Yemi Bedu
31

Unit Testing - Wie der Name schon sagt, wird diese Methode auf Objektebene getestet. Einzelne Softwarekomponenten werden auf Fehler getestet. 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 Eingaben bereitstellt und die generierten Ausgaben testet. Dieser Test wird auch als Closed-Box-Test oder Black-Box bezeichnet.

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

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) von unten nach oben

Schah
quelle
Was meinst du mit von oben nach unten und von unten nach oben? Ist Integrationstest dasselbe wie End-to-End-Test?
Tamj0rd2
18

Das ist sehr einfach.

  1. Unit-Test: Dies ist der Test, der tatsächlich 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 Code oder mehreren Codeschnitten entwickelt, die als Einheit bezeichnet werden. Und individuelle Tests dieser Einheiten, die als Unit-Tests bezeichnet werden und von Entwicklern durchgeführt werden, um menschliche Fehler wie fehlende Berichterstattung 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 Website und vergleichen dieses Ergebnis mit dem erwarteten Ergebnis. Wenn sie Unterschiede feststellen, ist dies ein Fehler.

  3. Abnahmetests: bekannt als UAT. Dies geschieht sowohl durch den Tester als auch durch Entwickler, Managementteam, Autor, Autoren und alle, die an diesem Projekt beteiligt sind. Um sicherzustellen, dass das Projekt endlich fehlerfrei ausgeliefert werden kann.

  4. Integrationstests: Die Codeeinheiten (in Punkt 1 erläutert) werden miteinander integriert, um das Projekt abzuschließen. Diese Codeeinheiten können in unterschiedlichen Codierungstechnologien geschrieben sein oder unterschiedliche Versionen haben. Daher werden diese Tests von Entwicklern durchgeführt, um sicherzustellen, dass alle Codeeinheiten mit anderen kompatibel sind und keine Integrationsprobleme auftreten.

Rakesh Kumar
quelle
1
@OlegTsyba Die Antwort kam 4 Jahre nach Beantwortung der Frage.
Bentesha
1
Wir sollten niemals eine Antwort mit "Das ist sehr einfach" beginnen, besonders wenn es sich um ein komplexes Thema wie dieses handelt.
Milosmns
6

Einige (relativ) aktuelle Ideen gegen übermäßiges Verspotten und reine Unit-Tests:

cdunn2001
quelle
Ich bin neu im Testen von Code. Unit-Tests scheinen meist Zeitverschwendung zu sein. Ich dachte, ich mache Unit-Tests, aber ich mache Integrationstests und dann lese ich über Unit-Tests und es scheint albern, vielleicht für Leute mit sehr wenig Erfahrung? Es besteht die Möglichkeit, dass mir ein Punkt fehlt.
PixMach
Wenn die Einheit allgemein definiert ist, testen Sie die Einheit ordnungsgemäß. Ich lehne es ab, Implementierungsdetails zu testen. Eine Privatklasse sollte nicht "Unit-getestet" werden. Wenn Sie jedoch mehrere öffentliche Klassen haben, könnten Sie versucht sein, eine zu verspotten, während Sie eine andere testen. Das ist die eigentliche Debatte. Ist die Einheit (a) Ihre gesamte Bibliothek? (b) jede öffentliche Klasse innerhalb der Bibliothek? Oder (c) jede öffentliche Methode innerhalb jeder Klasse? Ich bevorzuge es, eine bestimmte Bibliothek als integrierte Komponente zu testen, aber externe Abhängigkeiten zu verspotten oder zu fälschen (es sei denn, sie sind schnell und zuverlässig). Also denke ich bin bei dir.
cdunn2001
1
@PixMach: Eigentlich ist es umgekehrt. Wenn keine (guten) Komponententests vorhanden sind, wird viel Zeit verschwendet, wenn Sie (oder jemand anderes) diesen Code in Zukunft ändern müssen. Wenn Sie Erfahrung mit der Pflege von Code mit und ohne Komponententests haben, kennen Sie den Unterschied. Die Idee ist, dass Sie genau wissen sollten, welcher Teil des Codes repariert werden muss, wenn ein Komponententest unterbrochen wird. Fehlgeschlagene Akzeptanz- / Integrationstests in großem Maßstab sagen Ihnen oft nur: Es funktioniert nicht. Und dann müssen Sie mit dem Debuggen der alten Schule beginnen ...
Goodsquirrel
@ Goodsquirrel, es kommt darauf an, was du eine "Einheit" nennst. Das ist das Problem. Fehlerhafte Tests werden beim Refactoring gelöscht. Gute Tests werden immer noch hilfreich sein. Schlechte Tests bringen keinen Wert und stören. Gute Tests sind selbstdokumentierend und werden sehr geschätzt. Lassen Sie uns spezifisch werden. Ich habe eine private Methode, um einen Wert zurückzugeben, wenn ein anderer Wert True ist, andernfalls ein Standardwert. (Legacy-Code.) Sollte diese Methode getestet werden? Ich sage nein. Eine andere private Methode gibt die n-te Fibonacci-Zahl zurück. Sollte das getestet werden? Ich sage ja.
cdunn2001
1
Der kleinste exponierte Code. Großer Unterschied.
cdunn2001
5

Ich werde Ihnen dies mit einem praktischen Beispiel und ohne theoretisches Zeug erklären:

Ein Entwickler schreibt den Code. Es ist noch keine GUI implementiert. Die Tests auf dieser Ebene bestätigen, dass die Funktionen ordnungsgemäß funktionieren und die Datentypen korrekt sind. Diese Testphase wird als Unit-Test bezeichnet.

Wenn eine grafische Benutzeroberfläche entwickelt und die Anwendung einem Tester zugewiesen wird, überprüft er die Geschäftsanforderungen mit einem Client und führt die verschiedenen Szenarien aus. Dies wird als Funktionstest bezeichnet. Hier ordnen wir die Clientanforderungen den Anwendungsabläufen zu.

Integrationstests: Nehmen wir an, unsere Anwendung besteht aus zwei Modulen: HR und Finanzen. Das HR-Modul wurde zuvor geliefert und getestet. Jetzt ist Finance entwickelt und kann getestet werden. Die voneinander abhängigen Funktionen sind jetzt auch verfügbar. In dieser Phase testen Sie die Kommunikationspunkte zwischen den beiden und überprüfen, ob sie gemäß den Anforderungen funktionieren.

Regressionstests sind eine weitere wichtige Phase, die nach Neuentwicklungen oder Fehlerkorrekturen durchgeführt wird. Ziel ist es, bisher funktionierende Funktionen zu verifizieren.

Fahad Shaikh
quelle
1
"Ein Entwickler schreibt den Code. Es ist noch keine grafische Benutzeroberfläche implementiert. Beim Testen auf dieser Ebene wird überprüft, ob die Funktionen ordnungsgemäß funktionieren und die Datentypen korrekt sind. Diese Testphase wird als Komponententest bezeichnet." Dies ist nicht der Fall. GUI ist eigentlich nur ein "Plugin". Sie können bereits E2E-Tests in Ihre API-Ausgabe schreiben. (oder ein beliebiges
Antwortobjekt, das
4

Unit-Test: Das Testen einzelner Module oder unabhängiger Komponenten in einer Anwendung wird als Unit-Test bezeichnet. Der Unit-Test wird vom Entwickler durchgeführt.

Integrationstest: Kombinieren Sie alle Module und testen Sie die 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.

Ein Funktionstest zur Überprüfung der individuellen Funktionalität einer Anwendung ist ein Funktionstest

Abnahmetest Dieser Test wird vom Endbenutzer oder Kunden durchgeführt, ob die Build-Anwendung den Kundenanforderungen entspricht. Bei der Kundenspezifikation handelt es sich bekanntermaßen um Abnahmetests

Malini
quelle