Unit Tests vs Funktionstests

Antworten:

254

Unit Test - Testen einer einzelnen Einheit, z. B. einer Methode (Funktion) in einer Klasse, wobei alle Abhängigkeiten nachgebildet werden.

Funktionstest - AKA-Integrationstest zum Testen eines Teils der Funktionalität in einem System. Dies testet viele Methoden und kann mit Abhängigkeiten wie Datenbanken oder Webdiensten interagieren.

bpapa
quelle
170
Lassen Sie mich mit "AKA Integration Test" nicht einverstanden sein. Ein Integrationstest überprüft die Integration zwischen zwei oder mehr Systemen / Subsystemen in Ihrem Code. Wenn Sie beispielsweise eine SQL-Abfrage über ein ORM überprüfen, wird überprüft, ob ORM und Datenbank gut zusammenarbeiten. Funktionstests AKA End to End IMHO.
Graffic
7
Ich bin mit @graffic Functional Test einverstanden! = Integrationstest Sie müssen die "Integration" von Unterkomponenten des Systems ineinander verwechseln, z. B. den dauerhaften Zustand usw. Aber im Allgemeinen haben Integrationstests einen viel größeren Umfang.
Nabster
4
Nein, war über nichts verwirrt.
Papa
3
Integrationstest IS-A Funktionstest. Aber nicht umgekehrt. Google "funktionale und nicht funktionale Tests" und überprüfen Sie die "Bilder".
Andrejs
4
Diese Antwort ist einfach falsch! Funktionsprüfung ist nicht einmal in der Nähe Integrationstest ..
SOTN
517

Unit-Tests zeigen einem Entwickler, dass der Code die Dinge richtig macht. Funktionstests sagen einem Entwickler, dass der Code die richtigen Dinge tut .

Weitere Informationen finden Sie unter Unit Testing versus Functional Testing


Eine gut erläuterte reale Analogie von Unit-Tests und Funktionstests kann wie folgt beschrieben werden:

Oft wird die Entwicklung eines Systems mit dem Bau eines Hauses verglichen. Obwohl diese Analogie nicht ganz richtig ist, können wir sie erweitern, um den Unterschied zwischen Einheits- und Funktionstests zu verstehen.

Unit-Tests sind analog zu einem Bauinspektor, der die Baustelle eines Hauses besucht. Er konzentriert sich auf die verschiedenen internen Systeme des Hauses, das Fundament, die Rahmung, die Elektrik, die Sanitärtechnik und so weiter. Er stellt sicher (testet), dass die Teile des Hauses korrekt und sicher funktionieren, dh den Bauvorschriften entsprechen.

Funktionstests in diesem Szenario sind analog zu dem Hausbesitzer, der dieselbe Baustelle besucht. Er geht davon aus, dass sich die internen Systeme angemessen verhalten und der Bauinspektor seine Aufgabe erfüllt. Der Hausbesitzer konzentriert sich darauf, wie es sein wird, in diesem Haus zu leben. Er kümmert sich darum, wie das Haus aussieht, ob die verschiedenen Zimmer eine komfortable Größe haben, ob das Haus den Bedürfnissen der Familie entspricht, ob die Fenster ein guter Ort sind, um die Morgensonne einzufangen.

Der Hausbesitzer führt Funktionstests am Haus durch. Er hat die Perspektive des Benutzers.

Der Bauinspektor führt Unit-Tests am Haus durch. Er hat die Perspektive des Bauherrn.


Zusammenfassend:

Unit Tests werden aus Sicht des Programmierers geschrieben . Sie sollen sicherstellen, dass eine bestimmte Methode (oder eine Einheit ) einer Klasse eine Reihe spezifischer Aufgaben ausführt.

Funktionstests werden aus Sicht des Benutzers geschrieben . Sie stellen sicher, dass das System so funktioniert, wie es die Benutzer erwarten.

