JUnit ErrorCollector @Regel med eksempel

โšก Smart oppsummering

JUnit ErrorCollector er en regel som lar en test fortsette รฅ kjรธre etter en feil, samle alle feilobjekter og rapportere dem sammen nรฅr testmetoden er ferdig i stedet for รฅ stoppe.ping ved det fรธrste problemet.

  • ๐Ÿ”˜ Formรฅl: Fortsett en test etter at en pรฅstand, nettverks- eller GUI-sjekk mislykkes, og rapporter deretter alle innsamlede feil samtidig.
  • โ˜‘๏ธ Erklรฆring: @Rule pรฅ et offentlig ikke-statisk ErrorCollector-felt forteller JUnit รฅ knytte regelen til hver test.
  • โœ… Samler inn: addError(Throwable) lagrer alle feil eller unntak, fordi Throwable er overordnet til begge.
  • ๐Ÿงช Sjekker: checkThat() evaluerer en matcher og registrerer en avvik uten รฅ avbryte de gjenvรฆrende setningene.
  • ๐Ÿ› ๏ธ rapportering: Feilen trace lister opp alle innsamlede kastbare elementer med sitt eget linjenummer i JUnit utsikt.
  • ๐Ÿ“Œ JUnit 5: Regler er borte fra Jupiter, sรฅ assertAll() eller AssertJ SoftAssertions spiller samme rolle.

JUnit ErrorColector-regel som samler inn flere feil i รฉn testkjรธring

I et normalt scenario, nรฅr du identifiserer en feil under testkjรธring, stopper du testen, fikser feilen og kjรธrer testen pรฅ nytt.

Men JUnit har en litt annen tilnรฆrming. Med JUnit feilinnsamleren, kan du fortsatt fortsette med testkjรธringen selv etter at et problem er funnet eller testen mislykkes. Feilinnsamleren samler alle feilobjekter og rapporterer dem bare รฉn gang, etter at testkjรธringen er over.

Hvorfor bruke Error Collector?

Nรฅr du skriver et testskript, vil du kjรธre alle testene selv om en kodelinje feiler pรฅ grunn av nettverksfeil, pรฅstandsfeil eller annen รฅrsak. I den situasjonen kan du fortsatt fortsette รฅ kjรธre testskriptet ved hjelp av en spesialfunksjon levert av JUnit kjent som "feilsamler".

For dette, JUnit bruker @Regelmerknad, som brukes til รฅ opprette et objekt for feilinnsamleren. Nรฅr objektet for feilinnsamleren er opprettet, kan du enkelt legge til alle feilene i objektet ved hjelp av metoden addError (kastbar feil)Som du vet, Kastbar er superklassen til Unntak og Feil klasser i JavaNรฅr du legger til feil pรฅ denne mรฅten, vil disse feilene bli logget i JUnit testresultat.

Fordelen med รฅ legge til alle feil i en feilsamler er at du kan bekrefte alle feilene samtidig. Hvis skriptet feiler midtveis, fortsetter kjรธringen til slutten av testmetoden.

MerknaderVed bruk av en enkel assert- eller en try/catch-blokk vil det ikke vรฆre mulig รฅ bruke error collector-metoden.

Eksempelkode

For รฅ forstรฅ mer om Error Collector, se kodeeksemplet nedenfor, som demonstrerer hvordan du oppretter et Error Collector-objekt og legger til alle feilene i det objektet. track problemet:

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.		
    }		
}	

OBS: dette er et illustrerende eksempeltract, ikke en kompilerbar fil. Den etterfรธlgende kommentaren brytes til en andre linje uten en innledende //, og getResults() pluss Hamcrest-matcherne vises ikke. Den komplette kjรธrbare versjonen fรธlger under Eksempel ved bruk av ErrorCollector.

Hva er @Rule i JUnit?

JUnit gir en spesiell type hรฅndtering av tester, Testsak eller testpakke ved รฅ bruke @RegelmerknadVed รฅ bruke @Rule kan du enkelt legge til eller omdefinere testens oppfรธrsel.

Det finnes flere innebygde regler gitt av JUnit API som en tester kan bruke, og du kan ogsรฅ skrive din egen regel. Et regelfelt mรฅ vรฆre offentlig, ikke-statisk og av en type som implementerer TestRule.

