JUnit Οδηγός σχολιασμών με Παράδειγμα: Τι είναι το @Test και το @After
⚡ Έξυπνη Σύνοψη
JUnit Οι σχολιασμοί είναι μια μορφή συντακτικών μεταδεδομένων που προστίθενται σε Java πηγαίο κώδικα, ώστε ένας δοκιμαστής να γνωρίζει ποιες μεθόδους να εκτελέσει, πότε να τις εκτελέσει και πόσο χρόνο μπορεί να χρειαστεί η καθεμία.

Τι είναι JUnit Σχολιασμοί;
JUnit σχολιασμούς είναι μια ειδική μορφή συντακτικών μεταδεδομένων που μπορούν να προστεθούν σε Java πηγαίος κώδικας για καλύτερη αναγνωσιμότητα και δομή κώδικα. Μεταβλητές, παράμετροι, πακέτα, μέθοδοι και κλάσεις μπορούν να σχολιαστούν. Οι σχολιασμοί εισήχθησαν στο JUnit 4, το οποίο καθιστά Java κώδικας πιο ευανάγνωστος και απλός. Αυτή είναι η μεγάλη διαφορά μεταξύ JUnit 3 και JUnit 4: JUnit Το 4 βασίζεται σε σχολιασμούς.
Με μια πρακτική γνώση αυτών των σχολιασμών, μπορεί κανείς εύκολα να μάθει και να εφαρμόσει ένα JUnit δοκιμή. Παρακάτω είναι τα σημαντικά και συχνά χρησιμοποιούμενα JUnit λίστα σχολίων, με το JUnit 5 (Δίας) ισοδύναμο δίπλα σε κάθε ένα:
| S.No. | Οι σχολιασμοί | Περιγραφή | JUnit 5 ισοδύναμα |
|---|---|---|---|
| 1. | @Δοκιμή | Αυτή η σχολίαση αντικαθιστά την junit.framework.TestCase και υποδεικνύει ότι η μέθοδος public void στην οποία είναι συνδεδεμένη μπορεί να εκτελεστεί ως δοκιμαστική περίπτωση. | @Test (org.junit.jupiter.api) |
| 2. | @Πριν | Αυτός ο σχολιασμός χρησιμοποιείται εάν θέλετε να εκτελέσετε κάποια δήλωση, όπως προϋποθέσεις πριν από κάθε δοκιμαστική περίπτωση. | @ΠρινΚάθε |
| 3. | @Πριν το μάθημα | Αυτή η σχολίαση χρησιμοποιείται εάν θέλετε να εκτελέσετε ορισμένες εντολές πριν από όλες τις δοκιμαστικές περιπτώσεις, για παράδειγμα μια δοκιμαστική σύνδεση που πρέπει να ανοιχτεί πριν από όλες τις δοκιμαστικές περιπτώσεις. | @ΠρινΌλα |
| 4. | @Μετά | Αυτός ο σχολιασμός μπορεί να χρησιμοποιηθεί εάν θέλετε να εκτελέσετε ορισμένες εντολές μετά από κάθε μία Δοκιμαστική θήκη, για παράδειγμα, επαναφορά μεταβλητών ή διαγραφή προσωρινών αρχείων. | @AfterEach |
| 5. | @Μετά το μάθημα | Αυτή η σχολίαση μπορεί να χρησιμοποιηθεί εάν θέλετε να εκτελέσετε ορισμένες εντολές μετά από όλες τις δοκιμαστικές περιπτώσεις, για παράδειγμα, απελευθερώνοντας πόρους μετά την εκτέλεση όλων των δοκιμαστικών περιπτώσεων. | @AfterAll |
| 6. | @Αγνοώ | Αυτή η σχολίαση μπορεί να χρησιμοποιηθεί εάν θέλετε να αγνοήσετε ορισμένες εντολές κατά την εκτέλεση της δοκιμής, για παράδειγμα, απενεργοποιώντας ορισμένες περιπτώσεις δοκιμών κατά την εκτέλεση της δοκιμής. | @Ανάπηρος |
| 7. | @Test (timeout=500) | Αυτή η σχολίαση μπορεί να χρησιμοποιηθεί εάν θέλετε να ορίσετε κάποιο χρονικό όριο κατά την εκτέλεση της δοκιμής, για παράδειγμα εάν εργάζεστε βάσει μιας SLA (συμφωνίας επιπέδου υπηρεσιών) και οι δοκιμές πρέπει να ολοκληρωθούν εντός καθορισμένου χρονικού διαστήματος. | @Timeout ή assertTimeout |
| 8. | @Test(expected=IllegalArgumentException.class) | Αυτή η σχολίαση μπορεί να χρησιμοποιηθεί εάν θέλετε να χειριστείτε κάποια εξαίρεση κατά την εκτέλεση της δοκιμής. Για παράδειγμα, εάν θέλετε να ελέγξετε εάν μια συγκεκριμένη μέθοδος δημιουργεί μια συγκεκριμένη εξαίρεση ή όχι. | assertThrows |
JUnit Παράδειγμα σχολιασμών
Ας δημιουργήσουμε μια τάξη που καλύπτει σημαντικά JUnit σχολιασμούς με απλές εντολές εκτύπωσης και εκτελέστε τις με μια κλάση δοκιμαστικού δρομέα:
Βήμα 1) Λάβετε υπόψη τα παρακάτω Java κλάση που έχει διάφορες μεθόδους οι οποίες επισυνάπτονται στις παραπάνω αναφερόμενες σχολιασμοί:
JunitAnnotationsExample.java
package guru99.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.util.ArrayList; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class JunitAnnotationsExample { private ArrayList<String> list; @BeforeClass public static void m1() { System.out.println("Using @BeforeClass , executed before all test cases "); } @Before public void m2() { list = new ArrayList<String>(); System.out.println("Using @Before annotations ,executed before each test cases "); } @AfterClass public static void m3() { System.out.println("Using @AfterClass ,executed after all test cases"); } @After public void m4() { list.clear(); System.out.println("Using @After ,executed after each test cases"); } @Test public void m5() { list.add("test"); assertFalse(list.isEmpty()); assertEquals(1, list.size()); } @Ignore public void m6() { System.out.println("Using @Ignore , this execution is ignored"); } @Test(timeout = 10) public void m7() { System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case"); } @Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); } }
Βήμα 2) Ας δημιουργήσουμε μια κλάση test runner για να εκτελέσουμε την παραπάνω δοκιμή:
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(JunitAnnotationsExample.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println("Result=="+result.wasSuccessful()); } }
Αναμενόμενο Αποτέλεσμα
- Όλες οι δοκιμαστικές περιπτώσεις θα εκτελεστούν μία προς μία και όλες οι εντολές εκτύπωσης θα είναι ορατές σε μια κονσόλα.
- Όπως αναλύεται στον παραπάνω πίνακα, τα @Before και @BeforeClass στο JUnit Οι [μέθοδοι m2() και m1()] θα εκτελεστούν πριν από κάθε περίπτωση δοκιμής και πριν από όλες τις περιπτώσεις δοκιμής αντίστοιχα.
- Με τον ίδιο τρόπο @After και @AfterClass στο JUnit (οι μέθοδοι m4() και m3()) θα εκτελούνται μετά από κάθε περίπτωση δοκιμής και μετά από όλες τις περιπτώσεις δοκιμής αντίστοιχα. Η @Ignore (μέθοδος m6()) θα αντιμετωπίζεται ως αγνόηση της δοκιμής.
Ας αναλύσουμε τις δοκιμαστικές περιπτώσεις που χρησιμοποιήθηκαν στα παραπάνω Java τάξη αναλυτικά:
- Θεωρήστε τη μέθοδο m5() όπως δίνεται παρακάτω:
@Test
public void m5() {
list.add("test");
assertFalse(list.isEmpty());
assertEquals(1, list.size());
}
Στην παραπάνω μέθοδο, καθώς προσθέτετε μια συμβολοσειρά στη μεταβλητή "list":
- list.isEmpty() θα επιστρέψει ψευδής.
- assertFalse(list.isEmpty()) πρέπει να επιστρέψει αληθινό.
- Ως αποτέλεσμα, η δοκιμαστική περίπτωση θα passieren.
Καθώς έχετε προσθέσει μόνο μία συμβολοσειρά στη λίστα, το μέγεθος είναι ένα.
- list.size() πρέπει να επιστρέψει την ακέραιη τιμή «1».
- So assertEquals(1, list.size()) πρέπει να επιστρέψει αληθινό.
- Ως αποτέλεσμα, η δοκιμαστική περίπτωση θα passieren.
- Θεωρήστε τη μέθοδο m7() όπως δίνεται παρακάτω:
@Test(timeout = 10)
public void m7() {
System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
}
Όπως αναφέρθηκε παραπάνω, @Test (timeout = 10) χρησιμοποιείται για την επιβολή χρονικού ορίου στην περίπτωση δοκιμής. Η τιμή είναι σε χιλιοστά του δευτερολέπτου, επομένως η συνάρτηση m7() πρέπει να ολοκληρωθεί εντός 10 ms.
- Θεωρήστε τη μέθοδο m8() όπως δίνεται παρακάτω:
@Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); }
Όπως αναφέρθηκε παραπάνω, @Test (αναμενόμενο) θα ελέγξει για την καθορισμένη εξαίρεση κατά την εκτέλεσή της, επομένως η μέθοδος m8() θα ρίξει την εντολή "Δεν υπάρχει τέτοια εξαίρεση μεθόδου". Ως αποτέλεσμα, η δοκιμή θα εκτελεστεί με μια εξαίρεση.
Σημείωση ακρίβειας: Η m8() εκτυπώνει μόνο μια γραμμή, επομένως η δηλωμένη εξαίρεση δεν δημιουργείται ποτέ στην πραγματικότητα και JUnit Το 4 αναφέρει ότι η δοκιμή αποτυχημένη. Ευθυγραμμίστε τον αναμενόμενο τύπο με αυτό που πραγματικά παράγει η μέθοδος. JUnit 5 γράφει αυτό με assertThrows.
Καθώς όλες οι περιπτώσεις δοκιμής περνούν, αυτό έχει ως αποτέλεσμα την επιτυχή εκτέλεση της δοκιμής.
Πραγματικό αποτέλεσμα
Καθώς υπάρχουν τρεις περιπτώσεις δοκιμών στο παραπάνω παράδειγμα, όλες οι περιπτώσεις δοκιμών θα εκτελεστούν μία προς μία. Δείτε το στιγμιότυπο οθόνης της κονσόλας παρακάτω:

Δείτε παρακάτω δηλώσεις εκτύπωσης που μπορείτε να δείτε στην κονσόλα:
Χρησιμοποιώντας το @BeforeClass , που εκτελείται πριν από όλες τις δοκιμαστικές περιπτώσεις
Χρησιμοποιώντας σχολιασμούς @Before, που εκτελούνται πριν από κάθε δοκιμαστική περίπτωση
Χρησιμοποιώντας το @After, εκτελείται μετά από κάθε δοκιμαστική περίπτωση
Χρησιμοποιώντας σχολιασμούς @Before, που εκτελούνται πριν από κάθε δοκιμαστική περίπτωση
Χρησιμοποιώντας το @Test(timeout), μπορεί να χρησιμοποιηθεί για την επιβολή του timeout in JUnit4 δοκιμαστική περίπτωση
Χρησιμοποιώντας το @After, εκτελείται μετά από κάθε δοκιμαστική περίπτωση
Χρησιμοποιώντας σχολιασμούς @Before, που εκτελούνται πριν από κάθε δοκιμαστική περίπτωση
Χρησιμοποιώντας το @Test(expected) , θα ελέγξει για καθορισμένη εξαίρεση κατά την εκτέλεσή του
Χρησιμοποιώντας το @After, εκτελείται μετά από κάθε δοκιμαστική περίπτωση
Χρησιμοποιώντας το @AfterClass, που εκτελείται μετά από όλες τις δοκιμαστικές περιπτώσεις
JUnit Επιβεβαίωση Τάξης
Οι σχολιασμοί αποφασίζουν πότε εκτελείται μια μέθοδος, ενώ οι μέθοδοι assert αποφασίζουν εάν θα είναι επιτυχής.
Αυτή η κλάση παρέχει μια δέσμη μεθόδων ισχυρισμού που είναι χρήσιμες στη σύνταξη μιας δοκιμαστικής περίπτωσης. Εάν όλες οι εντολές assert είναι επιτυχείς, τα αποτελέσματα των δοκιμών είναι επιτυχή. Εάν οποιαδήποτε εντολή assert αποτύχει, τα αποτελέσματα των δοκιμών είναι αποτυχημένα. Η ειδική JUnit διεκδικώ Το σεμινάριο καλύπτει κάθε μέθοδο σε βάθος.
Όπως είδατε νωρίτερα, ο παρακάτω πίνακας περιγράφει σημαντικές μεθόδους Assert και την περιγραφή τους:
| S.No. | Μέθοδος | Περιγραφή |
|---|---|---|
| 1. | void assertEquals (αναμενόμενο boolean, πραγματικό boolean) | Ελέγχει εάν δύο τιμές είναι ίσες, παρόμοια με τη μέθοδο equals της κλάσης Object. |
| 2. | void assertFalse (συνθήκη Boolean) | Η λειτουργικότητα είναι να ελέγξει ότι μια συνθήκη είναι ψευδής. |
| 3. | void assertNotNull(Αντικείμενο) | Η λειτουργία "assertNotNull" είναι να ελέγχει ότι ένα αντικείμενο δεν είναι μηδενικό. |
| 4. | void assertNull(Αντικείμενο) | Η λειτουργία "assertNull" είναι να ελέγξετε ότι ένα αντικείμενο είναι μηδενικό. |
| 5. | void assertTrue (συνθήκη Boolean) | Η λειτουργία "assertTrue" είναι να ελέγξετε ότι μια συνθήκη είναι αληθής. |
| 6. | void fail() | Αν θέλετε να δημιουργήσετε ένα σφάλμα ισχυρισμού, η συνάρτηση fail() οδηγεί πάντα σε μια ετυμηγορία αποτυχίας. |
| 7. | void assertSame([Μήνυμα συμβολοσειράς] | Η λειτουργία "assertSame" είναι να ελέγξετε ότι τα δύο αντικείμενα αναφέρονται στο ίδιο αντικείμενο. |
| 8. | void assertNotSame([Μήνυμα συμβολοσειράς] | Η λειτουργία "assertNotSame" είναι να ελέγξει ότι τα δύο αντικείμενα δεν αναφέρονται στο ίδιο αντικείμενο. |
JUnit Τάξη Δοκιμαστικών Υποθέσεων
Για την εκτέλεση πολλαπλών δοκιμών, η κλάση TestCase είναι διαθέσιμη στο junit.framework πακέτο. Η σχολίαση @Test λέει JUnit ότι αυτή η μέθοδος public void (μια δοκιμαστική περίπτωση εδώ) στην οποία είναι συνδεδεμένη μπορεί να εκτελεστεί ως δοκιμαστική περίπτωση.
Σημείωση έκδοσης: TestCase, Αποτέλεσμα δοκιμής και TestSuite ανήκουν στην κληρονομιά junit.framework πακέτο από JUnit 3. Εξακολουθούν να υπάρχουν μέσα στο artifact του junit 4.x, αλλά οι δοκιμές που βασίζονται σε σχολιασμούς δεν επεκτείνουν το TestCase.
Ο παρακάτω πίνακας παρουσιάζει μερικές σημαντικές μεθόδους που είναι διαθέσιμες στο junit.framework.TestCase τάξη:
| S.No. | Μέθοδος | Περιγραφή |
|---|---|---|
| 1. | int countTestCases() | Αυτή η μέθοδος χρησιμοποιείται για να μετρήσει πόσες δοκιμαστικές περιπτώσεις εκτελούνται από το run (TestResult tr) μέθοδος. |
| 2. | TestResult createResult() | Αυτή η μέθοδος χρησιμοποιείται για τη δημιουργία α Αποτέλεσμα δοκιμής αντικείμενο. |
| 3. | Συμβολοσειρά getName () | Αυτή η μέθοδος επιστρέφει μια συμβολοσειρά που δεν είναι παρά a TestCase όνομα. |
| 4. | TestResult run() | Αυτή η μέθοδος χρησιμοποιείται για την εκτέλεση μιας δοκιμής, η οποία επιστρέφει ένα Αποτέλεσμα δοκιμής αντικείμενο. |
| 5. | void run (Αποτέλεσμα TestResult) | Αυτή η μέθοδος χρησιμοποιείται για την εκτέλεση μιας δοκιμής που έχει α Αποτέλεσμα δοκιμής αντικείμενο, το οποίο δεν επιστρέφει τίποτα. |
| 6. | void setName (Όνομα συμβολοσειράς) | Αυτή η μέθοδος χρησιμοποιείται για να ορίσετε το όνομα ενός TestCase. |
| 7. | void setUp() | Αυτή η μέθοδος χρησιμοποιείται για τη σύνταξη κώδικα συσχέτισης πόρων, για παράδειγμα για τη δημιουργία μιας σύνδεσης βάσης δεδομένων. |
| 8. | void tearDown() | Αυτή η μέθοδος χρησιμοποιείται για την εγγραφή κώδικα απελευθέρωσης πόρων, για παράδειγμα, την απελευθέρωση μιας σύνδεσης βάσης δεδομένων μετά την εκτέλεση μιας συναλλαγής. |
JUnit Τάξη Test Result
Όταν εκτελείτε μια δοκιμή, επιστρέφει ένα αποτέλεσμα (με τη μορφή Αποτέλεσμα δοκιμής αντικείμενο). Αυτό το αντικείμενο TestResult μπορεί να χρησιμοποιηθεί για την ανάλυση του αντικειμένου που προκύπτει. Αυτό το αποτέλεσμα της δοκιμής μπορεί να είναι είτε αποτυχημένο είτε επιτυχημένο.
Δείτε τον παρακάτω πίνακα για σημαντικές μεθόδους που χρησιμοποιούνται στην κλάση junit.framework.TestResult:
| S.No. | Μέθοδος | Περιγραφή |
|---|---|---|
| 1. | void addError (Δοκιμή δοκιμής, Throwable t) | Αυτή η μέθοδος χρησιμοποιείται εάν χρειάζεται να προσθέσετε ένα σφάλμα στη δοκιμή. |
| 2. | void addFailure (Δοκιμή δοκιμής, AssertionFailedError t) | Αυτή η μέθοδος χρησιμοποιείται εάν χρειάζεται να προσθέσετε μια αποτυχία στη λίστα αποτυχιών. |
| 3. | void endTest (Δοκιμή δοκιμής) | Αυτή η μέθοδος χρησιμοποιείται για να ειδοποιήσει ότι μια δοκιμή έχει εκτελεστεί (ολοκληρωθεί). |
| 4. | int errorCount() | Αυτή η μέθοδος χρησιμοποιείται για την ανίχνευση σφαλμάτων κατά την εκτέλεση της δοκιμής. |
| 5. | Απαρίθμηση Σφάλματα() | Αυτή η μέθοδος απλώς επιστρέφει μια συλλογή (μια απαρίθμηση εδώ) σφαλμάτων. |
| 6. | int dështimCount() | Αυτή η μέθοδος χρησιμοποιείται για να μετρήσει τον αριθμό των σφαλμάτων που εντοπίστηκαν κατά την εκτέλεση της δοκιμής. |
| 7. | άκυρη εκτέλεση (δοκιμή TestCase) | Αυτή η μέθοδος χρησιμοποιείται για την εκτέλεση μιας δοκιμαστικής περίπτωσης. |
| 8. | int runCount() | Αυτή η μέθοδος απλώς μετρά τις εκτελεσμένες δοκιμές. |
| 9. | void startTest (Δοκιμή δοκιμής) | Αυτή η μέθοδος χρησιμοποιείται για να ειδοποιήσει ότι έχει ξεκινήσει μια δοκιμή. |
| 10. | void stop() | Αυτή η μέθοδος χρησιμοποιείται για να σταματήσει η δοκιμαστική λειτουργία. |
JUnit Τάξη δοκιμαστικής σουίτας
Αν θέλετε να εκτελέσετε πολλαπλές δοκιμές με συγκεκριμένη σειρά, μπορείτε να το κάνετε συνδυάζοντας όλες τις δοκιμές σε ένα μέρος. Αυτό το μέρος ονομάζεται σουίτα δοκιμών και το JUnit σουίτα δοκιμών Το σεμινάριο παρουσιάζει ένα πλήρες παράδειγμα.
Δείτε τον παρακάτω πίνακα για σημαντικές μεθόδους που χρησιμοποιούνται στο junit.framework.TestSuite τάξη:
| S.No. | Μέθοδος | Περιγραφή |
|---|---|---|
| 1. | void addTest (Δοκιμή δοκιμής) | Αυτή η μέθοδος χρησιμοποιείται εάν θέλετε να προσθέσετε μια δοκιμή στη σουίτα. |
| 2. | void addTestSuite(Class testClass) | Αυτή η μέθοδος χρησιμοποιείται εάν θέλετε να καθορίσετε την κλάση κατά την προσθήκη μιας δοκιμής στη σουίτα. |
| 3. | int countTestCases() | Αυτή η μέθοδος χρησιμοποιείται εάν θέλετε να μετρήσετε τον αριθμό των περιπτώσεων δοκιμής. |
| 4. | Συμβολοσειρά getName () | Αυτή η μέθοδος χρησιμοποιείται για να πάρει το όνομα της δοκιμαστικής σουίτας. |
| 5. | void run (Αποτέλεσμα TestResult) | Αυτή η μέθοδος χρησιμοποιείται για την εκτέλεση μιας δοκιμής και τη συλλογή του αποτελέσματος της δοκιμής σε ένα Αποτέλεσμα δοκιμής αντικείμενο. |
| 6. | void setName (Όνομα συμβολοσειράς) | Αυτή η μέθοδος χρησιμοποιείται για να ορίσετε το όνομα του TestSuite. |
| 7. | Test testAt (int index) | Αυτή η μέθοδος χρησιμοποιείται εάν θέλετε να επιστρέψετε το τεστ σε ένα δεδομένο ευρετήριο. |
| 8. | int testCount() | Αυτή η μέθοδος χρησιμοποιείται εάν θέλετε να επιστρέψετε τον αριθμό των δοκιμών στη σουίτα. |
| 9. | προειδοποίηση στατικής δοκιμής (Μήνυμα συμβολοσειράς) | Αυτή η μέθοδος επιστρέφει μια δοκιμή που θα αποτύχει και θα καταγράψει ένα προειδοποιητικό μήνυμα. |
