Inhoudsopgave:
- Listing 1
- Listing 2
- import statische org.junit. Doen gelden. *; import org. junit. Test; public class TrafficLightTest {@Test public void testNextState () {
- assertEquals (SignalColor, RODE, lichte toestand);
- (in dit voorbeeld, de eenheden van snelheid doen er niet toe.) Ze kunnen worden mijl per uur, kilometers per uur, of wat dan ook. De enige manier waarop het van belang is als de auto is in Boston of New York City. In dat geval moet de snelheid voor GEEL veel hoger zijn dan de snelheid voor GROEN, en de snelheid voor ROOD mag niet 0. 0 zijn.)
- licht. change (7);
Video: Java - JUnit testing in Eclipse 2024
JUnit is een gestandaardiseerd raamwerk voor het testen van Java-eenheden (dat wil zeggen, Java-klassen). JUnit kan worden geautomatiseerd om een deel van het werk uit de test te halen.
Stel u voor dat u een enum-type hebt gemaakt met drie waarden: GROEN, GEEL en ROOD. Listing 1 bevat de code:
Listing 1
public enum SignalColor {GREEN, YELLOW, RED}
Een verkeerslicht heeft een status (wat een mooie naam is voor de kleur van het verkeerslicht).
Verkeerslicht in openbare klasse {SignalColor state = SignalColor. ROOD;
Als u de huidige staat van het verkeerslicht kent, kunt u beslissen wat de volgende status van het verkeerslicht zal zijn.
public void nextState () {switch (state) {case RED: state = SignalColor. GROEN; breken; geval GEEL: state = SignalColor. ROOD; breken; case GREEN: state = SignalColor. GEEL; breken; standaard: state = SignalColor. ROOD; break;}}
U kunt de status van het verkeerslicht ook een aantal keren wijzigen:
openbare ongeldige wijziging (int numberOfTimes) {for (int i = 0; iAlles bij elkaar opgeteld, hebt u de TrafficLight-klasse in Listing 2.
Listing 2
public class TrafficLight {SignalColor state = SignalColor. ROOD; public void nextState () {switch (state) {case RED: state = SignalColor. GROEN; breken; geval GEEL: state = SignalColor. ROOD; breken; case GREEN: state = SignalColor. GEEL; breken; standaard: state = SignalColor. ROOD; break;}} openbare ongeldige wijziging (int numberOfTimes) {for (int i = 0; iIn de oudheid bent u misschien doorgegaan met het schrijven van code, het maken van meer klassen, de volgende status aanroepen en de methoden in listing 2 wijzigen. Daarna, na enkele maanden coderen, zou u pauzeren om uw werk te testen.
En wat een verrassing! Uw tests zouden jammerlijk mislukken! U moet het testen nooit langer dan een dag of twee uitstellen. Test vroeg en test vaak!
Eén filosofie over testen zegt dat je elk stuk code moet testen zodra je het hebt geschreven. Natuurlijk klinkt de zin "stuk code" niet erg wetenschappelijk. Het zou niet nodig zijn als ontwikkelaars rondliepen om te praten over de 'stukjes code testen' die ze vanmiddag hebben gedaan. Het is beter om elk stuk code een -eenheid te noemen, en ontwikkelaars te laten praten over unit testing .
De meest gebruikte testeenheid is een klasse. Dus een typische Java-ontwikkelaar test elke klasse zodra de code van de klasse is geschreven.
Dus hoe ga je over het testen van een klas? Een beginneling kan de klasse TrafficLight testen door een extra klasse te schrijven - een klasse met een hoofdmethode. De hoofdmethode maakt een instantie van TrafficLight, roept de nextState aan en wijzigt methoden en geeft de resultaten weer.De beginneling onderzoekt de resultaten en vergelijkt deze met enkele verwachte waarden.
Nadat de belangrijkste methoden voor tientallen, honderden of zelfs duizenden klassen zijn geschreven, raakt de beginner (nu een volwaardige ontwikkelaar) de testroutine beu en zoekt hij naar manieren om de testprocedure te automatiseren. Moe of niet, een ontwikkelaar kan proberen de handgecodeerde tests van een andere ontwikkelaar te ontcijferen. Zonder normen of richtlijnen te hebben voor het samenstellen van tests, kan het lezen en begrijpen van de tests van een andere ontwikkelaar moeilijk en vervelend zijn.
Dus JUnit komt te hulp!.
Ga als volgt te werk om te achterhalen hoe Eclipse het gebruik van JUnit automatiseert:
Maak een Eclipse-project met vermeldingen 1 en 2.
Klik in Windows met de rechtermuisknop op het TrafficLight van de Package Explorer. java branch. Op een Mac, control-klik op TrafficLight van de Package Explorer. java branch.
Er verschijnt een contextmenu.
Selecteer in het contextmenu de optie Nieuw → JUnit-testcase. Als gevolg hiervan wordt het dialoogvenster Nieuwe JUnit-testcase weergegeven.
Klik op Volgende onderaan het dialoogvenster Nieuwe JUnit-testcase.
Als gevolg hiervan ziet u de tweede pagina van het dialoogvenster Nieuwe JUnit-testcase. De tweede pagina bevat methoden die (direct of indirect) toebehoren aan de klasse TrafficLight.
Plaats een vinkje in het selectievakje met het label Verkeerslicht. Als resultaat plaatst Eclipse vinkjes in de selectievakjes
nextState ()
en wijzigen (int) . Klik op Voltooien aan de onderkant van het dialoogvenster Nieuwe JUnit-testcase. JUnit is geen formeel onderdeel van Java. In plaats daarvan wordt een eigen set klassen en methoden geleverd om u te helpen bij het maken van tests voor uw code. Nadat u op Voltooien hebt geklikt, vraagt Eclipse u of u de JUnit-klassen en -methoden wilt opnemen als onderdeel van uw project.
Selecteer Voer de volgende actie uit en voeg JUnit 4-bibliotheek toe aan het buildpad. Klik vervolgens op OK.
Eclipse sluit de dialoogvensters en uw project heeft een gloednieuwe TrafficLightTest. java-bestand. De code van het bestand wordt getoond in Listing 3.
De code in Listing 3 bevat twee tests en beide tests bevatten aanroepen van een onaangenaam klinkende fail-methode. Eclipse wil dat je code toevoegt om deze tests te laten slagen.
Verwijder de oproepen naar de fail-methode. In plaats van de mislukte methode-oproepen typt u de vetgedrukte code in listing 4.
Klik in de Package Explorer met de rechtermuisknop (in Windows) of houd Control ingedrukt en klik (op een Mac) op de TrafficLightTest. java branch. Selecteer Run As → JUnit Test in het resulterende contextmenu.
Eclipse heeft mogelijk meer dan één soort JUnit-testraamwerk in petto. Als dit het geval is, ziet u mogelijk een dialoogvenster zoals hieronder. Als dat het geval is, selecteert u de Eclipse JUnit Launcher en klikt u vervolgens op OK. Als resultaat hiervan voert Eclipse uw TrafficLightTest uit. Java-programma. Eclipse geeft het resultaat van de run weer voor zijn eigen Package Explorer. Het resultaat toont geen fouten en geen fouten. Oef!
Listing 3
statische org. Importeren junit. Doen gelden. *; import org. junit. Test; public class TrafficLightTest {@Test public void testNextState () {fail ("Nog niet geïmplementeerd");} @Test public void testChange () {fail ("Nog niet geïmplementeerd");}}
Listing 4
import statische org.junit. Doen gelden. *; import org. junit. Test; public class TrafficLightTest {@Test public void testNextState () {
TrafficLight light = new TrafficLight ();assertEquals (SignalColor, RODE, lichte toestand);
licht. nextState (); assertEquals (SignalColor, GROEN, lichte toestand); licht. nextState (); assertEquals (SignalColor, GEEL, lichte toestand); licht. nextState (); assertEquals (SignalColor, RODE, lichte toestand); } @Test public void testChange () { TrafficLight light = new TrafficLight (); licht. change (5); assertEquals (SignalColor, GEEL, lichte toestand); }} Wanneer u Run As → JUnit Test selecteert, zoekt Eclipse niet naar een hoofdmethode. In plaats daarvan zoekt Eclipse naar methoden die beginnen met @Test en andere dergelijke dingen. Eclipse voert elk van de @ Test-methoden uit. Dingen als @Test zijn Java -annotatiesListing 4 bevat twee @Test-methoden: testNextState en testChange. Met de methode testNextState wordt de methode TrafficLight nextState op de proef gesteld. Op dezelfde manier buigt de testChange-methode de spieren van de TrafficLight-verandermethode. Overweeg de code in de testNextState-methode. De methode testNextState roept herhaaldelijk de nextState-methode van de klasse TrafficLight en de assertEquals-methode van JUnit aan. De assertEquals-methode neemt twee parameters in beslag: een verwachte waarde en een werkelijke waarde. In de bovenste assertEquals-aanroep is de verwachte waarde SignalColor. ROOD. U verwacht dat het verkeerslicht ROOD is, omdat u in Listing 2 de staat van het licht initialiseert met de waarde SignalColor. ROOD.
In de bovenste assertEquals-aanroep is de werkelijke waarde gering. staat (de kleur die feitelijk is opgeslagen in de statusvariabele van het verkeerslicht).
Als de werkelijke waarde gelijk is aan de verwachte waarde, wordt de aanroep om assertEquals door te geven en gaat JUnit verder met het uitvoeren van de instructies in de testNextState-methode.
Maar als de werkelijke waarde afwijkt van de verwachte waarde, mislukken de assertEquals en wordt de fout weergegeven in het resultaat van de run. Overweeg bijvoorbeeld wat er gebeurt als u de verwachte waarde in de eerste assertEquals-aanroep in Listing 4 wijzigt:
@Test openbare-leegte-testNextState () {TrafficLight light = new TrafficLight (); assertEquals (SignalColor, GEEL, lichte toestand);
Direct na de constructie is de kleur van een verkeerslicht ROOD en niet GEEL. De testNextState-methode bevat dus een valse bewering en het resultaat van Run As → JUnit ziet eruit als de slechte rapportkaart van een kind.
TestNextState hebben vóór testWijziging in listing 4
garandeert nietdat JUnit testNextState uitvoert voordat testChange wordt uitgevoerd. Als je drie @Test-methoden hebt, kan JUnit ze van de laagste naar de onderste uitvoeren, van onderste naar bovenste, van de middelste naar de bovenste tot de onderste, of in willekeurige volgorde. JUnit kan zelfs halverwege een test pauzeren om delen van een andere test uit te voeren. Daarom moet u nooit aannames doen over de uitkomst van één test als u nog een test schrijft.
Mogelijk wilt u dat bepaalde instructies worden uitgevoerd voordat een van de tests begint.Als u dat doet, plaatst u deze instructies in een methode met de naam setUp en gebruikt u die methode vooraf met een @Before-annotatie. (Zie het setUp () selectievakje in de afbeelding bij stap 3 in listing 2 hierboven.)
Hier is nieuws: Niet alle assertEquals-methoden zijn hetzelfde! Stel je voor dat je een Driver-klasse toevoegt aan de code van je project. "Stuurprogrammaklasse" betekent niet een printerstuurprogramma of een hei-stuurprogramma. Het betekent een persoon die in een auto rijdt - een auto die je verkeerslicht nadert. Zie Listing 5. Listing 5 public class Driver {public double velocity (TrafficLight light) {switch (light state) {case RED: return 0. 0; geval GEEL: retourneert 10. 0; geval GROEN: terug 30. 0; standaard: retourneer 0. 0;}}}
Als het lampje rood is, is de snelheid van de bestuurder 0. 0. Als het lampje geel is, vertraagt de auto naar een veilige 10. 0. Als het lampje groen is, de auto cruises met een snelheid van 30. 0.
(in dit voorbeeld, de eenheden van snelheid doen er niet toe.) Ze kunnen worden mijl per uur, kilometers per uur, of wat dan ook. De enige manier waarop het van belang is als de auto is in Boston of New York City. In dat geval moet de snelheid voor GEEL veel hoger zijn dan de snelheid voor GROEN, en de snelheid voor ROOD mag niet 0. 0 zijn.)
JUnit-tests maken voor de Stuurprogrammaklasse, volg de stappen 1 t / m 9 die eerder in dit artikel zijn vermeld, maar zorg ervoor dat u de volgende wijzigingen aanbrengt:Klik in stap 2 met de rechtermuisknop of houd Control ingedrukt terwijl u op het stuurprogramma klikt. java branch in plaats van de TrafficLight. java branch.
Plaats in stap 5 een vinkje in de stuurprogrammatak.
Verwijder bij Stap 8 de aanroepwijzigingen voor de fail-methode om de klasse DriverTest te maken die wordt weergegeven in Listing 6. (De code die u typt, wordt vetgedrukt weergegeven.)
Listing 6
statische org. Importeren. junit. Doen gelden. *; import org. junit. Test; public class DriverTest {@Test public void testVelocity () {
TrafficLight light = new TrafficLight ();
licht. change (7);
Stuurprogramma stuurprogramma = nieuw stuurprogramma (); assertEquals (30, 0, stuurprogramma.snelheid (licht), 0. 1); }} Als alles goed gaat, gaat de JUnit-test met vlag en wimpel voorbij. (Om preciezer te zijn, de JUnit past met de kleur groen!) Dus het uitvoeren van DriverTest is niet nieuw of opwindend. Wat zo spannend is, is de aanroep tot assertEquals in listing 6. Wanneer u twee dubbele waarden in een Java-programma vergelijkt, hebt u niet het recht om gelijkheid op de neus te verwachten. Dat wil zeggen, een van de dubbele waarden zou kunnen zijn 30. 000000000, terwijl de andere dubbele waarde dichter bij 30 ligt. 000000001. Een computer heeft slechts 64 bits om elke dubbele waarde op te slaan, en onnauwkeurigheden kruipen hier en daar in. Dus in JUnit heeft de assertEquals-methode voor het vergelijken van dubbele waarden een derde parameter. De derde parameter geeft de speelruimte weer. In listing 6 staat de instructieassertEquals (30, 0, stuurprogramma.snelheid (licht), 0. 1);
zegt het volgende: "Beweer dat de werkelijke waarde van de bestuurder. snelheid (licht) ligt binnen 0. 1 van de verwachte waarde 30. 0. Als dat zo is, gaat de bewering voorbij. Zo niet, dan faalt de bewering. "
Wanneer u assertEquals callt voor dubbele waarden, kan het lastig zijn om een goede foutenmarge te selecteren.Deze cijfers illustreren de soorten dingen die fout kunnen gaan.
Hier is uw foutmarge te klein.Daar is uw foutmarge te groot.
Gelukkig is in dit voorbeeld van DriverTest de marge 0. 1 een zeer veilige gok. Dit is waarom:
Als de assertEquals-test mislukt, mislukt deze met veel meer dan 0. 1.
Falen betekent een stuurprogramma hebben. snelheidswaarde (licht) zoals 0. 0 of 10. 0.
In dit voorbeeld, als de assertEquals-test slaagt, staat dit waarschijnlijk voor complete gelijkheid op de neus.
De waarde van de bestuurder. velocity (light) komt rechtstreeks van de return 30. 0 code in Listing 5. Er is geen rekenkunde bij betrokken. Dus de waarde van de bestuurder. snelheid (licht) en de verwachte 30. 0 waarde moet exact hetzelfde zijn (of bijna exact hetzelfde).