Η δοκιμή είναι ένα ουσιαστικό μέρος της ανάπτυξης λογισμικού. Βοηθά στην έγκαιρη αναγνώριση σφαλμάτων και μειώνει την πιθανότητα σφαλμάτων στη συνέχεια.
Το Pytest είναι ένα από τα πιο δημοφιλή πλαίσια δοκιμών για την Python. Σας επιτρέπει να γράφετε μικρά και ευανάγνωστα τεστ που μπορούν να κλιμακωθούν καθώς μεγαλώνει η αίτησή σας. Μάθετε πώς να ρυθμίζετε και να χρησιμοποιείτε το Pytest με τον κώδικα Python σας.
ΚΑΤΑΣΚΕΥΗ ΒΙΝΤΕΟ ΤΗΣ ΗΜΕΡΑΣ ΚΥΛΙΣΤΕ ΓΙΑ ΝΑ ΣΥΝΕΧΙΣΕΤΕ ΜΕ ΠΕΡΙΕΧΟΜΕΝΟ
Ρύθμιση Pytest
Πριν εγκαταστήσετε το Pytest, είναι καλύτερο δημιουργήστε ένα εικονικό περιβάλλον για να απομονώσετε το περιβάλλον δοκιμής σας, ώστε να αποφύγετε διενέξεις με άλλα πακέτα και εξαρτήσεις.
Για να δημιουργήσετε ένα εικονικό περιβάλλον, εκτελέστε την ακόλουθη εντολή πριν εγκαταστήσετε το Pytest.
python -m venv tests
Αυτό θα δημιουργήσει ένα νέο εικονικό περιβάλλον με το όνομα tests στον τρέχοντα κατάλογο σας. Για να ενεργοποιήσετε το περιβάλλον, εκτελέστε αυτήν την εντολή εάν χρησιμοποιείτε Linux ή Mac:
source tests/bin/activate
Για Windows, εκτελέστε αυτήν την εντολή:
tests\Scripts\activate
Για να εγκαταστήσετε το Pytest, μπορείτε να χρησιμοποιήσετε το pip, τον διαχειριστή πακέτων Python, με αυτήν την εντολή στο τερματικό σας:
pip install pytest
Εάν δεν έχετε Pip, μην ανησυχείτε. μπορείς εγκαταστήστε το Pip σε Windows, Mac και Linux .
Εκτελέστε την ακόλουθη εντολή για να ελέγξετε εάν εγκαταστήσατε σωστά το Pytest.
pytest --version
Αυτό θα πρέπει να επιστρέψει τον αριθμό της εγκατεστημένης έκδοσης.
Δημιουργώντας το πρώτο σας τεστ
Θεωρήστε την παρακάτω συνάρτηση που προσθέτει δύο αριθμούς και επιστρέφει το αποτέλεσμα.
def add_numbers(a, b):
return a + b
Πολλά πράγματα μπορεί να πάνε στραβά με αυτήν τη λειτουργία. Για παράδειγμα, σκεφτείτε τι θα συμβεί εάν καλέσετε τη συνάρτηση με μη αριθμητικές τιμές όπως None ή μια τιμή συμβολοσειράς τύπου. Αυτές είναι μερικές από τις πιθανές περιπτώσεις ακμών που μπορεί να προκαλέσουν αποτυχία της λειτουργίας.
μπλε οθόνη ελαττωματικό υλικό κατεστραμμένη σελίδα
Ένα από τα πρώτα τεστ που θα γράψετε θα πρέπει να ελέγξει εάν η συνάρτηση επιστρέφει το αναμενόμενο αποτέλεσμα. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε τη λέξη-κλειδί διεκδίκησης για να συγκρίνετε την πραγματική έξοδο της συνάρτησης με την αναμενόμενη έξοδο. Στην περίπτωση της συνάρτησης add_numbers, η συνάρτηση δοκιμής μπορεί να μοιάζει με αυτό:
def test_add_numbers():
assert add_numbers(2, 3) == 5
assert add_numbers(-1, 1) == 0
assert add_numbers(0, 0) == 0
Αυτή η συνάρτηση δοκιμής περιλαμβάνει τρεις δηλώσεις ισχυρισμού, καθεμία από τις οποίες συγκρίνει την έξοδο της συνάρτησης add_numbers με μια αναμενόμενη τιμή. Η πρώτη δοκιμή ελέγχει ότι η προσθήκη 2 και 3 επιστρέφει 5, η δεύτερη δοκιμή ελέγχει ότι η προσθήκη -1 και 1 επιστρέφει 0 και η τρίτη δοκιμή ελέγχει ότι η προσθήκη 0 και 0 επιστρέφει 0.
Πώς να εκτελέσετε δοκιμές με το Pytest
Αφού γράψετε τις δοκιμές σας, το επόμενο βήμα είναι να τις εκτελέσετε. Για να το κάνετε αυτό με το Pytest, μεταβείτε στον κατάλογο που περιέχει το δοκιμαστικό σας αρχείο και εκτελέστε την εντολή pytest:
pytest
Εάν όλα λειτουργούν όπως αναμένεται, θα δείτε ένα μήνυμα που θα υποδεικνύει ότι όλα τα τεστ πέρασαν με επιτυχία. Ωστόσο, εάν κάποιος από τους ισχυρισμούς αποτύχει, το Pytest θα αναφέρει ένα σφάλμα και θα σας δείξει τις τιμές εισόδου που προκάλεσαν την αποτυχία.
Για παράδειγμα, ας υποθέσουμε ότι εκτελέσατε την ακόλουθη δοκιμαστική λειτουργία για τη συνάρτηση add_numbers:
def test_add_numbers():
assert add_numbers(2, 3) == 6
assert add_numbers(-1, 1) == 0
assert add_numbers(0, 0) == 0
Ο πρώτος ισχυρισμός θα αποτύχει επειδή η αναμενόμενη τιμή ήταν 6, αλλά η πραγματική τιμή ήταν 5 (το άθροισμα των 2 και 3). Το Pytest θα επιστρέψει το ακόλουθο μήνυμα:
Αυτό το μήνυμα σάς δείχνει τις τιμές εισόδου που προκάλεσαν την τιμή και σας λέει επίσης ποια πρέπει να είναι η πραγματική τιμή. Αυτό διευκολύνει τον γρήγορο εντοπισμό και τη διόρθωση σφαλμάτων στον κώδικά σας.
Χρησιμοποιώντας το Pytest.raises για τη διεκδίκηση εξαιρέσεων
Τώρα, ας γράψουμε μια δοκιμή για να καλύψουμε μία από τις ακμές περιπτώσεις της συνάρτησης add_numbers. Όταν μεταβιβάζετε ένα μη αριθμητικό όρισμα όπως το None στη συνάρτηση, η Python θα πρέπει να εγείρει μια εξαίρεση TypeError.
Θα έπρεπε ήδη να είσαι χειρισμός εξαιρέσεων στα προγράμματα Python σας , και μπορείτε να ελέγξετε ότι ο κώδικάς σας τα ανεβάζει σωστά επίσης.
Για να το κάνετε αυτό, αντιγράψτε την παρακάτω δοκιμαστική λειτουργία στο αρχείο σας. Χρησιμοποιεί τη διαχείριση περιβάλλοντος pytest.raises για να ελέγξει εάν η κλήση της συνάρτησης add_number με 'Καμία' δημιουργεί μια εξαίρεση TypeError.
ποια προγράμματα πρέπει να εκτελούνται κατά την εκκίνηση των Windows 7
import pytest
def test_add_numbers_with_invalid_inputs():
with pytest.raises(TypeError):
add_numbers(None, 2)
Στη συνέχεια, εκτελέστε το Pytest από τη γραμμή εντολών. Εάν δεν τεθεί η εξαίρεση, η δοκιμή θα αποτύχει.
Μπορείτε να προχωρήσετε περαιτέρω και να ελέγξετε τις λεπτομέρειες του μηνύματος εξαίρεσης. Ο διαχειριστής περιβάλλοντος δημιουργεί ένα αντικείμενο ExceptionInfo με τις λεπτομέρειες.
Για παράδειγμα, σε αυτήν τη συνάρτηση δοκιμής, υποβάλετε το μήνυμα εξαίρεσης ως εξής:
def test_add_numbers_with_invalid_inputs():
with pytest.raises(TypeError) as exc_info:
add_numbers(None, 2)
assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and 'int'"
Εάν το μήνυμα δεν ταιριάζει με αυτό στη δοκιμή, το Pytest θα υποδείξει μια αποτυχία.
Πώς να χρησιμοποιήσετε την παραμετροποιημένη δοκιμή για να ελέγξετε πολλές εισόδους ταυτόχρονα
Αντί να καλέσετε με μη αυτόματο τρόπο μια συνάρτηση με πολλές εισόδους όπως αυτή:
def test_add_numbers():
assert add_numbers(2, 3) == 6
assert add_numbers(-1, 1) == 0
assert add_numbers(0, 0) == 0
Το Pytest παρέχει μια δυνατότητα παραμετροποιημένης δοκιμής που σας επιτρέπει να κάνετε το ίδιο πράγμα πιο εύκολα. Δείτε πώς μπορείτε να ξαναγράψετε τη συνάρτηση δοκιμής παραπάνω:
import pytest
@pytest.mark.parametrize("a,b,expected", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
def test_add_numbers(a, b, expected):
assert add_numbers(a, b) == expected
Πώς να εκτελέσετε πολλαπλές δοκιμές
Μέχρι στιγμής, έχετε γράψει μόνο δύο δοκιμές για τη συνάρτηση add_numbers. Για πιο σύνθετες συναρτήσεις με περισσότερες δοκιμές, μπορεί να θέλετε να τις ομαδοποιήσετε σε μια τάξη.
Για παράδειγμα, ορίστε πώς θα δημιουργήσετε μια δοκιμαστική κλάση για τη συνάρτηση προσθήκης.
class TestAddFunction:
@pytest.mark.parametrize("a, b, expected", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
def test_addition_with_numbers(self, a, b, expected):
assert add_numbers(a, b) == expected
def test_add_numbers_with_invalid_inputs(self):
with pytest.raises(TypeError) as exc_info:
add_numbers(None, 2)
assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and 'int'"
Σημειώστε ότι πρέπει να προσθέσετε το πρόθεμα στο όνομα της κλάσης με 'Test' έτσι ώστε το Pytest να μπορεί να το αναγνωρίσει ως δοκιμαστική κλάση και να το εκτελέσει.
Το Pytest έχει πολλά περισσότερα χαρακτηριστικά
Χρησιμοποιώντας το Pytest, μπορείτε αυτόματα να επαληθεύσετε ότι ο κώδικάς σας λειτουργεί όπως περιμένετε. Το Pytest προσφέρει πολλές άλλες δυνατότητες, όπως φωτιστικά που σας επιτρέπουν να ρυθμίσετε και να καταρρίψετε δεδομένα δοκιμής και σημάδια για τη ρύθμιση μεταδεδομένων στις δοκιμαστικές λειτουργίες σας.
Επιπλέον, μπορείτε να ενσωματώσετε το Pytest στη διοχέτευση CI και να ξεκινήσετε να εκτελείτε δοκιμές αυτόματα και συνεχώς όταν αλλάζετε τον κώδικά σας.