Tests voorwaardelijk uitvoeren of negeren in JUnit 4

1. Overzicht

Laten we ons voorstellen dat we een test hebben voor een code die afhankelijk is van het besturingssysteem en alleen zou moeten worden uitgevoerd als onze testmachine op Linux draait. Als het op een ander besturingssysteem draait, willen we dat de test niet mislukt, maar tijdens runtime wordt genegeerd.

Een eerste benadering zou een paar kunnen zijn als verklaringen om te controleren op deze voorwaarde met Systeem klasse-eigenschappen. Dit werkt natuurlijk, maar JUnit heeft een schonere, elegantere methode.

In deze korte tutorial gaan we kijken hoe we voorwaardelijk tests kunnen uitvoeren of negeren in JUnit 4 met behulp van de Uitgaan van klasse.

2. Het Uitgaan van Klasse

Deze klasse biedt een reeks methoden om voorwaardelijke testuitvoering te ondersteunen op basis van bepaalde voorwaarden. Onze test wordt alleen uitgevoerd als aan al deze voorwaarden is voldaan. Als niet, JUnit slaat de uitvoering gewoon over en markeert het als geslaagd in het testrapport. Dit laatste is het belangrijkste verschil met de Beweren klasse, waarin een falende conditie ertoe leidt dat de test eindigt als mislukt.

Een belangrijk ding om op te merken is dat het gedrag dat we hebben beschreven voor de Uitgaan van class is exclusief voor de standaard JUnit-runner. Met aangepaste hardlopers kunnen de zaken anders zijn.

Eindelijk op dezelfde manier als bij Beweren, kunnen we de Uitgaan van methoden ofwel in de @Voordat of @Voor klas geannoteerde methoden of binnen de @Test methode zelf.

Laten we nu de meest bruikbare methoden van de Uitgaan van les door enkele voorbeelden te laten zien. Laten we voor alle volgende voorbeelden aannemen getOsName () geeft terug Linux.

2.1. Gebruik makend van aannemen dat

De aannemen dat() methode controleert of de staat - in dit geval, getOsName () - voldoet aan de voorwaarden van de matcher geslaagd in:

@Test openbare leegte whenAssumeThatAndOSIsLinux_thenRunTest () {aannemenThat (getOsName (), is ("Linux")); assertEquals ("run", "RUN" .toLowerCase ()); }

In dit voorbeeld we hebben gekeken of getOsName () is gelijk aan Linux. Net zo getOsName () geeft terug Linux, wordt de test uitgevoerd. Let op, we gebruiken de Hamcrest-matchermethode is (T) als matcher hier.

2.2. Gebruik makend van aannemen: Waar

Evenzo kunnen we de aannemenTrue () methode om een ​​booleaanse uitdrukking op te geven die moet resulteren in waar zodat de test kan worden uitgevoerd. Als het evalueert naar false, wordt de test genegeerd:

private boolean isExpectedOS (String osName) {retourneer "Linux" .equals (osName); } @Test openbare leegte whenAssumeTrueAndOSIsLinux_thenRunTest () {aannemenTrue (isExpectedOS (getOsName ())); assertEquals ("run", "RUN" .toLowerCase ()); } 

In dit geval, isVerwachtOs () geeft terug waar. Daarom deaan de voorwaarden voor het uitvoeren van de test is voldaan, en de test zal worden uitgevoerd.

2.3. Gebruik makend van veronderstellenFalse

Ten slotte kunnen we het tegenovergestelde gebruiken aannemenFalse () methode om een ​​booleaanse uitdrukking op te geven die moet resulteren in false zodat de test kan worden uitgevoerd. Als het evalueert naar waar, wordt de test genegeerd:

@Test openbare leegte whenAssumeFalseAndOSIsLinux_thenIgnore () {aannemenFalse (isExpectedOS (getOsName ())); assertEquals ("run", "RUN" .toLowerCase ()); }

In dit geval as isVerwachteOs () ook geeft terug waar,deer is niet voldaan aan de voorwaarden om de test uit te voeren, en de test wordt genegeerd.

2.4. Gebruik makend van veronderstellenNotNull

Als we een test willen negeren als er een bepaalde uitdrukking is nul, we kunnen de aannemenNotNull () methode:

@Test openbare leegte whenAssumeNotNullAndNotNullOSVersion_thenRun () {aannemenNotNull (getOsName ()); assertEquals ("run", "RUN" .toLowerCase ()); }

Net zo getOsName () een niet-nulwaarde retourneert, is aan de voorwaarde voor het uitvoeren van de test voldaan en wordt de test uitgevoerd.

2.5. Gebruik makend van veronderstelNoException

Ten slotte zouden we een test kunnen negeren als er een uitzondering wordt gegenereerd. We kunnen gebruiken aannemenNoException () Voor dit doeleinde:

@Test openbare leegte whenAssumeNoExceptionAndExceptionThrown_thenIgnore () {assertEquals ("alles ok", "ALLES OK" .toLowerCase ()); String t = null; probeer {t.charAt (0); } catch (NullPointerException npe) {aannemenNoException (npe); } assertEquals ("run", "RUN" .toLowerCase ()); }

In dit voorbeeld, as t is nul,een NullPointerException uitzondering wordt daarom gegenereerd de er is niet voldaan aan de voorwaarden om de test uit te voeren, en de test wordt genegeerd.

3. Waar moeten we de veronderstellenXXX Bellen?

Het is belangrijk om dat op te merken het gedrag van de veronderstellenXXX methoden hangt af van waar we ze in onze tests plaatsen.

Laten we onze aannemen dat voorbeeld dus de assertEquals () oproep gaat eerst. Laten we ook de assertEquals () mislukken:

@Test openbare leegte whenAssumeFalseAndOSIsLinux_thenIgnore () {assertEquals ("run", "RUN"); aannemenFalse (isExpectedOS (getOsName ())); } 

Als we dit voorbeeld uitvoeren, hebben we:

org.junit.ComparisonFailure: Verwacht: run Actual: RUN

In dit geval, onze test wordt niet genegeerd omdat deze is mislukt voordat we de aannemen dat() bellen. Hetzelfde gebeurt met alle veronderstellenXXX methoden. Dus we moeten zorg ervoor dat we ze op de juiste plaats in onze testmethode plaatsen.

4. Conclusie

In deze korte tutorial hebben we gezien hoe we voorwaardelijk kunnen beslissen of een test al dan niet moet worden uitgevoerd, met behulp van de Uitgaan van klas in JUnit 4. Als we JUnit 5 gebruiken, is deze ook beschikbaar in versie 5.4 of hoger.

Zoals altijd is de broncode van de voorbeelden die we hebben doorgenomen te vinden op GitHub.