Anthony Forloney
quelle
18
Das Zitat ist etwas vage für jemanden, der neu im Konzept ist.
2
@ fig-gnuton, ich habe versucht auszuarbeiten, um die Beschreibung hoffentlich nicht als vage zu machen. Innerhalb des Links bieten sie ein gutes Beispiel. Ich könnte die Antwort mit dem Zitat aktualisieren, wenn Sie der Meinung sind, dass dies dem OP helfen könnte.
Anthony Forloney
147
Vielleicht könnte man auch sagen: "Unit-Test stellt sicher, dass der Code das tut, was der Programmierer will. Funktionstests stellen sicher, dass der Programmierer das tut, was der Kunde will."
JS.
3
Ich mag das, würde es aber anpassen. Ein Funktionstest stellt sicher, dass die Anwendung es dem Benutzer ermöglicht, eine Aktion auszuführen. Ein Unit-Test stellt sicher, dass sich der Code so verhält, wie es der Programmierer erwartet.
Adam
2
Entspricht das, was der Programmierer will, nicht dem, was der Endbenutzer will? Warum einen Test schreiben, der nicht den Erwartungen des Kunden entspricht?
O.Badr
140
  • Ein Unit-Test testet eine unabhängige Verhaltenseinheit . Was ist eine Verhaltenseinheit? Es ist das kleinste Teil des Systems, das unabhängig getestet werden kann. (Diese Definition tatsächlich rund ist, IOW es ist wirklich nicht eine Definition überhaupt , aber es scheint recht gut in der Praxis zu arbeiten, da kann man sort-of versteht es intuitiv.)

  • Ein Funktionstest testet eine unabhängige Funktionalität.


  • Eine Verhaltenseinheit ist sehr klein: Während ich dieses blöde Mantra "Ein Einheitentest pro Methode" absolut nicht mag, ist es aus Sicht der Größe ungefähr richtig. Eine Verhaltenseinheit ist etwas zwischen einem Teil einer Methode und vielleicht einigen Methoden. Höchstens ein Objekt, aber nicht mehr als eines.

  • Eine Funktionalität umfasst normalerweise viele Methoden und schneidet über mehrere Objekte und häufig durch mehrere Architekturebenen.


  • Ein Unit-Test wäre ungefähr so: Wenn ich die validate_country_code()Funktion aufrufe und ihr den Ländercode übergebe 'ZZ', sollte sie zurückgegeben werden false.

  • Ein Funktionstest wäre: Wenn ich das Versandformular mit dem Ländercode ausfülle, ZZsollte ich auf eine Hilfeseite weitergeleitet werden, auf der ich meinen Ländercode aus einem Menü auswählen kann.


  • Unit-Tests werden von Entwicklern für Entwickler aus Entwicklersicht geschrieben.

  • Funktionstests können für Benutzer aus Sicht des Benutzers benutzerbezogen sein. In diesem Fall werden sie von Entwicklern zusammen mit Benutzern (oder möglicherweise mit den richtigen Tools und den richtigen Benutzern sogar von den Benutzern selbst) für Benutzer geschrieben. Oder sie stehen Entwicklern gegenüber (z. B. wenn sie eine interne Funktionalität beschreiben, die dem Benutzer egal ist). In diesem Fall werden sie von Entwicklern für Entwickler geschrieben, aber immer noch aus der Sicht des Benutzers.


  • Im ersteren Fall können die Funktionstests auch als Abnahmetests und als ausführbare Codierung von Funktionsanforderungen oder als Funktionsspezifikation dienen, im letzteren Fall können sie auch als Integrationstests dienen.

  • Unit-Tests ändern sich häufig, Funktionstests sollten sich innerhalb einer Hauptversion niemals ändern.


