JUnit ErrorCollector @Rule με Παράδειγμα

⚡ Έξυπνη Σύνοψη

JUnit Το ErrorCollector είναι ένας κανόνας που επιτρέπει σε μια δοκιμή να συνεχίζει να εκτελείται μετά από μια αποτυχία, συλλέγοντας κάθε αντικείμενο σφάλματος και αναφέροντάς τα μαζί μόλις ολοκληρωθεί η μέθοδος δοκιμής αντί να σταματήσει.ping στο πρώτο πρόβλημα.

  • 🔘 Σκοπός: Συνεχίστε μια δοκιμή μετά την αποτυχία ενός ελέγχου διεκδίκησης, δικτύου ή GUI και, στη συνέχεια, αναφέρετε κάθε συλλεγμένο σφάλμα ταυτόχρονα.
  • ☑️ Δήλωση: Το @Rule σε ένα δημόσιο μη στατικό πεδίο ErrorCollector λέει JUnit για να επισυνάψετε τον κανόνα σε κάθε δοκιμή.
  • Περισυλλογή: Η συνάρτηση addError(Throwable) αποθηκεύει οποιοδήποτε Σφάλμα ή Εξαίρεση, επειδή η συνάρτηση Throwable είναι ο γονέας και των δύο.
  • 🧪 Ελεγχος: Η checkThat() αξιολογεί έναν ταιριαστό όρο και καταγράφει μια αναντιστοιχία χωρίς να ματαιώνει τις υπόλοιπες εντολές.
  • Αναφορά: Η αποτυχία tracΤο e παραθέτει κάθε συλλεγμένο ρίψιμο με τον δικό του αριθμό γραμμής στο JUnit θέα.
  • 📌 JUnit 5: Οι κανόνες έχουν εξαφανιστεί από τον Jupiter, επομένως οι assertAll() ή AssertJ SoftAssertions παίζουν τον ίδιο ρόλο.

JUnit Ο κανόνας ErrorCollector συλλέγει πολλά σφάλματα σε μία δοκιμαστική εκτέλεση

Σε ένα κανονικό σενάριο, κάθε φορά που εντοπίζετε οποιοδήποτε σφάλμα κατά την εκτέλεση της δοκιμής, θα σταματάτε τη δοκιμή, θα διορθώνετε το σφάλμα και θα εκτελείτε ξανά τη δοκιμή.

Αλλά JUnit έχει μια ελαφρώς διαφορετική προσέγγιση. Με το JUnit Με τον συλλέκτη σφαλμάτων, μπορείτε να συνεχίσετε την εκτέλεση της δοκιμής ακόμα και μετά τον εντοπισμό ενός προβλήματος ή την αποτυχία της δοκιμής. Ο συλλέκτης σφαλμάτων συλλέγει όλα τα αντικείμενα σφάλματος και τα αναφέρει μόνο μία φορά, μετά το τέλος της εκτέλεσης της δοκιμής.

Γιατί να χρησιμοποιήσετε το Error Collector;

Κατά τη σύνταξη ενός σεναρίου δοκιμής, θέλετε να εκτελέσετε όλες τις δοκιμές ακόμα και αν κάποια γραμμή κώδικα αποτύχει λόγω σφάλματος δικτύου, σφάλματος διεκδίκησης ή οποιουδήποτε άλλου λόγου. Σε αυτήν την περίπτωση, μπορείτε να συνεχίσετε να εκτελείτε το σενάριο δοκιμής χρησιμοποιώντας μια ειδική λειτουργία που παρέχεται από JUnit γνωστός ως «συλλέκτης σφαλμάτων».

Για αυτό, JUnit χρησιμοποιεί το @Σχολιασμός κανόνα, το οποίο χρησιμοποιείται για τη δημιουργία ενός αντικειμένου του συλλέκτη σφαλμάτων. Μόλις δημιουργηθεί το αντικείμενο για τον συλλέκτη σφαλμάτων, μπορείτε εύκολα να προσθέσετε όλα τα σφάλματα στο αντικείμενο χρησιμοποιώντας τη μέθοδο addError (Σφάλμα που μπορεί να πεταχτεί). Οπως ξέρεις, Ρίξιμο είναι η υπερ-κλάση του Εξαίρεση και Λάθος μαθήματα σε JavaΌταν προσθέτετε σφάλματα με αυτόν τον τρόπο, αυτά τα σφάλματα θα καταγράφονται στο JUnit αποτέλεσμα της δοκιμής.

Το πλεονέκτημα της προσθήκης όλων των σφαλμάτων σε έναν Συλλέκτη σφαλμάτων είναι ότι μπορείτε να επαληθεύσετε όλα τα σφάλματα ταυτόχρονα. Επίσης, εάν το σενάριο αποτύχει στη μέση, η εκτέλεση συνεχίζεται μέχρι το τέλος της μεθόδου δοκιμής.

