Mit JUnit

JUnit

ist eine standardisierte Rahmen zum Testen Java-Einheiten (dh, Java-Klassen). JUnit die einen Teil der Arbeit aus der Prüfung zu nehmen automatisiert werden.

Stellen Sie sich vor, Sie haben erstellt ein enum Typ mit drei Werten: GRÜN, GELB, und ROT. Listing 1 enthält den Code:

Listing 1

public enum SignalColor {GRÜN, GELB, ROT}

Eine Ampel hat ein Bundesland (Das ist ein ausgefallener Name für die Farbe der Ampel).

public class Traffic {SignalColor state = SignalColor.RED-

Wenn Sie die Ampel aktuellen Zustand kennen, können Sie entscheiden, was der nächste Zustand der Ampel sein wird.

public void nextstate () {switch (state) {case ROT: state = SignalColor.GREEN-break-Fall GELB: state = SignalColor.RED-break-Fall GREEN: state = SignalColor.YELLOW-break-Standard: state = SignalColor. RED-Break-}}

Sie können auch der Staat eine bestimmte Anzahl von Zeiten der Ampel zu ändern:

public void Änderung (numberOfTimes int) {for (int i = 0-i lt; numberOfTimes- i ++) {nextstate () -}}

Dass sie alle zusammen, Sie haben die Ampel Klasse in Listing 2.

Listing 2

public class Traffic {SignalColor state = SignalColor.RED-public void nextstate () {switch (state) {case ROT: state = SignalColor.GREEN-break-Fall GELB: state = SignalColor.RED-break-Fall GREEN: state = SignalColor .yellow-break-Standard: state = SignalColor.RED-break -}} public void Änderung (int numberOfTimes) {for (int i = 0-i lt; numberOfTimes- i ++) {nextstate () -}}}

In den alten Tagen können Sie das Schreiben von Code fortgesetzt haben, mehr Klassen zu schaffen, fordern die nextstate und Veränderung Dann, nach einigen Monaten der Codierverfahren in 2. Listing, würden Sie Ihre Arbeit unterbrechen zu testen.

Und was für eine Überraschung! Ihre Tests würden scheitern kläglich! Sie sollten niemals Tests verzögern für mehr als ein oder zwei Tage. Test früh und Test oft!

Eine Philosophie über das Testen, sagt man jedes Stück Code testen sollten, sobald Sie es geschrieben haben. Natürlich bedeutet der Ausdruck "Teil des Codes" nicht sehr wissenschaftlich klingen. Es wäre nicht tun Entwickler haben herumlaufen reden über die "chunk-of-Code-Prüfung", dass sie an diesem Nachmittag taten. Es ist besser, jedes Stück Code ein zu nennen Einheit, und erhalten Entwickler darüber zu sprechen, Unit-Tests.

Die häufigste Gerät zum Testen ist eine Klasse. So eine typische Java-Entwickler testet jede Klasse, sobald der Code der Klasse geschrieben wird.

Wie gehen Sie über eine Klasse zu testen? Ein Anfänger könnte testen, die Ampel Klasse durch eine zusätzliche Klasse zu schreiben - eine Klasse enthält ein Main Verfahren. Das Main Methode erstellt eine Instanz Ampel, fordert die nextstate und Veränderung Verfahren, und zeigt die Ergebnisse. Der Anfänger untersucht die Ergebnisse und vergleicht sie mit einigen erwarteten Werten.

Nach dem Schreiben Main Methoden für Dutzende, Hunderte oder sogar Tausende Klassen wird der Anfänger (jetzt ein vollwertiges Entwickler) der Prüfroutine müde und sucht nach Möglichkeiten, um die Testverfahren zu automatisieren. Müde oder nicht, könnte ein Entwickler versuchen, anderen Entwicklers Hand codierte Tests zu entziffern. Ohne irgendwelche Normen oder Richtlinien für den Bau von Tests mit, dem Lesen und Verstehen Tests anderen Entwicklers kann schwierig und langwierig sein.

So kommt JUnit zur Rettung !.

Um herauszufinden, wie Sie Eclipse die Verwendung von JUnit automatisiert, gehen Sie wie folgt vor:

  1. Erstellen Sie ein Eclipse-Projekt enthält Listings 1 und 2.

    bild0.jpg
  2. In Windows mit der rechten, klicken Sie auf den TrafficLight.java Zweig des Paket-Explorer. Auf einem Mac Steuer Sie auf den TrafficLight.java Zweig des Paket-Explorer.

    Ein Kontextmenü erscheint.

  3. Im Kontextmenü wählen Sie Neu-JUnit-Testfall.

    Als Ergebnis erscheint das neue JUnit-Testfall-Dialogfeld.

    image1.jpg
  4. Klicken Sie auf Weiter auf der Unterseite des neuen JUnit-Testfall-Dialogfeld.

    Als Ergebnis sehen Sie die zweite Seite des Dialogfelds New JUnit-Testfall. Die zweite Seite listet Methoden gehören, (direkt oder indirekt) an den Ampel Klasse.

    image2.jpg
  5. Setzen Sie ein Häkchen in das Kontrollkästchen Ampel.

    Als Ergebnis stellt Eklipse Häkchen in der nextstate () und Veränderung (int) Kontrollkästchen.

  6. Klicken Sie auf Fertig am unteren Rand des neuen JUnit-Testfall-Dialogfeld.

    JUnit ist formal nicht Teil von Java. Stattdessen kommt mit seinen eigenen Satz von Klassen und Methoden, um Ihnen Tests für Ihren Code erstellen. Nachdem Sie auf Fertig stellen klicken Eclipse fragt Sie, ob Sie die JUnit-Klassen und Methoden im Rahmen des Projekts enthalten sein sollen.

    image3.jpg
  7. Wählen Führen Sie die folgende Aktion und JUnit 4-Bibliothek zum Build Path hinzufügen. Dann klicken Sie auf OK.

    Eclipse-schließt die Dialogfelder und Ihr Projekt hat ein brandneues TrafficLightTest.java Datei. Der Code der Datei in Listing 3 dargestellt.

    Der Code in Listing 3 enthält zwei Tests, und beide Tests enthalten Anrufe zu einem unangenehmen klingender fehlschlagen Verfahren. Eclipse-möchte, dass Ihr Code hinzufügen, um diese Tests übergehen zu lassen.

  8. Entfernen Sie die Anrufe an die fail-Methode. Anstelle der Methodenaufrufe scheitern, geben Sie den fett dargestellt Code in Listing 4.

  9. Im Package Explorer mit der rechten, klicken Sie auf (unter Windows) oder Strg-Taste (Mac) das TrafficLightTest.java Zweig. Im resultierenden Kontextmenü wählen Sie Run As-JUnit-Test.

    Eclipse-könnte mehr als eine Art von JUnit Test-Framework haben im Ärmel. Wenn ja, könnten Sie unten, um ein Dialogfeld wie das zu sehen. Wenn Sie das tun, wählen Sie den Eclipse JUnit Launcher, und dann auf OK klicken.

    image4.jpg

    Als Ergebnis läuft Eklipse Ihre TrafficLightTest.java Programm. Eclipse-zeigt das Ergebnis des Laufs vor seinem eigenen Paket-Explorer. Das Ergebnis zeigt keine Fehler und keine Ausfälle. Puh!

