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

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

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

Ρύθμιση Pytest

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

Για να δημιουργήσετε ένα εικονικό περιβάλλον, εκτελέστε την ακόλουθη εντολή πριν εγκαταστήσετε το Pytest.

python -m venv τεστ

Αυτό θα δημιουργήσει ένα νέο εικονικό περιβάλλον με το όνομα tests στον τρέχοντα κατάλογο σας. Για να ενεργοποιήσετε το περιβάλλον, εκτελέστε αυτήν την εντολή εάν χρησιμοποιείτε Linux ή Mac:

instagram viewer
δοκιμές πηγής/bin/ενεργοποίηση

Για Windows, εκτελέστε αυτήν την εντολή:

tests\\Scripts\\ενεργοποίηση

Για να εγκαταστήσετε το Pytest, μπορείτε να χρησιμοποιήσετε το pip, τον διαχειριστή πακέτων Python, με αυτήν την εντολή στο τερματικό σας:

pip εγκατάσταση pytest

Εάν δεν έχετε Pip, μην ανησυχείτε. μπορείς εγκαταστήστε το Pip σε Windows, Mac και Linux.

Εκτελέστε την ακόλουθη εντολή για να ελέγξετε εάν εγκαταστήσατε σωστά το Pytest.

pytest -- έκδοση

Αυτό θα πρέπει να επιστρέψει τον αριθμό της εγκατεστημένης έκδοσης.

Δημιουργώντας το πρώτο σας τεστ

Θεωρήστε την παρακάτω συνάρτηση που προσθέτει δύο αριθμούς και επιστρέφει το αποτέλεσμα.

defadd_numbers(α, β):
ΕΠΙΣΤΡΟΦΗ α + β

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

Ένα από τα πρώτα τεστ που θα γράψετε θα πρέπει να ελέγξει εάν η συνάρτηση επιστρέφει το αναμενόμενο αποτέλεσμα. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί διεκδίκησης για να συγκρίνετε την πραγματική έξοδο της συνάρτησης με την αναμενόμενη έξοδο. Στην περίπτωση της συνάρτησης add_numbers, η συνάρτηση δοκιμής μπορεί να μοιάζει με αυτό:

deftest_add_numbers():
διεκδικώ add_numbers(2, 3) == 5
διεκδικώ add_numbers(-1, 1) == 0
διεκδικώ add_numbers(0, 0) == 0

Αυτή η συνάρτηση δοκιμής περιλαμβάνει τρεις δηλώσεις ισχυρισμού, καθεμία από τις οποίες συγκρίνει την έξοδο της συνάρτησης add_numbers με μια αναμενόμενη τιμή. Η πρώτη δοκιμή ελέγχει ότι η προσθήκη 2 και 3 επιστρέφει 5, η δεύτερη δοκιμή ελέγχει ότι η προσθήκη -1 και 1 επιστρέφει 0 και η τρίτη δοκιμή ελέγχει ότι η προσθήκη 0 και 0 επιστρέφει 0.

Πώς να εκτελέσετε δοκιμές με το Pytest

Αφού γράψετε τις δοκιμές σας, το επόμενο βήμα είναι να τις εκτελέσετε. Για να το κάνετε αυτό με το Pytest, μεταβείτε στον κατάλογο που περιέχει το δοκιμαστικό σας αρχείο και εκτελέστε την εντολή pytest:

pytest

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

Για παράδειγμα, ας υποθέσουμε ότι εκτελέσατε την ακόλουθη δοκιμαστική λειτουργία για τη συνάρτηση add_numbers:

deftest_add_numbers():
διεκδικώ add_numbers(2, 3) == 6
διεκδικώ add_numbers(-1, 1) == 0
διεκδικώ add_numbers(0, 0) == 0

Ο πρώτος ισχυρισμός θα αποτύχει επειδή η αναμενόμενη τιμή ήταν 6, αλλά η πραγματική τιμή ήταν 5 (το άθροισμα των 2 και 3). Το Pytest θα επιστρέψει το ακόλουθο μήνυμα:

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