ΣημείωσηΣτην περίπτωση χρήσης ενός απλού assert ή ενός μπλοκ try/catch, η χρήση της μεθόδου συλλέκτη σφαλμάτων δεν θα είναι δυνατή.

Δείγμα κώδικα

Για να κατανοήσετε περισσότερα σχετικά με το Error Collector, ανατρέξτε στο παρακάτω παράδειγμα κώδικα, το οποίο δείχνει πώς να δημιουργήσετε ένα αντικείμενο Error Collector και να προσθέσετε όλα τα σφάλματα σε αυτό το αντικείμενο για να tracκ το ζήτημα:

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

Σημείωση: αυτό είναι ένα ενδεικτικό παράδειγμαtract, δεν είναι ένα αρχείο που μπορεί να μεταγλωττιστεί. Το τελικό σχόλιό του αναδιπλώνεται σε μια δεύτερη γραμμή χωρίς // στην αρχή, και η συνάρτηση getResults() συν τα ταιριάσματα Hamcrest δεν εμφανίζονται. Η πλήρης εκτελούμενη έκδοση ακολουθεί παρακάτω. Παράδειγμα χρησιμοποιώντας το ErrorCollector.

Τι είναι το @Rule στο JUnit?

JUnit παρέχει ένα ειδικό είδος χειρισμού των δοκιμών, Δοκιμαστική θήκη ή σουίτα δοκιμών χρησιμοποιώντας το @Σχολιασμός κανόναΧρησιμοποιώντας το @Rule, μπορείτε εύκολα να προσθέσετε ή να επαναπροσδιορίσετε τη συμπεριφορά της δοκιμής.

Υπάρχουν αρκετοί ενσωματωμένοι κανόνες που παρέχονται από το JUnit API που μπορεί να χρησιμοποιήσει ένας δοκιμαστής και μπορείτε επίσης να γράψετε τον δικό σας κανόνα. Ένα πεδίο κανόνα πρέπει να είναι δημόσιο, μη στατικό και να είναι τύπου που να υλοποιεί το TestRule.

Δείτε την παρακάτω γραμμή κώδικα, η οποία δείχνει πώς να χρησιμοποιήσετε την σχολίαση @Rule μαζί με τον Συλλέκτη Σφάλματος:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit Σημείωση 5: Ο Jupiter αντικατέστησε τους κανόνες με το Extension API, επομένως τα @Rule και ErrorCollector δεν υπάρχουν στο org.junit.jupiter. Τα πλησιέστερα ισοδύναμα είναι τα Assertions.assertAll() και AssertJ SoftAssertions. JUnit Ο κώδικας 4 που φαίνεται εδώ εξακολουθεί να εκτελείται μέσω της vintage μηχανής. Δείτε το JUnit σχολιασμούς εκπαιδευτικό βοήθημα για τον πλήρη χάρτηping.

Παράδειγμα χρησιμοποιώντας το ErrorCollector

Για να κατανοήσουμε τον συλλέκτη σφαλμάτων, ας δημιουργήσουμε μια κλάση και έναν κανόνα για να συλλέξουμε όλα τα σφάλματα. Θα προσθέσετε όλα τα σφάλματα χρησιμοποιώντας την addError(throwable) εδώ.

Δείτε τον παρακάτω κώδικα, ο οποίος απλώς δημιουργεί έναν κανόνα που δεν είναι τίποτα άλλο παρά ένα "αντικείμενο Error Collector". Χρησιμοποιείται περαιτέρω για την προσθήκη όλων των σφαλμάτων προκειμένου να αναφερθεί το πρόβλημα στο τέλος:

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

Ας προσθέσουμε την παραπάνω κλάση δοκιμής σε έναν εκτελέστη δοκιμής και ας την εκτελέσουμε για να συλλέξουμε όλα τα σφάλματα. Δείτε τον παρακάτω κώδικα:

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());							
   }		
}      

Παραγωγή:

Δείτε την αποτυχία tracε, το οποίο tracόλα τα σφάλματα σε ένα μέρος. JUnit Η προβολή μετράει μία εκτέλεση αλλά αναφέρει δύο σφάλματα και μία αποτυχία, το καθένα με τον δικό του αριθμό γραμμής:

Eclipse JUnit αποτυχία tracπαραθέτοντας δύο σφάλματα που μπορούν να ριχτούν και ένα σφάλμα ισχυρισμού που συλλέχθηκαν σε μία μόνο εκτέλεση

Οφέλη της JUnit ErrorCollector

