Was ist Komponententest und wie machen Sie es?

Genaues Duplikat vieler Beiträge:

What is unit testing?
What Makes a Good Unit Test?
New to Unit Testing
Unit Testing - definitions
Learning Unit Testing
How to properly mock and unit test
Unit Testing: Beginner Questions
And many more ...
Auch Google für site:stackoverflow.com "how do you" unit-test

Habe ich einige Fragen zum Komponententest gelesen, aber ich weiß nicht genau, WAS es ist oder wie du es machst. Ich hatte gehofft, wenn mir jemand Folgendes sagen kann:

  • Was genau ist Einheitstests? Ist es in Code integriert oder als separate Programme ausgeführt? Oder etwas anderes?
  • Wie machen Sie das?
  • Wann sollte es getan werden? Gibt es Zeiten oder Projekte, die es nicht tun? Ist alles einheitsfähig?

Vielen Dank für die Hilfe.

Antwort auf "Was ist Komponententest und wie machen Sie es? " 7 von antworten

Komponententests beinhalten, Ihr Programm in Stücke zu zerbrechen und jedes Stück einer Reihe von Tests zu unterziehen.

Normalerweise werden Tests als separate Programme ausgeführt, aber die Methode des Testens variiert je nach Sprache und Art der Software (GUI, Befehlszeile, Bibliothek).

Die meisten Sprachen haben unit testing frameworks, you should look into one for yours. , Sie sollten in einer für Ihre suchen.

Tests werden in der Regel regelmäßig ausgeführt, oft nach jeder Änderung des Quellcodes. Je öfter, desto besser, denn je früher Sie Probleme fangen.

Was genau ist Einheitstest? Wirklich none in Code integriert oder als separater alles einheitsprüfbar?

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

Unit-Tests sind ein massives Thema und um ein vollständiges Verständnis dafür zu bekommen, wie es Ihnen am besten nützen kann, würde ich empfehlen, sich ein Buch über Komponententests wie Test Driven Development by Example" which will give you a good grasp on the concepts and how you can apply them to your code. zu beschaffen, das Ihnen ein gutes Verständnis für die Konzepte gibt und wie Sie sie auf Ihren Code anwenden können. " -74-"

Auf Tool-View-Ebene fügen Sie eine automatisierte, projektspezifische Prüfung hinzu, ob alles noch so funktioniert, wie Sie angenommen haben, dass die Dinge funktioniert haben. Dies ist sehr, sehr hilfreich, wenn Sie umgestalten und wenn Sie komplizierte Algorithmen implementieren. Das Ergebnis ist in der Regel eine Reihe von Dokumentation und viel weniger Bugs, weil das Verhalten des Codes festgepinnt ist.

Ich baue Testfälle für alle Edge-Fälle und führe sie ähnlich wie die Funktionsweise eines Generationen-Garbage Collectors aus. Während ich eine Klasse implementiert habe, führe ich nur die Testfälle aus, die die Klasse betreffen. 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 einfach genug ist, um ungetestet zu bleiben. Angesichts dessen, nein, nicht alles ist auf eine sane Weise prüfbar. Denken Sie an Benutzeroberflächen. Denken Sie an einen Fahrer für eine Raumfähre oder eine Atombombe (zumindest nicht mit reinen JUnit-Tests ;) ). Viele und viele Codes können jedoch getestet werden. Datenstrukturen sind. Algorithmen sind. Die meisten Applicationlogic-Klassen sind. Also testen Sie es!

HTH. tetha

Was ist Unittesting? Es ist schwierig zu definieren. Auf technischer Ebene erstellen Sie Funktionen, die Funktionen in Ihrer Codebasis aufrufen, und überprüfen die Ergebnisse. Grundsätzlich erhalten Sie eine Reihe von Dingen wie "assert(5+3) == 8", nur komplizierter (wie in DataLayer(MockDatabase()).getUser().name == "Dilbert").

Ich finde den einfachsten Weg, um es zu veranschaulichen ist, um einige Code zu betrachten. Diese Erste -Seite auf der NUnit-Website ist eine gute Einführung in das Was und wie

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

Ist alles testbar? In der Regel, wenn es etwas berechnet dann ja. UI-Code ist ein ganz anderes Problem zu behandeln, aber, da die Simulation von Benutzern, die auf Schaltflächen klicken ist schwierig.

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