Χρησιμοποιώντας το Pytest.raises για τη διεκδίκηση εξαιρέσεων

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

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

Για να το κάνετε αυτό, αντιγράψτε την παρακάτω δοκιμαστική λειτουργία στο αρχείο σας. Χρησιμοποιεί τη διαχείριση περιβάλλοντος pytest.raises για να ελέγξει εάν η κλήση της συνάρτησης add_number με "Καμία" δημιουργεί μια εξαίρεση TypeError.

εισαγωγή pytest

deftest_add_numbers_with_invalid_inputs():
με pytest.raises (TypeError):
add_numbers(Κανένας, 2)

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

Μπορείτε να προχωρήσετε περαιτέρω και να ελέγξετε τις λεπτομέρειες του μηνύματος εξαίρεσης. Ο διαχειριστής περιβάλλοντος δημιουργεί ένα αντικείμενο ExceptionInfo με τις λεπτομέρειες.

Για παράδειγμα, σε αυτήν τη συνάρτηση δοκιμής, υποβάλετε το μήνυμα εξαίρεσης ως εξής:

deftest_add_numbers_with_invalid_inputs():
με pytest.raises(Τυπογραφικό λάθος) όπως και exc_info:
add_numbers(Κανένας, 2)

διεκδικώ exc_info.value.args[0] == "μη υποστηριζόμενοι τύποι τελεστών για +: "NoneType" και "int""

Εάν το μήνυμα δεν ταιριάζει με αυτό στη δοκιμή, το Pytest θα υποδείξει μια αποτυχία.

Πώς να χρησιμοποιήσετε την παραμετροποιημένη δοκιμή για να ελέγξετε πολλές εισόδους ταυτόχρονα

Αντί να καλέσετε με μη αυτόματο τρόπο μια συνάρτηση με πολλές εισόδους όπως αυτή:

deftest_add_numbers():
διεκδικώ add_numbers(2, 3) == 6
διεκδικώ add_numbers(-1, 1) == 0
διεκδικώ add_numbers(0, 0) == 0

Το Pytest παρέχει μια δυνατότητα παραμετροποιημένης δοκιμής που σας επιτρέπει να κάνετε το ίδιο πράγμα πιο εύκολα. Δείτε πώς μπορείτε να ξαναγράψετε τη συνάρτηση δοκιμής παραπάνω:

εισαγωγή pytest

@pytest.mark.parametrize("α, β, αναμενόμενο", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(α, β, αναμενόμενο):
διεκδικώadd_numbers(α, β)== αναμενόμενο

Πώς να εκτελέσετε πολλαπλές δοκιμές

Μέχρι στιγμής, έχετε γράψει μόνο δύο δοκιμές για τη συνάρτηση add_numbers. Για πιο σύνθετες συναρτήσεις με περισσότερες δοκιμές, μπορεί να θέλετε να τις ομαδοποιήσετε σε μια τάξη.

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

τάξηTestAddFunction:
@pytest.mark.parametrize("a, b, αναμενόμενη", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_addition_with_numbers(εαυτός, α, β, αναμενόμενο):
διεκδικώ add_numbers (a, b) == αναμένεται

deftest_add_numbers_with_invalid_inputs(εαυτός):
με pytest.raises (TypeError) όπως και exc_info:
add_numbers(Κανένας, 2)
διεκδικώ exc_info.value.args[0] == "μη υποστηριζόμενοι τύποι τελεστών για +: "NoneType" και "int""

Σημειώστε ότι πρέπει να προσθέσετε το πρόθεμα στο όνομα της κλάσης με "Test" έτσι ώστε το Pytest να μπορεί να το αναγνωρίσει ως δοκιμαστική κλάση και να το εκτελέσει.

Το Pytest έχει πολλά περισσότερα χαρακτηριστικά

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

Επιπλέον, μπορείτε να ενσωματώσετε το Pytest στη διοχέτευση CI και να ξεκινήσετε να εκτελείτε δοκιμές αυτόματα και συνεχώς όταν αλλάζετε τον κώδικά σας.