δημιουργώ JUnit Δοκιμαστική σουίτα με Παράδειγμα: @RunWith @SuiteClasses

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

JUnit Οι σουίτες δοκιμών συγκεντρώνουν περιπτώσεις δοκιμών από διάφορες κλάσεις, ώστε να εκτελούνται μαζί σε ένα μόνο πέρασμα, καθοδηγούμενες από τις σχολιασμοί @RunWith(Suite.class) και @SuiteClasses και εκκινούμενες μέσω μιας συνηθισμένης κλάσης εκτέλεσης δοκιμών.

  • 🔘 Σκοπός: Ομαδοποιήστε δοκιμές από πολλές κλάσεις σε μία εκτελέσιμη ενότητα αντί να εκκινείτε κάθε κλάση δοκιμής ξεχωριστά.
  • ☑️ Σχολιασμοί: Το @RunWith(Suite.class) αναθέτει την εκτέλεση, ενώ το @SuiteClasses παραθέτει κάθε κλάση που πρέπει να εκτελέσει η σουίτα.
  • Βήματα: Γράψτε τις κλάσεις δοκιμών, προσθέστε μια κλάση κατόχου που φέρει και τις δύο σχολιασμούς και, στη συνέχεια, εκτελέστε την από ένα JUnitΔρομέας πυρήνα.
  • 🧪 Παράδειγμα: Το JunitTest.java ομαδοποιεί τα SuiteTest1 και SuiteTest2 και η κονσόλα αναφέρει τρεις επιτυχείς δοκιμές.
  • JUnit 5: Ο Jupiter αντικαθιστά τον runner με το @Suite συν @SelectClasses ή @SelectPackages στη μηχανή της σουίτας πλατφόρμας.
  • 📌 Παγίδες: Οι κενές σουίτες, οι ελλείπουσες εισαγωγές και μια κλάση σουίτας που περιέχει τις δικές της μεθόδους @Test προκαλούν τις περισσότερες αποτυχίες.

δημιουργώντας μια JUnit σουίτα δοκιμών με σχολιασμούς @RunWith και @SuiteClasses

In JUnit, μια σουίτα δοκιμών μας επιτρέπει να συγκεντρώσουμε όλα περιπτώσεις δοκιμής από πολλές τάξεις σε ένα μέρος και να τις εκτελέσετε μαζί.

Για να εκτελέσετε τη δοκιμή της σουίτας, πρέπει να σχολιάσετε μια κλάση χρησιμοποιώντας τις παρακάτω σχολιασμούς:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) ή @Suite.SuiteClasses({test1.class, test2.class…})

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

Βήματα για τη δημιουργία Test Suite και Test Runner

Τα τέσσερα παρακάτω βήματα δημιουργούν τη μικρότερη σουίτα που εκτελείται στην πραγματικότητα: δύο συνηθισμένες κλάσεις δοκιμών, μια κλάση σουίτας που τις ονομάζει και ένας εκτελέστης που ξεκινά τη σουίτα από μια μέθοδο main.

Βήμα 1) Δημιουργήστε μια απλή κλάση δοκιμής (π.χ. MyFirstClassTest) και προσθέστε μια μέθοδο με σχολιασμό @Δοκιμή.

Η πρώτη κλάση περιέχει μία μόνο κενή μέθοδο δοκιμής, η οποία είναι αρκετή για να αποδείξει ότι η σουίτα την αναλαμβάνει:

MyFirstClassΔοκιμαστική τάξη στο Eclipse η δήλωση ενός @Test σχολίασε το myFirstMethod

Βήμα 2) Δημιουργήστε μια άλλη κλάση δοκιμής για προσθήκη (π.χ. MySecondClassTest) και δημιουργήστε μια μέθοδο με σχολιασμό @Test.

Η δεύτερη κλάση ακολουθεί ακριβώς το ίδιο σχήμα, επομένως η σουίτα έχει δύο ξεχωριστές κλάσεις για συγκέντρωση:

MySecondClassΔοκιμαστική τάξη στο Eclipse Η δήλωση ενός @Test σχολίασε το mySecondMethod

Βήμα 3) Για να δημιουργήσετε ένα testSuite, πρέπει πρώτα να προσθέσετε σχόλια στην κλάση με @RunWith(Suite.class) και @SuiteClasses(class1.class, class2.class…).

Παρατηρήστε ότι η κλάση suite TestSuiteExample δεν δηλώνει καμία δική της μέθοδο δοκιμής — οι δύο σχολιασμοί φέρουν όλες τις πληροφορίες:

TestSuiteExample με σχολιασμό @RunWith(Suite.class) και @SuiteClasses που ονομάζουν MyFirstClassTest και MySecondClassTest

Βήμα 4) Δημιουργήστε μια κλάση Test Runner για να εκτελέσετε τη σουίτα δοκιμών μας όπως φαίνεται παρακάτω:

Ο δρομέας είναι απλός Java κλάση με μια μέθοδο main που παραδίδει την κλάση suite σε JUnitΠυρήνας:

Κλήση κλάσης δοκιμαστικού δρομέα JUnitCore.runClasses στο TestSuiteExample και εκτύπωση της λίστας αποτυχιών

Code Επεξήγηση:

  • Code Γραμμή 8: Δηλώνοντας την κύρια μέθοδο της κλάσης Test που θα εκτελέσει την JUnit δοκιμή.
  • Code Γραμμή 9: Εκτέλεση δοκιμαστικών περιπτώσεων χρησιμοποιώντας JUnitCore.runClasses που λαμβάνει το όνομα της κλάσης δοκιμής ως παράμετρο (Στο παραπάνω παράδειγμα, χρησιμοποιείτε το TestSuiteExample.class που φαίνεται στο βήμα 3).
  • Code Γραμμή 11: Επεξεργασία του αποτελέσματος χρησιμοποιώντας έναν βρόχο for και εκτύπωση του αποτυχημένου αποτελέσματος.
  • Code Γραμμή 13: Εκτύπωση του επιτυχημένου αποτελέσματος.

Παραγωγή: Εδώ είναι το αποτέλεσμα που δείχνει μια επιτυχημένη δοκιμή χωρίς αποτυχία tracε όπως αναφέρεται παρακάτω:

Eclipse JUnit προβολή αναφορών Εκτελέσεις 2/2 με μηδενικά σφάλματα και μηδενικές αποτυχίες για το TestSuiteExample

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

JUnit Παράδειγμα δοκιμαστικής σουίτας

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

JunitTest.java

Το JunitTest.java είναι μια απλή κλάση με σχόλια @RunWith και @Σουίτα σχολιασμοί. Μπορείτε να καταχωρίσετε οποιονδήποτε αριθμό κλάσεων στη σουίτα ως παραμέτρους, όπως δίνεται παρακάτω:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java είναι μια κλάση δοκιμών που έχει μεθόδους δοκιμών που εκτυπώνουν ένα μήνυμα, όπως δίνεται παρακάτω. Θα χρησιμοποιήσετε αυτήν την κλάση ως μέλος της σουίτας στην κλάση που αναφέρθηκε παραπάνω. Βασίζεται σε μια βοηθητική κλάση με όνομα JUnitΜήνυμα, το οποίο ορίζεται αλλού στο ίδιο πακέτο και δεν αναπαράγεται εδώ.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java είναι μια άλλη κατηγορία δοκιμών, παρόμοια με SuiteTest1.java, έχοντας μια δοκιμαστική μέθοδο για την εκτύπωση ενός μηνύματος όπως δίνεται παρακάτω. Θα χρησιμοποιήσετε αυτήν την κλάση ως μέλος της σουίτας στο JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

Παραγωγή

Μετά την εκτέλεση JunitTest.java, το οποίο περιέχει μια σουίτα που περιέχει SuiteTest1.java και SuiteTest2.java, θα λάβετε την παρακάτω έξοδο. Η κονσόλα εκτυπώνει τα μηνύματα που παράγονται και από τις δύο κλάσεις:

Eclipse Η κονσόλα εμφανίζει τα εκτυπωμένα μηνύματα και από τις δύο κλάσεις σουίτας μετά την ολοκλήρωση του JunitTest

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

Eclipse JUnit προβολή αναφορών Εκτελείται 3/3 πράσινο για JunitTest με εκτεταμένα SuiteTest1 και SuiteTest2

Σημείωση: Οι ετικέτες κονσόλας σε αυτό το παράδειγμα είναι διασταυρωμένες — η συμβολοσειρά που εκτυπώνεται από το SuiteTest1 αναφέρει "Suite Test 2" και αυτή που εκτυπώνεται από το SuiteTest2 αναφέρει "Suite Test 1". Οι αρχικές καταχωρίσεις αναπαράγονται αμετάβλητες, επομένως οι ετικέτες παραμένουν όπως τις έγραψε ο συγγραφέας. Διαβάστε το όνομα της κλάσης στο JUnit προβολή αντί για την εκτυπωμένη ετικέτα όταν αντιστοιχίζετε την έξοδο με την πηγή.