Auf dem "How to do it" Teil:

Ich denke, die Einführung in ScalaTest does good job of illustrating different styles of unit tests. tut gute Arbeit, um verschiedene Arten von Komponententests zu veranschaulichen.

Auf dem "Wann es zu tun" Teil:

Komponententest ist nicht nur zum Testen. Durch Komponententests erzwingen Sie auch das Design der Software in etwas, das komponententestbar ist. Viele Menschen sind der Meinung, dass dieses Design zum größten Teil Good Design(TM) ist, unabhängig von anderen Vorteilen von Tests.

Ein Grund für einen Komponententest besteht also darin, Ihr Design in etwas zu zwingen, das hoffentlich einfacher zu behaupten wäre, dass es wäre, wenn Sie es nicht für Komponententests entworfen hätten.

Was...

Eine Methode zum automatischen Testen von Code gegen eine Testbatterie, die entwickelt wurde, um die gewünschten Ergebnisse zu erzwingen und Änderungen zu verwalten.

Eine "Einheit" in diesem Sinne ist die kleinste atomare Komponente des Codes, die zum Testen sinnvoll ist, in der Regel eine Methode einer Klasse. Ein Teil dieses Prozesses ist das Erstellen von Stubobjekten (oder "Mocks"), mit denen Sie mit einer Einheit als unabhängiges Objekt arbeiten können.

Wie...

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

Als Prozess ist testgesteuerte Entwicklung (TDD) oft die Motivation für Komponententests (aber Komponententests erfordern keine TDD), was davon ausgeht, dass die Tests Teil der Spezifikationsdefinition sind, und erfordert daher, dass sie zuerst geschrieben werden, wobei Code nur geschrieben wird, um diese Tests zu "lösen".

Wenn...

Fast immer. Sehr kleine Wegwerfprojekte sind es vielleicht nicht wert, aber nur, wenn Sie ziemlich sicher sind, dass sie wirklich weggeworfen werden. Theoretisch ist jedes objektorientierte Programm einheitsprüfbar, aber einige Design-Pattrns machen dies schwierig. Bekanntlich ist das Singleton-Muster problematisch, wo umgekehrt Abhängigkeitsinjektionsrahmen sehr stark auf Komponententests ausgerichtet sind.

Was ist Komponentenprüfung?

Komponententests verifizieren einfach, ob 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 sein wie eine Konsolenausgabe, zu einem " -161-" in einer GUI wie NUnit, or a different language-specific framework. oder einem anderen sprachspezifischen Framework.

Ausführen von Komponententests ist so konzipiert, dass sie einfach sind, in der Regel werden die Tests in Form von Funktionen geschrieben, die bestimmen, ob ein zurückgegebener Wert dem Wert entspricht, den Sie erwartet haben, als Sie die Funktion geschrieben haben (oder der Wert, den Sie erwarten, wenn Sie schließlich schreiben - dies wird "-163- genannt, wenn Sie die Tests zuerst schreiben).

Wie führen Sie Komponententests durch?

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

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

Der Komponententestcode würde etwa 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 haben. Nachdem Sie die Tests erstellt und ausgeführt haben, wissen Sie, dass diese bestimmte Funktion oder Einheit wie erwartet funktioniert.

Stellen Sie sich nun vor, ein anderer Entwickler kommt und ändert die CombineNumbers() function for performance, or some other reason: Funktion für die 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, werden sie sehen, dass das erste Assert fails, and they now know that the build is broken. fehlschlägt, und sie wissen jetzt, dass der Build defekt ist.

Wann sollten Sie Komponententests durchführen?

Sie sollten so oft wie möglich durchgeführt werden. Wenn Sie Tests als Teil des Entwicklungsprozesses durchführen, wird Ihr Code automatisch besser entworfen, als wenn Sie die Funktionen gerade geschrieben und dann weitergefahren haben. Außerdem werden sich Konzepte wie Dependency Injection are going to evolve naturally into your code. auf natürliche Weise zu Ihrem Code entwickeln.

Der offensichtlichste Vorteil ist zu wissen, dass, wenn eine Änderung vorgenommen wird, keine anderen einzelnen Codeeinheiten davon betroffen waren, wenn sie alle die Tests bestehen.