    image5.jpg

Listing 3

import static org.junit.Assert. * - Import org.junit.Test-public class TrafficLightTest {@Testpublic Leere testNextState () {scheitern ( "Noch nicht implementiert") -} @ Testpublic Leere testChange () {scheitern ( "Noch nicht umgesetzt ") -}}

Listing 4

import static org.junit.Assert. * - Import org.junit.Test-public class TrafficLightTest {@Testpublic Leere testNextState () {Traffic Licht = new Trafficlight () -assertEquals (SignalColor.RED, light.state) -light.nextState () -assertEquals (SignalColor.GREEN, light.state) -light.nextState () -assertEquals (SignalColor.YELLOW, light.state) -light.nextState () -assertEquals (SignalColor.RED, light.state) -} @Testpublic Ungültig testChange () {Traffic Licht = new Trafficlight () -light.change (5) - assertEquals (SignalColor.YELLOW, light.state) -}}

Wenn Sie As-JUnit-Test wählen Sie Ausführen von Eclipse sucht nicht nach einem Hauptverfahren. Stattdessen sieht Eclipse Methoden, beginnend mit @Test und andere solche Dinge. Eclipse führt jede der @Test Methoden.

Dinge wie @Test Java sind Anmerkungen.

Listing 4 enthält zwei @Test Methoden: testNextState und testChange. Das testNextState Verfahren setzt die Ampel nextstate Verfahren zum Test. Auch der testChange Verfahren biegt sich die Ampel Veränderung Verfahren Muskeln.

Betrachten Sie den Code in das testNextState Verfahren. Das testNextState Verfahren wiederholt ruft die Ampel Klasse nextstate Verfahren und JUnit assertEquals Verfahren. Das assertEquals Methode hat zwei Parameter: einen Erwartungswert und einen Istwert.

  • In der obersten assertEquals nennen, der erwartete Wert SignalColor.RED. Sie erwarten, dass die Ampel zu sein ROT weil in Listing 2, initialisieren Sie das Licht des Bundesland mit dem Wert SignalColor.RED.

  • In der obersten assertEquals nennen, der Istwert light.state (Die Farbe, die in der Ampel die tatsächlich gespeichert ist Bundesland Variable).

Wenn der Ist-Wert entspricht dem erwarteten Wert, um den Anruf zu assertEquals gibt und JUnit weiterhin die Aussagen in der Ausführung testNextState Verfahren.

Aber wenn der Ist-Wert unterscheidet sich von dem erwarteten Wert, desto assertEquals schlägt fehl, und das Ergebnis des Versuchs zeigt das Scheitern. Betrachten Sie zum Beispiel, was passiert, wenn man den Erwartungswert in der ersten ändern assertEquals rufen Sie in Listing 4:

@Testpublic Leere testNextState () {Traffic Licht = new Trafficlight () - assertEquals (SignalColor.YELLOW, light.state) -

Unmittelbar nach seiner Konstruktion, die Farbe eines Ampel ROT, nicht GELB. so ist die testNextState Verfahren enthält eine falsche Behauptung und das Ergebnis der As-JUnit Run Tun sieht aus wie ein Kinder schlechten Bericht Karte.

image6.jpg

Nachdem testNextState Vor testChange in Listing 4 übernimmt keine Garantie dass JUnit ausführen wird testNextState vor der Ausführung testChange. Wenn Sie drei haben @Test Verfahren JUnit könnten sie vom obersten zum untersten Ausführen von zuunterst, von der Mitte Verfahren zur obersten zur untersten oder in beliebiger Reihenfolge überhaupt obersten. JUnit könnte in der Mitte einer Test Pause sogar Teile eines anderen Test auszuführen. Aus diesem Grund sollte man sich nie Annahmen über das Ergebnis eines Tests, wenn Sie einen weiteren Test zu schreiben.

Vielleicht möchten Sie bestimmte Anweisungen ausgeführt werden, bevor irgendwelche Tests beginnen. Wenn Sie das tun, stellen diese Aussagen in einem Verfahren namens Konfiguration, und Vorwort diese Methode mit einem @Vor Anmerkung. (Siehe Konfiguration() Checkbox in der Abbildung in Schritt 3 in Listing 2, siehe oben.)

Hier ist eine Nachricht: Nicht alle assertEquals Methoden sind gleich! Stellen Sie sich eine Zugabe Treiber Klasse Code Ihres Projekts. "Driver Klasse" bedeutet nicht, einen Druckertreiber oder eine Ramme. Es bedeutet eine Person, die ein Auto fahren - ein Auto, das Ihre Ampel ist nähern. Für die Details siehe Listing 5.

Listing 5

public class Treiber {public double Geschwindigkeit (Traffic Licht) {switch (light.state) {case RED: return 0.0-Fall GELB: Rückkehr 10.0-Fall GREEN: return 30,0-default: return 0.0-}}}

Wenn das Licht rot ist, ist der Fahrer Geschwindigkeit 0.0. Wenn das Licht gelb ist, wird das Fahrzeug in einen sicheren 10,0 verlangsamt. Wenn das Licht grün ist, die Autofahrten mit einer Geschwindigkeit von 30,0.

(In diesem Beispiel sind die Einheiten der Geschwindigkeit keine Rolle spielen. Sie konnten Meilen pro Stunde, Kilometer pro Stunde, oder was auch immer. Der einzige Weg, es zählt, ist, wenn das Auto in Boston oder New York City ist. In diesem Fall wird die Geschwindigkeit für GELB sollte viel höher als die Geschwindigkeit sein, GRÜN, und die Geschwindigkeit für ROT sollte nicht 0,0 sein.)

So erstellen JUnit-Tests für die Treiber Klasse, führen Sie die Schritte 1 bis 9 in diesem Artikel genannten zuvor, aber sicher sein, die folgenden Änderungen vornehmen:

  • In Schritt 2, rechts, klicken oder Control-Klick die Driver.java Zweig statt der TrafficLight.java Ast.

  • In Schritt 5 ein Häkchen in der Treiber-Zweig setzen.

  • In Schritt 8, entfernen Sie die fehlschlagen Methode ruft das zu schaffen DriverTest Klasse in Listing 6 gezeigt (Der Code, den Sie eingeben ist fett dargestellt.)

Listing 6

import static org.junit.Assert. * - Import org.junit.Test-public class DriverTest {@Testpublic Leere testVelocity () {Traffic Licht = new Trafficlight () -light.change (7) -Treiber Treiber = neue Treiber () -assertEquals (30.0, driver.velocity (Licht), 0,1) - }}

Wenn alles gut geht, geht die JUnit-Test mit Bravour bestanden. (Um genauer zu sein, geht die JUnit mit der Farbe grün!) Also das Laufen von DriverTest nicht neu oder aufregend ist. Was spannend ist der Aufruf assertEquals in Listing 6.

Wenn Sie vergleichen zwei doppelt Werte in einem Java-Programm, haben Sie kein Recht auf-der-Nase Gleichheit zu erwarten. Das heißt, eine der doppelt Werte könnten 30,000000000 während der andere sein doppelt Wert ist näher an 30,000000001. Ein Computer hat nur jeweils 64 Bit zu speichern doppelt Wert und Ungenauigkeiten einschleichen hier und da in. So in JUnit, die assertEquals Verfahren zum Vergleichen von doppelt Werte einen dritten Parameter. Der dritte Parameter stellt Spielraum.

In Listing 6, die Aussage

assertEquals (30.0, driver.velocity (Licht), 0,1) -

sagt der folgende: "Behaupten, dass der tatsächliche Wert von driver.velocity (Licht) ist innerhalb von 0,1 von dem erwarteten Wert 30,0. Wenn ja, geht die Behauptung. Wenn nicht, schlägt die Behauptung. "

Wenn Sie anrufen assertEquals für doppelt Werte, kann eine gute Fehlermarge Auswahl schwierig sein. Diese Zahlen veranschaulichen die Art von Dingen, die schief gehen können.

image7.jpg

Hier werden Ihre Fehlerquote ist zu klein.

image8.jpg

Es ist Ihre Fehlerspanne zu groß.

Zum Glück, in dieser DriverTest beispielsweise die Marge 0,1 ist eine sehr sichere Wette. Hier ist der Grund:

  • Wenn der assertEquals Test ausfällt, schaltet es durch viel mehr als 0,1.

    Failure bedeutet eine mit driver.velocity (Licht) Wert wie 0,0 oder 10,0.

    bild9.jpg
  • In diesem Beispiel, wenn der assertEquals Test bestanden wird, stellt es wahrscheinlich vollständig, on-the-Nase Gleichheit.

    Der Wert von driver.velocity (Licht) kommt direkt aus der Rückkehr 30.0 Code in Listing 5. Keine Arithmetik beteiligt ist. So dass der Wert von driver.velocity (Licht) und die erwartete 30.0 Wert sollte genau das gleiche (oder fast genau das gleiche) sein.

Menü