Πώς να δημιουργήσετε μια σουίτα δοκιμών στο JUnit 5

JUnit Το 5 αφαιρεί εντελώς τους runners, επομένως το @RunWith(Suite.class) δεν υπάρχει στα πακέτα org.junit.jupiter. Οι σουίτες μετακινήθηκαν στο JUnit Πλατφόρμα, η οποία τα αποστέλλει σε ξεχωριστό τεχνούργημα που ονομάζεται junit-platform-suite-engineΠροσθέστε αυτήν την εξάρτηση και, στη συνέχεια, σχολιάστε μια κλάση με @Suite και μία από τις σχολιασμούς του επιλογέα.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

Οι σχολιασμοί του επιλογέα αντικαθιστούν τη μοναδική λίστα @SuiteClasses με μια μικρή οικογένεια επιλογών:

Σχόλιο Τι επιλέγει
@ΕπιλέξτεΤάξεις Μεμονωμένες κλάσεις δοκιμών που ονομάζονται μία προς μία, η άμεση αντικατάσταση του @SuiteClasses.
@ΕπιλέξτεΠακέτα Κάθε κλάση δοκιμής στο πακέτο με όνομα και σε όλα τα υποπακέτα του.
@IncludeClassNamePatterns Ένα φίλτρο κανονικής έκφρασης εφαρμόστηκε πάνω από την επιλογή.
@SuiteDisplayName Ένα ευανάγνωστο όνομα που εμφανίζεται στην αναφορά αντί για το όνομα της κλάσης.

Δύο ακόμη διαφορές έχουν σημασία στην πράξη. A JUnit Η κλάση 5 suite μπορεί να δηλώσει τις μεθόδους @BeforeSuite και @AfterSuite, οι οποίες εκτελούνται μία φορά σε ολόκληρη τη σουίτα, και η JUnit Το παραπάνω παράδειγμα 4 εξακολουθεί να εκτελείται στο JUnit Πλατφόρμα μέσω της μηχανής vintage, επομένως ο αρχικός κώδικας σε αυτήν τη σελίδα δεν χρειάζεται να ξαναγραφεί για να συνεχίσει να λειτουργεί.

Πλεονεκτήματα και περιορισμοί του JUnit Δοκιμαστικές Σουίτες

Μια σουίτα είναι μια ομάδαping μηχανισμός, όχι ένας πλαίσιο δοκιμών από μόνο του, και αυτό διαμορφώνει τόσο το τι κάνει καλά όσο και τα σημεία σταματώντας να είναι χρήσιμο.

Πλεονεκτήματα

  • Μία εκτόξευση τρέχει μαζί σχετικές κλάσεις, άρα ένα σετ καπνού ή ένα οπισθοδρόμηση Το set ξεκινά με μία μόνο εντολή.
  • Η προβολή αποτελεσμάτων ομαδοποιεί κάθε κλάση κάτω από έναν κόμβο σουίτας, γεγονός που διευκολύνει τον εντοπισμό μιας κοινόχρηστης αποτυχίας.
  • Η λίστα μελών βρίσκεται σε κώδικα, επομένως ελέγχεται και τροποποιείται όπως οποιοδήποτε άλλο αρχείο πηγαίου κώδικα.
  • Η ίδια κλάση suite μπορεί να ξεκινήσει από ένα IDE, από έναν runner όπως JUnitCore ή από ένα εργαλείο δημιουργίας.

Περιορισμοί

  • Το @SuiteClasses είναι μια λίστα με σκληρό κώδικα, επομένως μια νέα δοκιμαστική κλάση παραλείπεται σιωπηλά μέχρι κάποιος να επεξεργαστεί τη σουίτα.
  • Η σουίτα δεν παρέχει καμία εγγύηση παραγγελίας πέραν της σειράς με την οποία παρατίθενται οι κατηγορίες.
  • Τίποτα δεν μοιράζεται μεταξύ των κλάσεων-μελών, επομένως μια σουίτα δεν υποκαθιστά μια κλάση fixture ή μια βασική.
  • Τα εργαλεία δημιουργίας ανακαλύπτουν ήδη κλάσεις δοκιμών μέσω της σύμβασης ονομασίας, γεγονός που καθιστά μια σουίτα περιττή σε πολλά έργα.

