JUnit ErrorCollector @Regel med eksempel

โšก Smart opsummering

JUnit ErrorCollector er en regel, der lader en test fortsรฆtte med at kรธre efter en fejl, indsamle alle fejlobjekter og rapportere dem sammen, nรฅr testmetoden er fรฆrdig, i stedet for at stoppe.ping ved det fรธrste problem.

  • ๐Ÿ”˜ Formรฅl: Fortsรฆt en test efter en assertion-, netvรฆrks- eller GUI-kontrol mislykkes, og rapporter derefter alle indsamlede fejl pรฅ รฉn gang.
  • โ˜‘๏ธ Erklรฆring: @Rule pรฅ et offentligt ikke-statisk ErrorCollector-felt fortรฆller JUnit at knytte reglen til hver test.
  • โœ… Indsamling: addError(Throwable) gemmer enhver fejl eller undtagelse, fordi Throwable er forรฆlder til begge.
  • ๐Ÿงช Kontrol: checkThat() evaluerer en matcher og registrerer en uoverensstemmelse uden at afbryde de resterende sรฆtninger.
  • ๐Ÿ› ๏ธ Rapportering: Fejlen trace viser alle indsamlede kastbare genstande med deres eget linjenummer i JUnit udsigt.
  • ๐Ÿ“Œ JUnit 5: Reglerne er vรฆk fra Jupiter, sรฅ assertAll() eller AssertJ SoftAssertions spiller den samme rolle.

JUnit ErrorCollector-regel, der indsamler flere fejl i รฉn testkรธrsel

I et normalt scenarie, nรฅr du identificerer en fejl under testudfรธrelse, ville du stoppe testen, rette fejlen og kรธre testen igen.

Men JUnit har en lidt anderledes tilgang. Med JUnit Fejlindsamleren kan du stadig fortsรฆtte med testen, selv efter at der er fundet et problem, eller testen mislykkes. Fejlindsamleren indsamler alle fejlobjekter og rapporterer dem kun รฉn gang, efter at testen er afsluttet.

Hvorfor bruge Error Collector?

Nรฅr du skriver et testscript, skal du udfรธre alle testene, selvom en kodelinje fejler pรฅ grund af netvรฆrksfejl, assertionfejl eller andre รฅrsager. I den situation kan du stadig fortsรฆtte med at udfรธre testscriptet ved hjรฆlp af en sรฆrlig funktion leveret af JUnit kendt som "fejlsamler".

For det, JUnit anvender @Regelanmรฆrkning, som bruges til at oprette et objekt til fejlindsamleren. Nรฅr objektet til fejlindsamleren er oprettet, kan du nemt tilfรธje alle fejlene til objektet ved hjรฆlp af metoden addError (Throwable error)Som du ved, Kan kastes er superklassen af undtagelse og Fejl klasser i JavaNรฅr du tilfรธjer fejl pรฅ denne mรฅde, vil disse fejl blive logget i JUnit testresultat.

Fordelen ved at tilfรธje alle fejl i en Error Collector er, at du kan verificere alle fejlene pรฅ รฉn gang. Hvis scriptet fejler midtvejs, fortsรฆtter udfรธrelsen stadig til slutningen af โ€‹โ€‹testmetoden.

BemรฆrkHvis der anvendes en simpel assert- eller en try/catch-blok, vil det ikke vรฆre muligt at bruge error collector-metoden.

Prรธvekode

For at forstรฅ mere om Error Collector, se kodeeksemplet nedenfor, som demonstrerer, hvordan man opretter et Error Collector-objekt og tilfรธjer alle fejlene til det objekt. tracproblemet:

package guru99.junit;		

import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							
    collector.checkThat(getResults(),			
                not(containsString("here is an error")));			
    // all lines of code will execute and at the end a combined failure will		
    be logged in.		
    }		
}	

Bemรฆrk: dette er et illustrativt eksempeltract, ikke en kompilerbar fil. Dens efterfรธlgende kommentar ombrydes til en anden linje uden en indledende //, og getResults() plus Hamcrest-matcherne vises ikke. Den komplette kรธrbare version fรธlger under Eksempel ved hjรฆlp af ErrorCollector.

Hvad er @Rule i JUnit?

JUnit tilbyder en sรฆrlig form for hรฅndtering af tests, Test sag eller testsuite ved hjรฆlp af @RegelanmรฆrkningVed at bruge @Rule kan du nemt tilfรธje eller omdefinere testens funktionsmรฅde.

Der er flere indbyggede regler fastsat af JUnit API som en tester kan bruge, og du kan ogsรฅ skrive din egen regel. Et regelfelt skal vรฆre offentligt, ikke-statisk og af en type, der implementerer TestRule.