Jörg W Mittag
quelle
ausgezeichnete Antwort! eine Sache - "Funktionstests sollten sich innerhalb einer Hauptversion niemals ändern" Warum ist das so?
Lazer
5
@Lazer, @cdeszaq: In vielen Projekten wird eine Änderung der Hauptversionsnummer verwendet, um auf Abwärtsinkompatibilität hinzuweisen, und OTOH, wenn sich die Hauptversion nicht ändert, ist die Abwärtskompatibilität garantiert . Was bedeutet "Abwärtskompatibilität"? Es bedeutet "ändert das vom Benutzer sichtbare Verhalten nicht". Und die Funktionstests sind eine ausführbare Codierung der Spezifikation des vom Benutzer sichtbaren Verhaltens. Also, wenn die große Zahl nicht ändert, dann wird die Funktionstests nicht mehr ändern entweder und umgekehrt, wenn die funktionellen tets tun ändern, dann ist die Hauptnummer muss auch ändern.
Jörg W Mittag
2
Hinweis: Ich habe nichts über das Hinzufügen von Funktionstests gesagt ! Ob das Hinzufügen von Funktionen, die zuvor nicht vorhanden waren, eine rückwärts inkompatible Änderung darstellt, hängt vom Projekt ab. Für Endbenutzersoftware wahrscheinlich nicht. Aber für eine Programmiersprache? Vielleicht: Wenn Sie beispielsweise ein neues Schlüsselwort einführen, werden derzeit funktionierende Programme, die dieses Schlüsselwort zufällig als Variablennamen verwenden, ungültig und sind somit eine rückwärts inkompatible Änderung.
Jörg W Mittag
3
@ JörgWMittag lieben diese Idee: "Funktionstests sind eine ausführbare Kodierung der Spezifikation des vom Benutzer sichtbaren Verhaltens" ... ob andere Super-Experten tatsächlich zustimmen oder nicht, es hilft mir bei der ursprünglichen Frage, "den Unterschied zwischen" zu erkennen 'em "
Mike Nagetier
1
"Ein Funktionstest wäre: Wenn ich das Versandformular mit der Landesvorwahl ZZ ausfülle, sollte ich auf eine Hilfeseite weitergeleitet werden, auf der ich meine Landesvorwahl aus einem Menü auswählen kann." Das ist ein bisschen pingelig, aber ich würde das einen "Akzeptanztest" nennen. Der Funktionstest würde testen, ob die Eingabe von ZZ auf dem Versandformular den Benutzer an die richtige URL weiterleitet oder eine bestimmte Ausnahme oder einen bestimmten Fehler auslöst.
Bob Ray
98

TLDR:

Um die Frage zu beantworten: Unit Testing ist ein Subtyp von Functional Testing.


Es gibt zwei große Gruppen: Funktionelle und Non-Functional Testing. Die beste (nicht erschöpfende) Illustration, die ich gefunden habe, ist diese (Quelle: www.inflectra.com ):

Geben Sie hier die Bildbeschreibung ein

(1) Unit Testing: Testen kleiner Codeausschnitte (Funktionen / Methoden). Dies kann als (White-Box-) Funktionstest angesehen werden.

Wenn Funktionen zusammengestellt werden, erstellen Sie ein Modul = ein eigenständiges Teil, möglicherweise mit einer Benutzeroberfläche, die getestet werden kann (Modultest). Sobald Sie mindestens zwei separate Module haben, kleben Sie sie zusammen und dann kommt:

(2) Integrationstests: Wenn Sie zwei oder mehr Teile von (Unter-) Modulen oder (Unter-) Systemen zusammenfügen und prüfen, ob sie gut zusammenspielen.

Dann integrieren Sie das 3. Modul, dann das 4. und 5. Modul in der Reihenfolge, in der Sie oder Ihr Team es für richtig halten, und sobald alle Puzzleteile zusammengesetzt sind, kommt es

(3) Systemtests: Testen der SW als Ganzes. Dies ist so ziemlich "Integrationstest aller Teile zusammen".

Wenn das in Ordnung ist, dann kommt

(4) Abnahmetests: Haben wir das erstellt, was der Kunde tatsächlich verlangt hat? Natürlich sollten Abnahmetests während des gesamten Lebenszyklus durchgeführt werden , nicht nur in der letzten Phase, in der Sie feststellen, dass der Kunde einen Sportwagen haben wollte und Sie einen Van gebaut haben.

Geben Sie hier die Bildbeschreibung ein

Andrejs
quelle
2
Ich habe viele solche Bilder in Google gesehen, die "Unit Test" als eine Art "Funktionstest" beschreiben. Aber warum beschreiben dann andere Antworten hier ein völlig anderes Konzept: Der "Funktionstest" ist eher ein End-to-End-Test und der Unit-Test ist kein Funktionstest? Ich war verwirrt. Es gibt zwei verschiedene "Religionen", die den Begriff "Funktionstest" unterschiedlich definieren oder was?
Ruslan Stelmachenko
Antworten (auch hoch bewertete) können auch falsch sein;)
Andrejs
1
Ich mag das Bild, aber für Systemintegrationstests sollte das Puzzle "vollständig" erscheinen, ohne weitere Stellen, an denen andere Teile verbunden werden können.
Jonathon Reinhart
4
@ JonathonReinhart - nicht unbedingt. Die offenen Kanten können eine einfache Erweiterbarkeit des Systems mit neuen Funktionen darstellen, was besonders nützlich ist, wenn ein Entwicklungsansatz wie Agile verwendet wird.
Myles
Aus mehreren widersprüchlichen Antworten oben geht hervor, dass dies offensichtlich Functional Testkein standardisierter Begriff ist und für verschiedene Personen unterschiedliche Bedeutungen hat.
Penghe Geng
12

"Funktionstest" bedeutet nicht, dass Sie eine Funktion (Methode) in Ihrem Code testen. Im Allgemeinen bedeutet dies, dass Sie die Systemfunktionalität testen. Wenn ich foo file.txtüber die Befehlszeile ausgeführt werde, werden die Zeilen file.txtmöglicherweise umgekehrt. Im Gegensatz dazu deckt ein einzelner Einheitentest im Allgemeinen einen einzelnen Fall einer einzelnen Methode ab - length("hello")sollte 5 und length("hi")2 zurückgeben.

Siehe auch IBMs Ansatz zwischen Unit-Test und Funktionstest .

Mark Rushakoff
quelle
Interessant, aber der Link, den Sie anzeigen, bedeutet etwas anderes: Bei der Funktion geht es um die Funktion, die durch die Implementierung ausgeführt werden soll, dh beim Testen aus Anwendersicht, dh um eine Funktion für den Benutzer.
Stefano Scarpanti
8

Der grundlegende Unterschied besteht jedoch darin, dass Funktionstests die Anwendung aus Sicht des Benutzers von außen testen. Unit-Tests testen die Anwendung von innen aus Sicht des Programmierers. Funktionstests sollen Ihnen helfen, eine Anwendung mit der richtigen Funktionalität zu erstellen, und sicherstellen, dass Sie sie niemals versehentlich beschädigen. Unit-Tests sollen Ihnen helfen, sauberen und fehlerfreien Code zu schreiben.

Entnommen aus dem Buch "Python TDD" von Harry Percival

Humoyun Ahmad
quelle
8

Laut ISTQB sind diese beiden nicht vergleichbar. Funktionstests sind keine Integrationstests.

Unit-Test ist eine der Teststufen und Funktionstests sind Testarten.

Grundsätzlich:

Die Funktion eines Systems (oder einer Komponente) ist "was es tut". Dies wird typischerweise in einer Anforderungsspezifikation, einer Funktionsspezifikation oder in Anwendungsfällen beschrieben.

während

Komponententests, auch als Einheiten-, Modul- und Programmtests bezeichnet, suchen nach Fehlern in und überprüfen die Funktionsweise von Software (z. B. Module, Programme, Objekte, Klassen usw.), die separat getestet werden können.

Laut ISTQB kann der Komponenten- / Komponententest funktionsfähig oder nicht funktionsfähig sein:

