webentwicklung-frage-antwort-db.com.de

Was ist Unit Testing und wie machen Sie es?

Genaues Duplikat vieler Beiträge:

Was ist Unit-Test?
Was macht einen guten Komponententest aus?
Neu bei Unit Testing
nit Testing - Definitionen
Learning Unit Testing
Verspotten und Unit-Test
nit Testing: Anfängerfragen
nd viele mehr ...
Auch Google für Seite: stackoverflow.com "wie geht das" Unit-Test

Ich habe einige Fragen zum Komponententest gelesen, weiß aber nicht genau, WAS es ist oder wie Sie es machen. Ich hatte gehofft, dass mir jemand Folgendes sagen kann:

  • Was genau IS Unit Testing? Ist es in Code integriert oder wird es als separates Programm ausgeführt? Oder etwas anderes?
  • Wie machst du das?
  • Wann sollte es gemacht werden? Gibt es Zeiten oder Projekte, um es nicht zu tun? Ist alles Unit-testbar?

Vielen Dank für die Hilfe.

123
rlbond

Unit-Tests beinhalten das Aufteilen Ihres Programms in Teile und das Durchführen einer Reihe von Tests für jedes Teil.

In der Regel werden Tests als separate Programme ausgeführt. Die Testmethode hängt jedoch von der Sprache und dem Softwaretyp (GUI, Befehlszeile, Bibliothek) ab.

Die meisten Sprachen haben nit-Testing-Frameworks , Sie sollten sich eines davon ansehen.

Tests werden in der Regel regelmäßig ausgeführt, häufig nach jeder Änderung des Quellcodes. Je öfter, desto besser, denn je eher werden Sie Probleme bekommen.

53
MattJ

Was ist Komponententest?

Unit-Tests stellen lediglich sicher, dass einzelne Codeeinheiten (meist Funktionen) wie erwartet funktionieren. Normalerweise schreiben Sie die Testfälle selbst, aber einige können automatisch generiert werden.

Die Ausgabe eines Tests kann so einfach wie eine Konsolenausgabe sein, zu einem " grünes Licht " in einer GUI wie NUnit oder einem anderen sprachspezifischen Framework.

Die Durchführung von Komponententests ist einfach konzipiert. Im Allgemeinen werden die Tests in Form von Funktionen geschrieben, die bestimmen, ob ein zurückgegebener Wert dem Wert entspricht, den Sie beim Schreiben der Funktion erwartet haben (oder dem Wert, den Sie ) wird erwarten, wenn Sie irgendwann schreiben - dies wird Test Driven Development genannt, wenn Sie schreiben die Tests zuerst).

Wie führen Sie Unit-Tests durch?

Stellen Sie sich eine sehr einfache Funktion vor, die Sie testen möchten:

int CombineNumbers(int a, int b) {
    return a+b;
}

Der Unit-Test-Code würde ungefähr so ​​aussehen:

void TestCombineNumbers() {
    Assert.IsEqual(CombineNumbers(5, 10), 15); // Assert is an object that is part of your test framework
    Assert.IsEqual(CombineNumbers(1000, -100), 900);
}

Wenn Sie die Tests ausführen, werden Sie darüber informiert, dass diese Tests bestanden wurden. Nachdem Sie die Tests erstellt und ausgeführt haben, wissen Sie, dass diese bestimmte Funktion oder Einheit erwartungsgemäß ausgeführt wird.

Stellen Sie sich vor, ein anderer Entwickler kommt vorbei und ändert die Funktion CombineNumbers() aus Gründen der Leistung oder aus einem anderen Grund:

int CombineNumbers(int a, int b) {
    return a * b;
}

Wenn der Entwickler die Tests ausführt, die Sie für diese sehr einfache Funktion erstellt haben, stellt er fest, dass das erste Assert fehlschlägt und dass der Build fehlerhaft ist.

Wann sollten Sie Unit-Tests durchführen?