Συνηθισμένα λάθη κατά τη δημιουργία ενός JUnit Δοκιμαστική Σουίτα

Τα περισσότερα προβλήματα της σουίτας παράγουν ένα σύντομο, άχρηστο μήνυμα. Ο πίνακας αντιστοιχίζει τα μηνύματα που είναι πιθανό να συναντήσετε με την αιτία και την επίλυσή τους.

Μήνυμα ή σύμπτωμα Αιτία σταθερός
initializationError: Δεν υπάρχουν εκτελέσιμες μέθοδοι Η κλάση εκτελείται ως μια συνηθισμένη δοκιμαστική κλάση, αλλά περιέχει μόνο σχολιασμούς. Προσθέστε την συνάρτηση @RunWith(Suite.class) έτσι ώστε ο εκτελέστης της σουίτας να αναλάβει αντί για τον προεπιλεγμένο εκτελέστη.
Δεν είναι δυνατή η εύρεση του συμβόλου: κλάση Suite Η εισαγωγή του Suite λείπει. Εισαγάγετε το org.junit.runners.Suite παράλληλα με το org.junit.runner.RunWith.
Η σουίτα λειτουργεί, αλλά παραλείπεται ένα μάθημα Η τάξη δεν προστέθηκε ποτέ στη λίστα @SuiteClasses. Προσθέστε την κλάση ρητά ή μετακινηθείτε στο @SelectPackages στο JUnit 5.
Το όνομα της κλάσης δεν γίνεται αποδεκτό από τον μεταγλωττιστή Το @Runwith ή το @suiteClasses πληκτρολογήθηκαν με λάθος κεφαλαία γράμματα. Java Οι σχολιασμοί κάνουν διάκριση πεζών-κεφαλαίων: γράψτε τα @RunWith και @SuiteClasses ακριβώς.
Οι δοκιμές στην ίδια την τάξη σουίτας δεν εκτελούνται ποτέ Μια μέθοδος @Test προστέθηκε στον κάτοχο της σουίτας. Κρατήστε την υποδοχή κενή και μετακινήστε τη μέθοδο δοκιμής σε μια κλάση-μέλος.

Γράφοντας τη σουίτα μία φορά και διατηρώνταςping είναι η πραγματική δουλειά. Εάν η λίστα αποκλίνει από τις κλάσεις στο δίσκο, η σουίτα αναφέρει πράσινο ενώ μέρος του δοκιμή μονάδας Το set δεν εκτελείται ποτέ, μία από τις πιο αθόρυβες λειτουργίες αστοχίας στο δοκιμές λογισμικού.

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

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

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

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

Δεύτερος πιλότος γράφει το ζεύγος σχολίων γρήγορα, αλλά συχνά αναμειγνύεται JUnit 4 και JUnit 5 εισαγωγές στο ίδιο αρχείο. Ελέγξτε ότι τα org.junit.runners.Suite και org.junit.platform.suite.api.Suite δεν εμφανίζονται ποτέ μαζί, επειδή μόνο ένα από αυτά ταιριάζει με το αρχείο εκτέλεσής σας.

Προσθέστε το junit-platform-suite-engine στο πεδίο δοκιμής. Οι σχολιασμοί @Suite και @SelectClasses βρίσκονται στο junit-platform-suite-api, το οποίο αυτό το artifact της μηχανής τραβάει μεταβατικά, επομένως μια μόνο εξάρτηση είναι συνήθως αρκετή.

Συνήθως όχι. Το Surefire και το Gradle Η δοκιμαστική εργασία ανακαλύπτει ήδη τις δοκιμαστικές κλάσεις ονομάζοντας το μοτίβο και εκτελώντας τες όλες. Αξίζει να γράψετε μια σουίτα όταν θέλετε ένα ονομασμένο υποσύνολο, όπως ένα σύνολο καπνού, που είναι μικρότερο από την πλήρη εκτέλεση.

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

Όχι μέσα σε μία λίστα επιλογής. Διατηρήστε το JUnit 4 κλάσεις στον vintage κινητήρα και επιλέξτε τες από ένα JUnit 5 σουίτες ανά πακέτο, έτσι ώστε και οι δύο κινητήρες να λειτουργούν με τον ίδιο τρόπο JUnit Εκκίνηση πλατφόρμας χωρίς ανάμειξη οικογενειών σχολιασμών.

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