Se kodelinjen nedenfor, som viser hvordan du bruker @Rule-annotasjonen sammen med Error Collector:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit 5-notat: Jupiter erstattet regler med Extension API, sรฅ @Rule og ErrorCollector finnes ikke i org.junit.jupiter. De nรฆrmeste ekvivalentene er Assertions.assertAll() og AssertJ SoftAssertions. JUnit 4-koden som vises her kjรธrer fortsatt gjennom den gamle motoren. Se JUnit merknader veiledning for hele kartetping.

Eksempel ved bruk av ErrorCollector

For รฅ forstรฅ feilinnsamleren, la oss lage en klasse og en regel for รฅ samle alle feilene. Du legger til alle feilene ved hjelp av addError(throwable) her.

Se koden nedenfor, som ganske enkelt oppretter en regel som ikke er noe annet enn et ยซError Collector-objektยป. Den brukes videre til รฅ legge til alle feilene for รฅ rapportere problemet pรฅ slutten:

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

La oss legge til testklassen ovenfor i en testkjรธrer og kjรธre den for รฅ samle alle feilene. 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());							
   }		
}      

Utgang:

Se feilen trace, som tracalle feilene pรฅ ett sted. JUnit visningen teller รฉn kjรธring, men rapporterer to feil og รฉn feil, hver med sitt eget linjenummer:

Eclipse JUnit svikt trace-liste over to Throwable-feil og รฉn AssertionError samlet i รฉn kjรธring

Fordeler med JUnit ErrorCollector

Du kan bruke en JUnit pรฅstand for funksjonell eller GUI-validering, for eksempel:

  1. assertEquals(String message, Object expected, Object actual), som sammenligner at to objekter er like.
  2. Pรฅ samme mรฅte hevder assertTrue (boolsk tilstand) at en betingelse er sann.

Ved รฅ bruke pรฅstander blir valideringstesting enkelt. Men et stort problem er at testkjรธringen vil stoppe selv om en enkelt pรฅstand mislykkes.

Testkontinuitet og gjenopprettingshรฅndtering er avgjรธrende for suksess med testautomatisering, og det er viktigst pรฅ lang sikt. Selenium flyter der det er dyrt รฅ starte en nettleser pรฅ nytt etter hver mislykkede sjekk. Error Collector er den beste mรฅten รฅ hรฅndtere slike scenarier pรฅ.

Spรธrsmรฅl og svar

addError(Throwable) registrerer en feil du allerede har fanget eller opprettet. checkThat(value, matcher) evaluerer en Hamcrest-matcher og registrerer en avviksfeil automatisk, slik at den leses som en pรฅstand samtidig som de gjenvรฆrende setningene fortsatt kan kjรธres.

Ja. Metoden kjรธrer til den er fullfรธrt, deretter JUnit markerer den som mislykket og skriver ut alle innsamlede kastbare elementer i feilen trace. Skjermbildeeksemplet rapporterer to feil og รฉn feil fra รฉn enkelt testmetode.

JUnit skanner testklassen etter offentlige instansfelt som er annotert med @Rule og bruker hvert av dem rundt hver testmetode. Et privat eller statisk felt ignoreres, og JUnit genererer en initialiseringsfeil i stedet for รฅ kjรธre testen.

Nei. Jupiter droppet regelmekanismen, sรฅ org.junit.rules.ErrorCollector finnes bare i JUnit 4. Bruk Assertions.assertAll() for grupperte pรฅstander, eller legg til AssertJ SoftAssertions nรฅr det er behov for mer omfattende samsvarere.

Ja, og det er et vanlig mรธnster. En side med flere felt kan valideres i รฉn omgang, og samle inn alle avvik i stedet for รฅ avbrytes pรฅ den fรธrste, noe som unngรฅr รฅ starte nettleserรธkten pรฅ nytt for hver feil som blir funnet.

Begge utsetter rapportering, men SoftAssert krever et eksplisitt assertAll()-kall pรฅ slutten av testen, mens ErrorCollector rapporterer automatisk nรฅr metoden returnerer. Glemmer assertAll() i TestNG skjuler feil i stillhet.

AI-assistenter i gruppen en lang fiasko trace ved rotรฅrsak, slik at tjue innsamlede kastbare tester reduseres til en hรฅndfull distinkte defekter. De foreslรฅr ogsรฅ hvilke kontroller som hรธrer sammen i รฉn samlet kjรธring i stedet for i separate tester.

GitHub Copilot skriver @Rule-feltet lett, men blander det ofte inn i en Jupiter-testklasse der regler ikke finnes. Bekreft at importene er org.junit fรธr du kjรธrer programpakken.

Oppsummer dette innlegget med: