Inhaltsverzeichnis:
- Listing 1
- Listing 2
- Listing 3
- Listing 4
- Listing 5
- statische org importieren. Junit. Behaupten. *; Importorg. Junit. Prüfung; öffentliche Klasse DriverTest {@Test public void testVelocity () {
Video: JAVA Leistungskurs #3 - Testen mit JUnit [Tutorial] 2024
JUnit ist ein standardisiertes Framework zum Testen von Java-Einheiten (dh Java-Klassen). JUnit kann automatisiert werden, um einige Tests zu vermeiden.
Stellen Sie sich vor, Sie haben einen Aufzählungstyp mit drei Werten erstellt: GRÜN, GELB und ROT. Listing 1 enthält den Code:
Listing 1
public enum Signalfarbe {GRÜN, GELB, ROT}
Eine Ampel hat einen Zustand (ein ausgefallener Name für die Farbe der Ampel).
öffentliche Klasse TrafficLight {Signalfarbe Zustand = Signalfarbe. ROT;
Wenn Sie den aktuellen Status der Ampel kennen, können Sie entscheiden, welcher der nächste Status der Ampel sein wird.
public void nextState () {Schalter (Zustand) {Fall ROT: Zustand = Signalfarbe. GRÜN; Unterbrechung; Fall GELB: Zustand = Signalfarbe. ROT; Unterbrechung; Fall GRÜN: Zustand = Signalfarbe. GELB; Unterbrechung; Standard: state = Signalfarbe. ROT; break;}}
Sie können den Status der Ampel auch mehrmals ändern:
public void change (int numberOfTimes) {für (int i = 0; iAlles zusammengefügt, hast du die TrafficLight-Klasse in Listing 2.
Listing 2
öffentliche Klasse TrafficLight {SignalColor state = SignalColor. ROT; public void nextState () {Schalter (Zustand) {Fall ROT: Zustand = Signalfarbe. GRÜN; Unterbrechung; Fall GELB: Zustand = Signalfarbe. ROT; Unterbrechung; Fall GRÜN: Zustand = Signalfarbe. GELB; Unterbrechung; Standard: state = Signalfarbe. ROT; break;}} public void änderung (int numberOfTimes) {für (int i = 0; iFrüher haben Sie möglicherweise Code geschrieben und weitere Klassen erstellt, rufen Sie den nextState auf und ändern Sie die Methoden in Listing 2. Dann, nach einigen Monaten der Programmierung, würden Sie eine Pause einlegen, um Ihre Arbeit zu testen.
Und was für eine Überraschung! Ihre Tests würden kläglich scheitern! Sie sollten das Testen nie länger als ein oder zwei Tage hinauszögern. Testen Sie früh und testen Sie oft!
Eine Philosophie zum Testen besagt, dass Sie jeden Codeblock testen sollten, sobald Sie ihn geschrieben haben. Natürlich klingt der Ausdruck "Stück Code" nicht sehr wissenschaftlich. Es würde nicht helfen, wenn Entwickler herumlaufen und über die "Brocken von Code-Tests" sprechen, die sie heute Nachmittag gemacht haben. Es ist besser, jeden Code-Block als -Einheit zu bezeichnen und Entwickler dazu zu bringen, über Unit-Tests zu sprechen.
Die am häufigsten verwendete Testeinheit ist eine Klasse. Daher testet ein typischer Java-Entwickler jede Klasse, sobald der Code der Klasse geschrieben ist.
Wie geht es Ihnen beim Testen einer Klasse? Ein Anfänger könnte die TrafficLight-Klasse testen, indem er eine zusätzliche Klasse schreibt - eine Klasse, die eine Hauptmethode enthält. Die Hauptmethode erstellt eine Instanz von TrafficLight, ruft nextState auf und ändert Methoden und zeigt die Ergebnisse an.Der Anfänger untersucht die Ergebnisse und vergleicht sie mit einigen erwarteten Werten.
Nach dem Schreiben der Hauptmethoden für Dutzende, Hunderte oder sogar Tausende von Klassen, wird der Anfänger (jetzt ein vollwertiger Entwickler) der Testroutine überdrüssig und sucht nach Wegen, um das Testverfahren zu automatisieren. Müde oder nicht, ein Entwickler könnte versuchen, die handkodierten Tests eines anderen Entwicklers zu entschlüsseln. Ohne irgendwelche Standards oder Richtlinien für die Konstruktion von Tests zu haben, kann das Lesen und Verstehen der Tests anderer Entwickler schwierig und mühsam sein.
So kommt JUnit zur Rettung!..
Um herauszufinden, wie Eclipse die Verwendung von JUnit automatisiert, gehen Sie wie folgt vor:
Erstellen Sie ein Eclipse-Projekt mit den Listen 1 und 2.
Klicken Sie in Windows mit der rechten Maustaste auf die TrafficLight des Paket-Explorers. Java Zweig. Auf einem Mac klicken Sie bei gedrückter Taste "ctrl" auf die TrafficLight des Paket-Explorers. Java Zweig.
Ein Kontextmenü wird angezeigt.
Wählen Sie im Kontextmenü Neu → JUnit Testfall.
Daraufhin wird das Dialogfeld New JUnit Test Case angezeigt.
Klicken Sie unten im Dialogfeld "Neuer JUnit-Testfall" auf "Weiter".
Daraufhin wird die zweite Seite des Dialogfelds New JUnit Test Case angezeigt. Die zweite Seite listet Methoden auf, die (direkt oder indirekt) zur TrafficLight-Klasse gehören.
Setzen Sie ein Häkchen in die Checkbox "Ampel".
Infolgedessen platziert Eclipse Häkchen in den Kontrollkästchen nextState () und change (int) .
Klicken Sie unten im Dialogfeld "New JUnit Test Case" auf Fertig stellen.
JUnit gehört formal nicht zu Java. Stattdessen gibt es eigene Klassen und Methoden, mit denen Sie Tests für Ihren Code erstellen können. Nachdem Sie auf Fertig stellen geklickt haben, werden Sie von Eclipse gefragt, ob Sie die JUnit-Klassen und -Methoden als Teil Ihres Projekts einfügen möchten.
Wählen Sie die folgende Aktion aus, und fügen Sie die JUnit 4-Bibliothek zum Erstellungspfad hinzu. Klicken Sie dann auf OK.
Eclipse schließt die Dialogfelder und Ihr Projekt hat einen brandneuen TrafficLightTest. Java-Datei. Der Code der Datei wird in Listing 3 angezeigt.
Der Code in Listing 3 enthält zwei Tests, und beide Tests enthalten Aufrufe einer unangenehm klingenden Fail-Methode. Eclipse möchte, dass Sie Code hinzufügen, damit diese Tests bestanden werden.
Entfernen Sie die Aufrufe der Fail-Methode. Anstelle der Aufrufe der fehlgeschlagenen Methode geben Sie den in Listing 4 fett gedruckten Code ein.
Klicken Sie im Paket-Explorer mit der rechten Maustaste (unter Windows) bzw. bei gedrückter Ctrl-Taste (auf einem Mac) auf den TrafficLightTest. Java Zweig. Wählen Sie im angezeigten Kontextmenü Ausführen als → JUnit-Test.
Eclipse könnte mehr als eine Art von JUnit-Test-Framework auf Lager haben. Wenn dies der Fall ist, wird möglicherweise ein Dialogfeld wie das folgende angezeigt. Wenn Sie dies tun, wählen Sie den Eclipse JUnit Launcher aus und klicken Sie dann auf OK.
Infolgedessen führt Eclipse Ihren TrafficLightTest aus. Java-Programm. Eclipse zeigt das Ergebnis des Laufs vor seinem eigenen Paket-Explorer an. Das Ergebnis zeigt keine Fehler und keine Fehler. Wütend!
Listing 3
statische Organisation importieren. Junit. Behaupten. *; Importorg. Junit. Prüfung; öffentliche Klasse TrafficLightTest {@Test public void testNextState () {fehlgeschlagen ("Noch nicht implementiert");} @Test public void testChange () {fail ("Noch nicht implementiert");}}Listing 4
import statische org.Junit. Behaupten. *; Importorg. Junit. Prüfung; öffentliche Klasse TrafficLightTest {@Test public void testNextState () { TrafficLight light = new TrafficLight (); assertEquals (Signalfarbe. ROT, Lichtzustand); Licht. nextState (); assertEquals (Signalfarbe. GRÜN, Lichtzustand); Licht. nextState (); assertEquals (Signalfarbe. GELB, Lichtzustand); Licht. nextState (); assertEquals (Signalfarbe. ROT, Lichtzustand); } @Test public void testChange () { TrafficLight light = neues TrafficLight (); Licht. Änderung (5); assertEquals (Signalfarbe. GELB, Lichtzustand); }}Wenn Sie Run As → JUnit Test auswählen, sucht Eclipse nicht nach einer Hauptmethode. Stattdessen sucht Eclipse nach Methoden, die mit @Test und anderen solchen Dingen beginnen. Eclipse führt jede der @Test-Methoden aus.
Dinge wie @Test sind Java Annotationen .
Listing 4 enthält zwei @Test-Methoden: testNextState und testChange. Die testNextState-Methode testet die Methode "TrafficLight nextState". In ähnlicher Weise werden die Muskeln der TrafficLight-Änderungsmethode durch die testChange-Methode gewölbt.
Betrachten Sie den Code in der testNextState-Methode. Die testNextState-Methode ruft wiederholt die nextState-Methode der TrafficLight-Klasse und die assertEquals-Methode von JUnit auf. Die assertEquals-Methode verwendet zwei Parameter: einen erwarteten Wert und einen tatsächlichen Wert.
Im obersten AssertEquals-Aufruf ist der erwartete Wert SignalColor. ROT. Sie erwarten, dass die Ampel ROT ist, weil Sie in Listing 2 den Status des Lichts mit dem Wert SignalColor initialisieren. ROT.
Im obersten AssertEquals-Aufruf ist der tatsächliche Wert hell. state (die Farbe, die tatsächlich in der Statusvariablen der Ampel gespeichert ist).
Wenn der tatsächliche Wert dem erwarteten Wert entspricht, wird der Aufruf von assertEquals übergeben und JUnit setzt die Ausführung der Anweisungen in der testNextState-Methode fort.
Wenn der tatsächliche Wert jedoch vom erwarteten Wert abweicht, schlägt assertEquals fehl und das Ergebnis des Laufs zeigt den Fehler an. Betrachten Sie zum Beispiel, was passiert, wenn Sie den erwarteten Wert im ersten Aufruf von assertEquals in Listing 4 ändern:
@Test public void testNextState () {TrafficLight light = new TrafficLight (); assertEquals (Signalfarbe. GELB, Lichtzustand);Unmittelbar nach ihrer Konstruktion ist die Farbe einer Ampel ROT, nicht GELB. Die testNextState-Methode enthält also eine falsche Assertion und das Ergebnis von Run As → JUnit sieht aus wie die schlechte Report-Karte eines Kindes.
Die Tatsache, dass testNextState vor testChange in Listing 4 steht, garantiert nicht , dass JUnit testNextState vor der Ausführung von testChange ausführen wird. Wenn Sie über drei @Test-Methoden verfügen, führt JUnit sie möglicherweise von oben nach unten, von unten nach oben, von der mittleren zur obersten zur untersten Methode oder in beliebiger Reihenfolge aus. JUnit könnte sogar mitten in einem Test anhalten, um Teile eines anderen Tests auszuführen. Deshalb sollten Sie niemals Annahmen über das Ergebnis eines Tests machen, wenn Sie einen anderen Test schreiben.
Möglicherweise möchten Sie bestimmte Anweisungen ausführen, bevor einer der Tests beginnt.Wenn Sie dies tun, setzen Sie diese Anweisungen in eine Methode mit dem Namen setUp, und führen Sie diese Methode mit einer Annotation @Before vor. (Siehe das setUp () Kontrollkästchen in der Abbildung bei Schritt 3 in Listing 2, oben.)
Hier sind die Neuigkeiten: Nicht alle assertEquals Methoden sind gleich! Stellen Sie sich vor, Sie fügen dem Code Ihres Projekts eine Treiberklasse hinzu. "Treiberklasse" bedeutet nicht einen Druckertreiber oder einen Rammtreiber. Es bedeutet eine Person, die ein Auto fährt - ein Auto, das sich Ihrer Ampel nähert. Für Details siehe Listing 5.
Listing 5
public class Treiber {öffentliche Doppelgeschwindigkeit (TrafficLight light) {switch (Lichtzustand) {case RED: return 0. 0; Fall GELB: Rückkehr 10. 0; GRÜN: Rückkehr 30. 0; Standard: Rückgabe 0. 0;}}}Wenn das Licht rot ist, ist die Geschwindigkeit des Fahrers 0. 0. Wenn das Licht gelb ist, verlangsamt sich das Auto zu einem sicheren 10. 0. Wenn das Licht grün ist, das Auto fährt mit einer Geschwindigkeit von 30. 0.
(In diesem Beispiel spielen die Geschwindigkeitseinheiten keine Rolle. Sie könnten Meilen pro Stunde, Kilometer pro Stunde oder was auch immer sein. Der einzige Weg, den es Auto ist in Boston oder New York City, in diesem Fall sollte die Geschwindigkeit für GELB viel höher sein als die Geschwindigkeit für GRÜN, und die Geschwindigkeit für ROT sollte nicht 0 sein. Treiberklasse, befolgen Sie die Schritte 1 bis 9, die zuvor in diesem Artikel aufgeführt sind, aber stellen Sie sicher, dass Sie die folgenden Änderungen vornehmen:
Klicken Sie in Schritt 2 mit der rechten Maustaste oder mit gedrückter ctrl-Taste auf den Treiber. Java-Zweig anstelle der TrafficLight. Java Zweig.
Setzen Sie in Schritt 5 ein Häkchen in den Treiberzweig.
Entfernen Sie in Schritt 8 die Fail-Methodenaufrufe, um die in Listing 6 gezeigte DriverTest-Klasse zu erstellen. (Der von Ihnen eingegebene Code wird fett angezeigt.)
Listing 6
statische org importieren. Junit. Behaupten. *; Importorg. Junit. Prüfung; öffentliche Klasse DriverTest {@Test public void testVelocity () {
TrafficLight light = neues TrafficLight (); Licht. Änderung (7); Treiber Treiber = neuer Treiber (); assertEquals (30.0, Treibergeschwindigkeit (light), 0. 1); }} Wenn alles gut geht, ist der JUnit-Test mit Bravour bestanden. (Um genau zu sein, der JUnit passt mit der Farbe Grün!) Das Laufen von DriverTest ist also nicht neu oder aufregend. Was aufregend ist, ist der Aufruf von AssertEquals in Listing 6.Wenn Sie zwei Doppelwerte in einem Java-Programm vergleichen, haben Sie kein Recht, Gleichberechtigung zu erwarten. Das heißt, einer der Doppelwerte könnte 30. 000000000 sein, während der andere Doppelwert näher an 30 liegt. 000000001. Ein Computer hat nur 64 Bits, um jeden Doppelwert zu speichern, und Ungenauigkeiten schleichen sich hier und da ein. In JUnit hat also die assertEquals-Methode zum Vergleichen von Doppelwerten einen dritten Parameter. Der dritte Parameter repräsentiert den Spielraum.
In Listing 6 behauptet die Anweisung
assertEquals (30.0, Treibergeschwindigkeit (light), 0. 1);
sagt folgendes: "Bestätigen Sie den tatsächlichen Wert des Treibers. Geschwindigkeit (Licht) liegt innerhalb von 0,1 des erwarteten Werts 30. 0 Wenn ja, geht die Aussage über. Wenn nicht, schlägt die Assertion fehl. "Wenn Sie assertEquals für doppelte Werte aufrufen, kann die Auswahl einer guten Fehlertoleranz schwierig sein.Diese Zahlen veranschaulichen die Dinge, die schief gehen können.
Hier ist Ihre Fehlerquote zu klein.
Dort ist Ihre Fehlerquote zu groß.
Glücklicherweise ist in diesem DriverTest-Beispiel der Spielraum 0. 1 eine sehr sichere Wette. Hier ist der Grund:
Wenn der assertEquals-Test fehlschlägt, schlägt er um mehr als 0 fehl. 1.
Fehler bedeutet, einen Treiber zu haben. Geschwindigkeit (Licht) -Wert wie 0 oder 10. 0.
Wenn in diesem Beispiel der assertEquals-Test bestanden wird, repräsentiert er wahrscheinlich eine vollständige "on-the-nose" -Gleichheit.
Der Wert des Treibers. Geschwindigkeit (Licht) kommt direkt von der Rückkehr 30. 0 Code in Listing 5. Keine Arithmetik ist beteiligt. Also der Wert des Fahrers. Geschwindigkeit (Licht) und der erwartete 30. 0-Wert sollte genau derselbe sein (oder fast genau derselbe).