Όταν χρησιμοποιείτε εκτεταμένα τα matchity matchuments, υπάρχουν αρκετές εκτιμήσεις απόδοσης που πρέπει να έχετε κατά νου. Ενώ το Mockito είναι γενικά αποτελεσματικό, η εκτεταμένη χρήση των επιχειρήματος matchers μπορεί να εισαγάγει κάποια γενικά έξοδα λόγω του τρόπου με τον οποίο οι διαδικασίες Mockito αυτοί οι matchers.
1.
- Αξιολόγηση του Matcher Argument: Όταν χρησιμοποιείτε επιχειρήματα αντιστοιχίας όπως το `eq ()`, `οποιοδήποτε ()` ή `anyString ()`, το mockito πρέπει να αξιολογήσει αυτούς τους matchers κατά το χρόνο εκτέλεσης. Αυτή η διαδικασία αξιολόγησης μπορεί να εισαγάγει ένα ελαφρύ γενικό κόστος σε σύγκριση με την άμεση μεταφορά ακριβών τιμών. Ωστόσο, αυτό το γενικό κόστος είναι συνήθως αμελητέο, εκτός αν ασχολείσαι με έναν πολύ μεγάλο αριθμό επικλήσεων ή σύνθετων αγώνων.2. Κανόνες συνδυασμού Matcher **
- Όλα τα επιχειρήματα πρέπει να χρησιμοποιούν matchers: Εάν χρησιμοποιείτε ένα επιχειρήμα για ένα επιχείρημα, όλα τα επιχειρήματα πρέπει να χρησιμοποιούν matchers. Αυτός ο κανόνας μπορεί να οδηγήσει σε πιο λεπτομερή κώδικα και ενδεχομένως περισσότερους επιβαρύνσεις εάν χρησιμοποιείτε matchers για όλα τα επιχειρήματα όταν μόνο κάποιος χρειάζεται μια συγκεκριμένη κατάσταση. Για παράδειγμα, εάν μια μέθοδος έχει τρεις παραμέτρους και θέλετε να χρησιμοποιήσετε `οποιοδήποτε ()` για ένα από αυτά, πρέπει να χρησιμοποιήσετε matchers και για τα άλλα δύο, ακόμη και αν θα μπορούσατε να χρησιμοποιήσετε ακριβείς τιμές.3. Custom Matchers **
- σύνθετη λογική: Ενώ το Mockito παρέχει ένα ευρύ φάσμα ενσωματωμένων matchers, ίσως χρειαστεί να δημιουργήσετε προσαρμοσμένους matchers για συγκεκριμένη λογική. Οι προσαρμοσμένοι matchers μπορούν να είναι πιο υπολογιστικά ακριβοί εάν περιλαμβάνουν σύνθετη λογική ή λειτουργίες. Αυτό οφείλεται στο γεγονός ότι απαιτούν την εφαρμογή της διεπαφής `argumentMatcher 'και καθορίζοντας μια μέθοδο` matches () `που μπορεί να εκτελέσει αυθαίρετους ελέγχους.4. Επαλήθευση πάνω από το κεφάλι **
- Επαλήθευση με τους matchers: Όταν επαληθεύει τις αλληλεπιδράσεις με ψεύτικα αντικείμενα χρησιμοποιώντας το `verify ()`, το Mockito χρησιμοποιεί επίσης matchers για να ελέγξει αν έχουν περάσει τα σωστά επιχειρήματα. Παρόμοια με το stubbing, η επαλήθευση με τους matchers μπορεί να εισαγάγει κάποια γενικά έξοδα, ειδικά αν επαληθεύετε πολλαπλές κλήσεις με σύνθετους matchers.5. Βέλτιστες πρακτικές για την απόδοση **
- Χρησιμοποιήστε σοφία την εξειδίκευση: Χρησιμοποιήστε τα matchers με το σωστό επίπεδο εξειδίκευσης. Για παράδειγμα, το `anyint ()` είναι λιγότερο συγκεκριμένο και ταχύτερο από το `eq (4)`, αλλά χρησιμοποιώντας το `eq (4)` όταν πρέπει να επαληθεύσετε μια συγκεκριμένη τιμή είναι πιο ακριβής και δεν επηρεάζει σημαντικά την απόδοση.- Αποφύγετε την περιττή πολυπλοκότητα: Αποφύγετε τη χρήση προσαρμοσμένων αγώνων εκτός εάν είναι απαραίτητο. Εάν μια δοκιμή απαιτεί σύνθετη λογική για να ταιριάζει με τα επιχειρήματα, σκεφτείτε να απλοποιήσετε τη δοκιμή ή να χρησιμοποιήσετε δημιουργικά τους υπάρχοντες matchers.
- Προφίλ Οι δοκιμές σας: Εάν παρατηρήσετε προβλήματα απόδοσης στις δοκιμές σας, προφίλ σας για να προσδιορίσετε τα σημεία συμφόρησης. Είναι σπάνιο για τους mockito matchers να είναι η κύρια αιτία σημαντικών προβλημάτων απόδοσης, αλλά είναι πάντα καλό να επαληθεύσετε.
Συνοπτικά, ενώ οι Mockito Argument Matchers εισάγουν κάποια γενικά έξοδα, αυτό γενικά δεν αποτελεί σημαντική ανησυχία, εκτός εάν ασχολείσαι με εξαιρετικά πολύπλοκες ή κρίσιμες επιδόσεις. Τα οφέλη από τη χρήση των matchers, όπως η ευελιξία και η σαφήνεια στον κώδικα δοκιμής, συνήθως αντισταθμίζουν το μικρό κόστος απόδοσης.
Αναφορές:[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-vs-passing-string-directly/56572275
[2] https://www.digitalocean.com/community/tutorials/mockito-argument-matchers-any-eq
[3] https://kenkousen.substack.com/p/tales-from-the-jar-side-a-mockito
[4] https://www.softwaretestinghelp.com/mockito-matchers/
[5] https://www.toptal.com/java/a-guide-to-everyday-mockito
[6] https://github.com/etorreborre/specs2/issues/854
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.mockito.additionalmatchers
[8] https://stackoverflow.com/questions/73046134/when-should-ius-argument-matcher-or-passing-argument-directly-when-mockito-uni