Sie sollten so oft wie möglich durchgeführt werden. Wenn Sie im Rahmen des Entwicklungsprozesses Tests durchführen, wird Ihr Code automatisch besser gestaltet, als wenn Sie nur die Funktionen geschrieben und dann fortgefahren hätten. Auch Konzepte wie Abhängigkeitsinjektion werden sich auf natürliche Weise in Ihren Code verwandeln.

Der offensichtlichste Vorteil besteht darin, dass Sie später wissen, dass bei einer Änderung keine anderen einzelnen Codeeinheiten davon betroffen sind, wenn sie alle die Tests bestehen.

153
John Rasch

Was ...

Eine Methode zum automatischen Testen von Code anhand einer Reihe von Tests, um die gewünschten Ergebnisse durchzusetzen und Änderungen zu verwalten.

Eine "Einheit" in diesem Sinne ist die kleinste atomare Komponente des Codes, die zu testen sinnvoll ist, typischerweise eine Methode einer Klasse zum Beispiel. Ein Teil dieses Prozesses besteht darin, Stub-Objekte (oder "Mocks") aufzubauen, mit denen Sie mit einer Einheit als unabhängigem Objekt arbeiten können.

Wie ...

Fast immer ist der Unit-Test-Prozess so in ein IDE (oder durch Erweiterungen) eingebaut, dass er die Tests bei jeder Kompilierung ausführt. Es gibt eine Reihe von Frameworks zur Unterstützung bei der Erstellung von Unit-Tests (und in der Tat Scheinobjekte), oft als foo Unit bezeichnet (vgl. jUnit, xUnit, nUnit) Diese Frameworks bieten eine formalisierte Möglichkeit, Tests zu erstellen.

Test Driven Development (TDD) ist häufig die Motivation für Unit-Tests (für Unit-Tests ist jedoch kein TDD erforderlich). Dies setzt voraus, dass die Tests Teil der Spezifikationsdefinition sind und daher zuerst mit Code geschrieben werden müssen nur geschrieben, um diese Tests "zu lösen".

Wann ...

Fast immer . Sehr kleine Wegwerfprojekte sind es vielleicht nicht wert, aber nur, wenn Sie sich ganz sicher sind, dass sie wirklich wegwerfbar sind. Theoretisch ist jedes objektorientierte Programm einheitenprüfbar, aber einige Designmuster erschweren dies. Bekanntermaßen ist das Singleton-Muster problematisch, wenn umgekehrt die Frameworks für die Abhängigkeitsinjektion stark auf Komponententests ausgerichtet sind.

13
annakata

Was ist unauffällig? Es ist schwierig zu definieren. Auf technischer Ebene erstellen Sie Funktionen, die Funktionen in Ihrer Codebasis aufrufen und die Ergebnisse validieren. Grundsätzlich erhalten Sie eine Reihe von Dingen wie "assert (5 + 3) == 8", nur etwas komplizierter (wie in DataLayer (MockDatabase ()). GetUser (). Name == "Dilbert"). Auf der Ebene der Tool-Ansicht fügen Sie eine automatisierte, projektspezifische Überprüfung hinzu, ob alles noch so funktioniert, wie Sie es angenommen haben. Dies ist sehr, sehr hilfreich, wenn Sie umgestalten und komplizierte Algorithmen implementieren. Das Ergebnis ist in der Regel eine Menge Dokumentation und viel weniger Fehler, da das Verhalten des Codes eingeschränkt ist.

Ich erstelle Testfälle für alle Edge-Fälle und führe sie ähnlich wie einen generationsübergreifenden Garbage Collector aus. Während ich eine Klasse implementiere, führe ich nur die Testfälle aus, an denen die Klasse beteiligt ist. Sobald ich mit der Arbeit an dieser Klasse fertig bin, führe ich alle Unittests durch, um zu sehen, ob alles noch funktioniert.

Sie sollten so viel wie möglich testen, solange der Testcode so einfach ist, dass er nicht getestet wird. Angesichts dessen ist nicht alles auf vernünftige Weise überprüfbar. Denken Sie an Benutzeroberflächen. Denken Sie an einen Fahrer für ein Space Shuttle oder eine Atombombe (jedenfalls nicht mit reinen JUnit-Tests;)). Viele, viele Codes sind jedoch testbar. Datenstrukturen sind. Algorithmen sind. Die meisten Applicationlogic-Klassen sind. Also testen Sie es!