Das Testen von Komponenten kann das Testen der Funktionalität und spezifischer nichtfunktionaler Merkmale wie Ressourcenverhalten (z. B. Speicherlecks), Leistungs- oder Robustheitstests sowie strukturelle Tests (z. B. Entscheidungsabdeckung) umfassen.

Zitate aus Grundlagen des Softwaretests - ISTQB-Zertifizierung

Dominik
quelle
Ich stimme zu viel Flusen zu, aber trotzdem sind sie der größte Spieler dort und diese Frage betraf die Theorie, daher denke ich, dass ISTQB gut genug sein sollte.
Dominik
6

In Rails soll der Einheitenordner Tests für Ihre Modelle enthalten, der Funktionsordner soll Tests für Ihre Controller enthalten, und der Integrationsordner soll Tests enthalten, bei denen eine beliebige Anzahl von Controllern interagieren. Vorrichtungen sind eine Möglichkeit, Testdaten zu organisieren. Sie befinden sich im Fixtures-Ordner. Die Datei test_helper.rb enthält die Standardkonfiguration für Ihre Tests. u können besuchen diese .

Bhimasen Rautaray
quelle
3

So sehe ich das: Ein Komponententest stellt fest, dass der Code das tut, was Sie mit dem Code beabsichtigt haben (z. B. wollten Sie die Parameter a und b hinzufügen, Sie fügen sie tatsächlich hinzu und subtrahieren sie nicht). Funktionstests testen, ob der gesamte Code zusammenarbeitet, um ein korrektes Ergebnis zu erhalten, sodass das, was Sie mit dem Code beabsichtigt haben, tatsächlich das richtige Ergebnis im System erzielt.

Yishai
quelle
3

AFAIK, Unit Testing ist KEIN Funktionstest. Lassen Sie mich mit einem kleinen Beispiel erklären. Sie möchten testen, ob die Anmeldefunktion einer E-Mail-Webanwendung funktioniert oder nicht, genau wie ein Benutzer. Dafür sollten Ihre Funktionstests so sein.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Sollten unsere Funktionstests prüfen, ob wir uns mit ungültigen Eingaben anmelden können? Z.B. E-Mail hat kein @ -Symbol, Benutzername hat mehr als einen Punkt (nur ein Punkt ist zulässig), .com erscheint vor @ usw.? Im Allgemeinen nein! Diese Art von Tests fließt in Ihre Unit-Tests ein.

Sie können überprüfen, ob ungültige Eingaben in Komponententests zurückgewiesen werden, wie in den folgenden Tests gezeigt.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like [email protected], then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Beachten Sie, dass der Funktionstest 4 tatsächlich das tut, was der Komponententest 1 tut. Manchmal können Funktionstests aus verschiedenen Gründen einige (nicht alle) Tests wiederholen, die durch Komponententests durchgeführt wurden. In unserem Beispiel verwenden wir den Funktionstest 4, um zu überprüfen, ob bei der Eingabe einer ungültigen Eingabe eine bestimmte Fehlermeldung angezeigt wird . Wir möchten nicht testen, ob alle fehlerhaften Eingaben abgelehnt werden oder nicht. Das ist die Aufgabe von Unit-Tests.

MasterJoe2
quelle
1
Ein guter Punkt bei Funktionstests, die oft einen viel engeren Umfang haben als Unit-Tests (in Bezug auf Funktionstests, die sich mehr darauf konzentrieren, im Wesentlichen zu beweisen, dass die erwartete Funktion erreicht wird), aber ich würde sagen, dass sie unterschiedliche Dimensionen beschreiben ( Zusammensetzung in Unit-Tests vs Zweck in Funktionstests); Einige Unit-Tests sind Funktionstests, und einige Funktionstests sind Unit-Tests, aber es gibt auch viele Venn, die sich nicht überschneiden.
Myles
Gute Beispiele dafür, was für Funktionstests in Frage kommt und was nicht.
Myles
2

EINHEITSTEST

