Redoslijed ispitivanja u JUnit-u
1. Pregled
Prema zadanim postavkama, JUnit pokreće testove koristeći deterministički, ali nepredvidljiv redoslijed (MethodSorters.DEFAULT).
U većini slučajeva to je ponašanje sasvim u redu i prihvatljivo; ali postoje slučajevi kada moramo izvršiti određeno naređenje.
2. Redoslijed testa u JUnit 5
U JUNITU 5, možemo koristiti @TestMethodOrder za kontrolu redoslijeda izvršavanja testova.
Možemo koristiti svoje MethodOrderer, kao što ćemo vidjeti kasnije, ili možemo odabrati jednog od tri ugrađena naručitelja:
- @Narudžba Bilješka
- Alfanumerički Narudžba
- Slučajni poredak
2.1. Koristiti @Narudžba Bilješka
Možemo koristiti @Narudžba napomena za provođenje testova koji se izvode određenim redoslijedom.
U sljedećem primjeru metode će se izvoditi ovim redoslijedom - firstTest (), onda drugi test (), i konačno, thirdTest ():
@TestMethodOrder (OrderAnnotation.class) javna klasa OrderAnnotationUnitTest {private static StringBuilder output = new 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 javna statička praznina assertOutput () {assertEquals (output.toString (), "abc"); }}
2.2. Koristeći Alfanumerički Narudžba
Također možemo pokretati testove na temelju njihovih imena alfanumeričkim redoslijedom:
@TestMethodOrder (Alphanumeric.class) javna klasa AlphanumericOrderUnitTest {private static StringBuilder output = new StringBuilder (""); @Test public void myATest () {output.append ("A"); } @Test public void myBTest () {output.append ("B"); } @Test public void myaTest () {output.append ("a"); } @AfterAll javna statička praznina assertOutput () {assertEquals (output.toString (), "ABa"); }}
Imajte na umu da je alfanumerički redoslijed osjetljiv na velika i mala slova, pa su velika slova na prvom mjestu, a zatim mala.
Testovi će se izvoditi ovim redoslijedom: myATest (), myBTest () i konačno myaTest ().
2.3. Korištenje prilagođene narudžbe
Konačno, možemo koristiti vlastiti prilagođeni redoslijed primjenom MethodOrderer sučelje.
U našem CustomOrder, testove ćemo naručiti na temelju njihovih imena, alfanumeričkim redoslijedom koji ne razlikuje velika i mala slova:
javna klasa CustomOrder implementira MethodOrderer {@Override public void orderMethods (MethodOrdererContext context) {context.getMethodDescriptors (). sort ((MethodDescriptor m1, MethodDescriptor m2) -> m1.getMethod (). getName (). compareToIgnoreCase (m2.get .getName ())); }}
Zatim ćemo upotrijebiti CustomOrder za pokretanje istih testova iz našeg prethodnog primjera ovim redoslijedom - myATest (), myaTest (), i konačno, myBTest ():
@TestMethodOrder (CustomOrder.class) javna klasa CustomOrderUnitTest {// ... @AfterAll javna statička praznina assertOutput () {assertEquals (output.toString (), "AaB"); }}
3. Redoslijed testa u JUnit-u 4
Ako i dalje koristite JUnit 4, API-ji za naručivanje testova malo se razlikuju.
Prođimo kroz mogućnosti da to postignemo i u prethodnim verzijama.
3.1. Koristeći MethodSorters.DEFAULT
Ova zadana strategija uspoređuje metode ispitivanja pomoću njihovih hash kodova. U slučaju sudara hash-a koristi se leksikografski poredak:
@FixMethodOrder (MethodSorters.DEFAULT) javna klasa DefaultOrderOfExecutionTest {private static StringBuilder output = new StringBuilder (""); @Test javna praznina secondTest () {output.append ("b"); } @Test javna void thirdTest () {output.append ("c"); } @Test javna void firstTest () {output.append ("a"); } @AfterClass javna statička praznina assertOutput () {assertEquals (output.toString (), "cab"); }}
Kada izvršimo testove u gornjoj klasi, vidjet ćemo da su svi prošli, uključujući assertOutput ().
3.2. Koristeći MethodSorters.JVM
Druga strategija naručivanja je MethodSorters.JVM – ova strategija koristi prirodni JVM poredak - koji može biti različit za svako pokretanje:
@FixMethodOrder (MethodSorters.JVM) javna klasa JVMOrderOfExecutionTest {// isto kao gore}
Svaki put kad izvršimo testove u ovoj klasi, dobit ćemo drugačiji rezultat.
3.3. Koristeći MethodSorters.NAME_ASCENDING
Konačno, ova se strategija može koristiti za izvođenje testova prema njihovom leksikografskom redoslijedu:
@FixMethodOrder (MethodSorters.NAME_ASCENDING) javna klasa NameAscendingOrderOfExecutionTest {// isto kao gore @AfterClass javna statička praznina assertOutput () {assertEquals (output.toString (), "abc"); }}
Slično tome, kada izvršavamo testove u ovoj klasi, vidimo da svi oni prolaze, uključujući assertOutput (), koji potvrđuje nalog za izvršenje koji smo postavili uz napomenu.
4. Zaključak
U ovom smo brzom uputstvu prošli načine postavljanja naloga za izvršenje dostupnog u JUnit-u.
Kao i uvijek, primjeri korišteni u ovom članku mogu se naći na GitHubu.