Se kodelinjen nedenfor, som viser, hvordan man bruger @Rule-annotationen sammen med Error Collector:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit 5-note: Jupiter erstattede regler med Extension API'en, sรฅ @Rule og ErrorCollector findes ikke i org.junit.jupiter. De nรฆrmeste รฆkvivalenter er Assertions.assertAll() og AssertJ SoftAssertions. JUnit 4-koden vist her kรธrer stadig gennem den gamle motor. Se JUnit anmรฆrkninger vejledning til det fulde kortping.

Eksempel ved hjรฆlp af ErrorCollector

For at forstรฅ fejlopsamleren, lad os oprette en klasse og en regel til at indsamle alle fejlene. Du skal tilfรธje alle fejlene ved hjรฆlp af addError(throwable) her.

Se koden nedenfor, som blot opretter en regel, der ikke er andet end et "Error Collector-objekt". Den bruges yderligere til at tilfรธje alle fejlene for at rapportere problemet til sidst:

ErrorCollectorExample.java

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							

        System.out.println("Hello");					
        try {			
            Assert.assertTrue("A " == "B");					
        } catch (Throwable t) {					
            collector.addError(t);					
        }		
        System.out.println("World!!!!");					
    }		
}		

TestRunner.java

Lad os tilfรธje ovenstรฅende testklasse til en testrunner og udfรธre den for at indsamle alle fejlene. Se koden nedenfor:

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(ErrorCollectorExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      

Output:

Se fiaskoen trace, hvilket tracalle fejlene pรฅ รฉt sted. JUnit visningen tรฆller รฉn kรธrsel, men rapporterer to fejl og รฉn fiasko, hver med sit eget linjenummer:

Eclipse JUnit svigt tracen liste over to Throwable-fejl og รฉn AssertionError indsamlet i en enkelt kรธrsel

Fordele ved JUnit ErrorCollector

Du kan bruge en JUnit pรฅstand til funktionel eller GUI-validering, for eksempel:

  1. assertEquals(String message, Object expected, Object actual), som sammenligner, at to objekter er ens.
  2. Pรฅ samme mรฅde hรฆvder assertTrue (Boolesk betingelse) at en betingelse er sand.

Ved hjรฆlp af assertions bliver valideringstestning nem. Men et stort problem er, at testudfรธrelsen stopper, selv hvis en enkelt assertion fejler.

Testkontinuitet og hรฅndtering af gendannelse er afgรธrende for succes med testautomatisering, og det er vigtigst pรฅ lang sigt. Selenium flows, hvor det er dyrt at genstarte en browser efter hver mislykket kontrol. Error Collector er den bedste mรฅde at hรฅndtere sรฅdanne scenarier pรฅ.

Ofte Stillede Spรธrgsmรฅl

addError(Throwable) registrerer en fejl, du allerede har fanget eller oprettet. checkThat(value, matcher) evaluerer en Hamcrest-matcher og registrerer automatisk en uoverensstemmelse, sรฅ den lรฆses som en pรฅstand, mens de resterende sรฆtninger stadig kan kรธre.

Ja. Metoden kรธrer til fรฆrdiggรธrelse, og derefter JUnit markerer den som mislykket og udskriver alle indsamlede kastbare elementer i fejlen trace. Skรฆrmbilledet viser to fejl og รฉn fejl fra en enkelt testmetode.

JUnit scanner testklassen for offentlige instansfelter, der er annoteret med @Rule, og anvender hvert felt omkring hver testmetode. Et privat eller statisk felt ignoreres, og JUnit genererer en initialiseringsfejl i stedet for at kรธre testen.

Nej. Jupiter droppede regelmekanismen, sรฅ org.junit.rules.ErrorCollector findes kun i JUnit 4. Brug Assertions.assertAll() til grupperede assertions, eller tilfรธj AssertJ SoftAssertions, nรฅr der er behov for mere omfattende matchere.

Ja, og det er et almindeligt mรธnster. En side med flere felter kan valideres i รฉn omgang, hvor alle uoverensstemmelser indsamles i stedet for at afbrydes ved den fรธrste, hvilket undgรฅr at genstarte browsersessionen for hver fundne fejl.

Begge udsรฆtter rapportering, men SoftAssert krรฆver et eksplicit assertAll()-kald i slutningen af โ€‹โ€‹testen, mens ErrorCollector rapporterer automatisk, nรฅr metoden returnerer. Glemmer assertAll() i TestNG skjuler lydlรธst fiaskoer.

AI-assistentgruppe en lang fiasko trace ved roden af โ€‹โ€‹รฅrsagen, sรฅ tyve indsamlede kastbare tests reduceres til en hรฅndfuld forskellige defekter. De foreslรฅr ogsรฅ, hvilke kontroller der hรธrer sammen i รฉn samlet kรธrsel i stedet for i separate tests.

GitHub Copilot skriver @Rule-feltet let, men blander det ofte ind i en Jupiter-testklasse, hvor der ikke findes regler. Bekrรฆft, at importerne er org.junit, fรธr du kรธrer pakken.

Opsummer dette indlรฆg med: