Was ist der Unterschied zwischen Unit-, Funktions-, Akzeptanz- und Integrationstests (und anderen Arten von Tests, die ich nicht erwähnt habe)?
Was ist der Unterschied zwischen Unit-, Funktions-, Akzeptanz- und Integrationstests (und anderen Arten von Tests, die ich nicht erwähnt habe)?
Antworten:
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:
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.
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.
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.
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
Das ist sehr einfach.
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.
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.
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.
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.
Einige (relativ) aktuelle Ideen gegen übermäßiges Verspotten und reine Unit-Tests:
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.
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