Πώς να ρυθμίσετε και να εκτελέσετε το πρώτο σας τεστ Python με το Pytest

Πώς να ρυθμίσετε και να εκτελέσετε το πρώτο σας τεστ Python με το Pytest
Αναγνώστες σαν εσάς βοηθούν στην υποστήριξη του MUO. Όταν κάνετε μια αγορά χρησιμοποιώντας συνδέσμους στον ιστότοπό μας, ενδέχεται να κερδίσουμε μια προμήθεια θυγατρικών. Διαβάστε περισσότερα.

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





Το 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 που δείχνει μια μεμονωμένη δοκιμή αποτυχία

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

Χρησιμοποιώντας το 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 και να ξεκινήσετε να εκτελείτε δοκιμές αυτόματα και συνεχώς όταν αλλάζετε τον κώδικά σας.