HTH. tetha

5
Tetha

Ich finde den einfachsten Weg, dies zu veranschaulichen, indem ich mir einen Code ansehe. Diese Einstiegsseite auf der NUnit-Site ist eine gute Einführung in Was und Wie

http://www.nunit.org/index.php?p=quickStart&r=2.5

Ist alles testbar? Im Allgemeinen, wenn es etwas berechnet, dann ja. UI-Code ist ein ganz anderes Problem, mit dem man sich befassen muss, da es schwierig ist, Benutzer beim Klicken auf Schaltflächen zu simulieren.

Was solltest du testen? Ich neige dazu, Tests über die Dinge zu schreiben, von denen ich weiß, dass sie schwierig werden. Komplizierte Zustandsübergänge, geschäftskritische Berechnungen, so etwas. Im Allgemeinen mache ich mir keine allzu großen Sorgen um das Testen grundlegender Input-/Output-Dinge, obwohl die Puristen zweifellos sagen werden, dass ich in dieser Hinsicht falsch liege und alles sein sollte geprüft. Wie so viele andere Dinge gibt es keine richtige Antwort!

2
MarcE

Was genau IS Unit Testing? Ist es in Code integriert oder wird es als separates Programm ausgeführt? Oder etwas anderes?

Von MSDN : Das Hauptziel des Komponententests besteht darin, die kleinste testbare Software in der Anwendung zu verwenden, sie vom Rest des Codes zu isolieren und festzustellen, ob sie sich genau so verhält, wie Sie es erwarten.

Im Wesentlichen schreiben Sie kleine Codebits, um die einzelnen Codebits zu testen. In der .net-Welt würden Sie diese kleinen Codestücke mit NUnit oder MBunit oder sogar den integrierten Testtools in Visual Studio ausführen. In Java) könnten Sie JUnit verwenden. Im Wesentlichen werden die Testläufer Ihr Projekt erstellen, die Komponententests laden und ausführen und Sie dann informieren, ob sie bestanden wurden oder nicht.

Wie machst du das?

Nun, es ist leichter gesagt als getan, um Einheitentest. Es braucht einiges an Übung, um gut darin zu werden. Sie müssen Ihren Code so strukturieren, dass es einfach ist, einen Komponententest durchzuführen, damit Ihre Tests effektiv sind.

Wann soll es gemacht werden? Gibt es Zeiten oder Projekte, um es nicht zu tun? Ist alles Unit-testbar?

Sie sollten es dort tun, wo es Sinn macht. Nicht alles ist für Unit-Tests geeignet. Zum Beispiel ist UI-Code nur sehr schwer zu testen, und Sie profitieren oft nur wenig davon. Business-Layer-Code eignet sich jedoch häufig sehr gut für Tests, und hier konzentrieren sich die meisten Unit-Tests.

Unit-Tests sind ein umfangreiches Thema, und um zu verstehen, wie Sie am besten davon profitieren können, sollten Sie sich ein Buch über Unit-Tests wie " Test Driven Development by Example " zulegen Sie haben ein gutes Verständnis für die Konzepte und wie Sie sie auf Ihren Code anwenden können.

1
lomaxx

Zum Teil "So geht's":

Ich denke, die Einführung in ScalaTest macht gute Arbeit bei der Veranschaulichung verschiedener Stile von Komponententests.

Im Teil "Wann es zu tun ist":

Unit Testing dient nicht nur zum Testen. Indem Sie Unit-Tests durchführen, erzwingen Sie auch das Design der Software in etwas, das Unit-Test-fähig ist. Viele Menschen sind der Meinung, dass dieses Design größtenteils Good Design (TM) ist, unabhängig von anderen Vorteilen aus Tests.

Ein Grund, einen Komponententest durchzuführen, besteht darin, Ihr Design in etwas zu zwingen, das hoffentlich einfacher zu pflegen ist, als wenn Sie es nicht für Komponententests entworfen hätten.

1
John Nilsson