Das Testen von Einheiten umfasst das Testen der kleinsten Codeeinheit, bei der es sich normalerweise um Funktionen oder Methoden handelt. Unit-Tests werden meistens vom Entwickler von Unit / Methode / Funktion durchgeführt, da diese den Kern einer Funktion verstehen. Das Hauptziel des Entwicklers ist es, Code durch Unit-Tests abzudecken.

Es gibt eine Einschränkung, dass einige Funktionen nicht durch Komponententests getestet werden können. Auch nach erfolgreichem Abschluss aller Unit-Tests; Es garantiert nicht den korrekten Betrieb des Produkts. Die gleiche Funktion kann in wenigen Teilen des Systems verwendet werden, während der Komponententest nur für eine Verwendung geschrieben wurde.

FUNKTIONSPRÜFUNG

Es handelt sich um eine Art Black-Box-Test, bei dem die Funktionsaspekte eines Produkts getestet werden, ohne den Code zu untersuchen. Funktionstests werden meist von einem speziellen Software-Tester durchgeführt. Es umfasst positive, negative und BVA-Techniken, bei denen nicht standardisierte Daten zum Testen der angegebenen Funktionalität des Produkts verwendet werden. Die Testabdeckung wird durch Funktionstests besser durchgeführt als durch Unit-Tests. Es verwendet die Anwendungs-GUI zum Testen, sodass es einfacher ist, zu bestimmen, wofür genau ein bestimmter Teil der Schnittstelle verantwortlich ist, als zu bestimmen, wofür ein Code verantwortlich ist.

Ashish Gupta
quelle
2

ganz einfach können wir sagen:

  • Black Box: Benutzeroberflächentest wie Funktionstest
  • White Box: Code-Test wie Unit-Test

Lesen Sie hier mehr .

Alireza Rahmani Khalili
quelle
@fafl Es tut mir leid, mein schlechtes
Alireza Rahmani Khalili
1

Unit Test : - Unit Test wird insbesondere verwendet, um das Produkt Komponente für Komponente zu testen, insbesondere während das Produkt in der Entwicklung ist. Die Tools vom Typ Junit und Nunit helfen Ihnen auch beim Testen des Produkts gemäß der Einheit. ** Anstatt die Probleme nach der Integration zu lösen, ist es immer angenehm, sie früh in der Entwicklung zu lösen.

Funktionstests: - In Bezug auf die Tests gibt es zwei Haupttypen von Tests: 1. Funktionstest 2. Nichtfunktionstest.

Non-Functional Test ist ein Test, bei dem ein Tester prüft, ob das Produkt alle Qualitätsmerkmale ausführt, die der Kunde nicht erwähnt, aber diese Qualitätsmerkmale sollten vorhanden sein. Wie: - Leistung, Benutzerfreundlichkeit, Sicherheit, Belastung, Belastung usw., aber im Funktionstest : - Der Kunde ist bereits mit seinen Anforderungen anwesend und diese sind ordnungsgemäß dokumentiert. Die Aufgabe des Testers besteht darin, zu überprüfen, ob die Anwendungsfunktionalität entsprechend funktioniert zum vorgeschlagenen System oder nicht. Zu diesem Zweck sollte der Tester die implementierte Funktionalität mit dem vorgeschlagenen System testen.

Mohit Sarsar
quelle
0

Unit-Tests werden normalerweise von Entwicklern durchgeführt. Das gleiche Ziel ist es, sicherzustellen, dass der Code ordnungsgemäß funktioniert. Als Faustregel gilt, dass alle Pfade im Code mithilfe von Unit-Tests abgedeckt werden.

Funktionstests : Dies ist eine gute Referenz. Funktionsprüfung Erklärung

Automatisierungsbenutzer
quelle
6
Bitte fügen Sie den wichtigsten Text in Ihre Antwort ein. Sie wissen nie, wann die Seite möglicherweise entfernt wird, wodurch der Link ungültig wird.
Andrejs