De volgorde van testen in JUnit

1. Overzicht

Standaard, JUnit voert tests uit met behulp van een deterministische, maar onvoorspelbare volgorde (MethodSorters.DEFAULT).

In de meeste gevallen is dat gedrag prima en acceptabel; maar er zijn gevallen waarin we een specifieke bestelling moeten afdwingen.

2. Testvolgorde in JUnit 5

In JUnit 5, we kunnen gebruiken @TestMethodOrder om de volgorde van uitvoering van tests te controleren.

We kunnen onze eigen gebruiken Methode Besteller, zoals we later zullen zien, of we kunnen een van de drie ingebouwde bestellers selecteren:

  1. @Bestellen Annotatie
  2. Alfanumeriek Bestellen
  3. Willekeurige volgorde

2.1. De ... gebruiken @Bestellen Annotatie

We kunnen de @Bestellen annotatie om tests af te dwingen die in een specifieke volgorde worden uitgevoerd.

In het volgende voorbeeld worden de methoden in deze volgorde uitgevoerd: eerste test(), dan secondTest (), en tenslotte, derdeTest ():

@TestMethodOrder (OrderAnnotation.class) openbare klasse OrderAnnotationUnitTest {privé statische StringBuilder-uitvoer = nieuwe StringBuilder (""); @Test @Order (1) public void firstTest () {output.append ("a"); } @Test @Order (2) public void secondTest () {output.append ("b"); } @Test @Order (3) public void thirdTest () {output.append ("c"); } @AfterAll openbare statische leegte assertOutput () {assertEquals (output.toString (), "abc"); }}

2.2. Gebruik makend van Alfanumeriek Bestellen

We kunnen ook tests uitvoeren op basis van hun namen in alfanumerieke volgorde:

@TestMethodOrder (Alphanumeric.class) openbare klasse AlphanumericOrderUnitTest {privé statische StringBuilder-uitvoer = nieuwe StringBuilder (""); @Test public void myATest () {output.append ("A"); } @Test public void myBTest () {output.append ("B"); } @Test public void myaTest () {output.append ("a"); } @AfterAll openbare statische leegte assertOutput () {assertEquals (output.toString (), "ABa"); }}

Houd er rekening mee dat de alfanumerieke volgorde hoofdlettergevoelig is, dus hoofdletters komen eerst en vervolgens kleine letters.

De tests worden in deze volgorde uitgevoerd: myATest (), myBTest () en tenslotte myaTest ().

2.3. Met behulp van een aangepaste volgorde

Tenslotte, we kunnen onze eigen aangepaste volgorde gebruiken door de Methode Besteller koppel.

In onze CustomOrder, zullen we de tests ordenen op basis van hun namen in een niet-hoofdlettergevoelige alfanumerieke volgorde:

public class CustomOrder implementeert MethodOrderer {@Override public void orderMethods (MethodOrdererContext context) {context.getMethodDescriptors (). sort ((MethodDescriptor m1, MethodDescriptor m2) -> m1.getMethod (). getName (). CompareToIgnoreCase (m2). .getName ())); }}

Dan gebruiken we CustomOrder om dezelfde tests uit ons vorige voorbeeld in deze volgorde uit te voeren - myATest (), myaTest (), en tenslotte, myBTest ():

@TestMethodOrder (CustomOrder.class) openbare klasse CustomOrderUnitTest {// ... @AfterAll openbare statische leegte assertOutput () {assertEquals (output.toString (), "AaB"); }}

3. Testvolgorde in JUnit 4

Als u JUnit 4 nog steeds gebruikt, zijn de API's voor het bestellen van tests iets anders.

Laten we de opties bekijken om dit ook in eerdere versies te bereiken.

3.1. Gebruik makend van MethodSorters.DEFAULT

Deze standaardstrategie vergelijkt testmethoden met behulp van hun hashcodes. In het geval van een hash-botsing wordt de lexicografische volgorde gebruikt:

@FixMethodOrder (MethodSorters.DEFAULT) openbare klasse DefaultOrderOfExecutionTest {privé statische StringBuilder-uitvoer = nieuwe StringBuilder (""); @Test public void secondTest () {output.append ("b"); } @Test public void thirdTest () {output.append ("c"); } @Test public void firstTest () {output.append ("a"); } @AfterClass openbare statische leegte assertOutput () {assertEquals (output.toString (), "cab"); }}

Als we de tests in de bovenstaande klas uitvoeren, zullen we zien dat ze allemaal slagen, inclusief assertOutput ().

3.2. Gebruik makend van MethodSorters.JVM

Een andere bestelstrategie is MethodSorters.JVMdeze strategie maakt gebruik van de natuurlijke JVM-ordening - die voor elke run anders kan zijn:

@FixMethodOrder (MethodSorters.JVM) openbare klasse JVMOrderOfExecutionTest {// hetzelfde als hierboven}

Elke keer dat we de tests in deze klas uitvoeren, krijgen we een ander resultaat.

3.3. Gebruik makend van MethodSorters.NAME_ASCENDING

Ten slotte kan deze strategie worden gebruikt voor het uitvoeren van tests in hun lexicografische volgorde:

@FixMethodOrder (MethodSorters.NAME_ASCENDING) openbare klasse NameAscendingOrderOfExecutionTest {// hetzelfde als hierboven @AfterClass openbare statische leegte assertOutput () {assertEquals (output.toString (), "abc"); }}

Evenzo, wanneer we de tests in deze klas uitvoeren, zien we dat ze allemaal slagen, inclusief assertOutput (), wat de uitvoeringsopdracht bevestigt die we met de annotatie hebben ingesteld.

4. Conclusie

In deze korte tutorial hebben we de manieren besproken om de uitvoeringsvolgorde in te stellen die beschikbaar is in JUnit.

En, zoals altijd, zijn de voorbeelden die in dit artikel worden gebruikt, te vinden op GitHub.