Μπορείτε να χρησιμοποιήσετε ένα JUnit ισχυρισμός για λειτουργική ή GUI επικύρωση, για παράδειγμα:

  1. assertEquals(Μήνυμα συμβολοσειράς, Αναμενόμενο αντικείμενο, Πραγματικό αντικείμενο), το οποίο συγκρίνει ότι δύο αντικείμενα είναι ίσα.
  2. Ομοίως, το assertTrue(Boolean condition) βεβαιώνει ότι μια συνθήκη είναι αληθής.

Χρησιμοποιώντας ισχυρισμούς, οι δοκιμές επικύρωσης γίνονται εύκολες. Αλλά ένα σημαντικό ζήτημα είναι ότι η εκτέλεση των δοκιμών θα σταματήσει ακόμη και αν αποτύχει ένας μόνο ισχυρισμός.

Η συνέχεια των δοκιμών και ο χειρισμός της ανάκτησης είναι ζωτικής σημασίας για την επιτυχία του αυτοματισμού των δοκιμών και έχουν τη μεγαλύτερη σημασία σε μακροπρόθεσμες Selenium ροές όπου η επανεκκίνηση ενός προγράμματος περιήγησης μετά από κάθε αποτυχημένο έλεγχο είναι δαπανηρή. Το Error Collector είναι ο καλύτερος τρόπος για την αντιμετώπιση τέτοιων σεναρίων.

Συχνές Ερωτήσεις

Η συνάρτηση addError(Throwable) καταγράφει ένα σφάλμα που έχετε ήδη εντοπίσει ή δημιουργήσει. Η συνάρτηση checkThat(value, matcher) αξιολογεί έναν matcher Hamcrest και καταγράφει αυτόματα μια αναντιστοιχία, έτσι ώστε να διαβάζεται σαν ισχυρισμός ενώ εξακολουθεί να επιτρέπει την εκτέλεση των υπόλοιπων εντολών.

Ναι. Η μέθοδος εκτελείται μέχρι να ολοκληρωθεί, τότε JUnit το σημειώνει ως αποτυχημένο και εκτυπώνει κάθε συλλεγμένο ρίψιμο στην αποτυχία tracε. Το παράδειγμα στιγμιότυπου οθόνης αναφέρει δύο σφάλματα και μία αποτυχία από μία μόνο μέθοδο δοκιμής.

JUnit σαρώνει την κλάση δοκιμής για πεδία δημόσιας παρουσίας με σχολιασμό @Rule και εφαρμόζει το καθένα γύρω από κάθε μέθοδο δοκιμής. Ένα ιδιωτικό ή στατικό πεδίο αγνοείται και JUnit προκαλεί σφάλμα αρχικοποίησης αντί να εκτελέσει τη δοκιμή.

Όχι. Ο Jupiter απέσυρε τον μηχανισμό κανόνων, επομένως το org.junit.rules.ErrorCollector υπάρχει μόνο στο JUnit 4. Χρησιμοποιήστε την Assertions.assertAll() για ομαδοποιημένους ισχυρισμούς ή προσθέστε AssertJ SoftAssertions όταν χρειάζονται πιο εμπλουτισμένα ταιριάσματα.

Ναι, και είναι ένα συνηθισμένο μοτίβο. Μια σελίδα με πολλά πεδία μπορεί να επικυρωθεί με ένα πέρασμα, συλλέγοντας κάθε αναντιστοιχία αντί να διακοπεί η διαδικασία στην πρώτη, γεγονός που αποτρέπει την επανεκκίνηση της περιόδου λειτουργίας του προγράμματος περιήγησης για κάθε ελάττωμα που εντοπίζεται.

Και οι δύο αναβάλλουν την αναφορά, αλλά το SoftAssert απαιτεί μια ρητή κλήση assertAll() στο τέλος της δοκιμής, ενώ το ErrorCollector αναφέρει αυτόματα όταν η μέθοδος επιστρέφει. Ξεχνώντας το assertAll() στο TestNG κρύβει σιωπηλά τις αποτυχίες.

Οι βοηθοί τεχνητής νοημοσύνης ομαδοποιούν μια μακρά αποτυχία tracαπό την βασική αιτία, έτσι ώστε είκοσι συλλεγμένα ρίψιμα στοιχεία να μειώνονται σε μια χούφτα ξεχωριστών ελαττωμάτων. Υποδεικνύουν επίσης ποιοι έλεγχοι ανήκουν μαζί σε μία συλλεγμένη εκτέλεση και όχι σε ξεχωριστές δοκιμές.

GitHub Copilot γράφει εύκολα το πεδίο @Rule, αλλά συχνά το αναμειγνύει με μια κλάση δοκιμών Jupiter όπου δεν υπάρχουν κανόνες. Επιβεβαιώστε ότι οι εισαγωγές είναι org.junit πριν εκτελέσετε τη σουίτα.

Συνοψίστε αυτήν την ανάρτηση με: