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.
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:
Fordele ved JUnit ErrorCollector
Du kan bruge en JUnit pรฅstand til funktionel eller GUI-validering, for eksempel:
- assertEquals(String message, Object expected, Object actual), som sammenligner, at to objekter er ens.
- 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รฅ.

