Δοκιμή μονάδων με την ενότητα δοκιμής μονάδας Python

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

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

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

Θα καταλάβατε ότι η χειροκίνητη δοκιμή είναι χρονοβόρα και δύσκολη. Έτσι, οι προγραμματιστές γράφουν κώδικα για την εκτέλεση δοκιμών (αυτόματη δοκιμή). Υπάρχουν διάφορα είδη δοκιμών στις αυτοματοποιημένες δοκιμές. Μερικά από αυτά είναι η δοκιμή μονάδας, η ολοκλήρωση δοκιμών, η δοκιμή από άκρο σε άκρο, η δοκιμή καταπόνησης κ.λπ..,

Ας δούμε την τυπική ροή των δοκιμών.

  • Γράψτε ή ενημερώστε τον κωδικό.
  • Γράψτε ή ενημερώστε δοκιμές για διαφορετικές περιπτώσεις για τον κώδικά σας.
  • Εκτελέστε τις δοκιμές (είτε χειροκίνητα είτε χρησιμοποιώντας δοκιμαστικό δρομέα).
  • Δείτε τα αποτελέσματα των δοκιμών. Εάν υπάρχουν σφάλματα, διορθώστε τα και επαναλάβετε τα βήματα.

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

Τι είναι το Unit Testing;

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

Ας υποθέσουμε ότι πρέπει να ελέγξουμε αν μια συμβολοσειρά είναι ίση με “grtechpc.org” ή όχι. Για αυτό, έχουμε γράψει μια συνάρτηση που παίρνει ένα όρισμα και επιστρέφει είτε είναι ίσο με “grtechpc.org” ή όχι.

def is_equal_to_geekflare(string):
	return string == "grtechpc.org"

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

Σημασία του Unit Testing

Γενικά, ο κώδικας ανεξάρτητων μπλοκ μπορεί να χρησιμοποιηθεί σε όλο το έργο. Άρα, πρέπει να είναι καλά γραμμένο και δοκιμασμένο. Οι δοκιμές μονάδας είναι οι δοκιμές που χρησιμοποιούνται για τον έλεγχο αυτών των τύπων ανεξάρτητων μπλοκ κώδικα. Τι συμβαίνει εάν δεν χρησιμοποιήσουμε δοκιμές μονάδων για το έργο μας;

  11 καλύτερα εργαλεία παρακολούθησης AWS το 2022

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

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

Στις επόμενες ενότητες, θα δούμε τι είναι η ενότητα δοκιμής μονάδας Python και πώς χρησιμοποιούμε την ενότητα δοκιμής μονάδας για να γράψουμε δοκιμές μονάδας στην Python.

Σημείωση: Υποθέτουμε ότι είστε εξοικειωμένοι με τις κλάσεις Python, τις ενότητες κ.λπ. Εάν δεν είστε εξοικειωμένοι με τις ενδιάμεσες έννοιες της Python, όπως κλάσεις, λειτουργικές μονάδες κ.λπ., μπορεί να δυσκολευτείτε να κατανοήσετε τις επόμενες ενότητες.

Τι είναι το Python unittest;

Το Python unittest είναι ένα ενσωματωμένο πλαίσιο δοκιμών για τη δοκιμή κώδικα Python. Διαθέτει δοκιμαστικό δρομέα, που μας επιτρέπει να κάνουμε τις δοκιμές χωρίς ιδιαίτερη προσπάθεια. Έτσι, μπορούμε να χρησιμοποιήσουμε την ενσωματωμένη μονάδα δοκιμής μονάδας για δοκιμές χωρίς τη χρήση λειτουργικών μονάδων τρίτων. Αλλά, αλλάζει με βάση τις απαιτήσεις σας. Η ενσωματωμένη ενότητα δοκιμής μονάδας είναι καλή για να ξεκινήσετε τη δοκιμή στην Python.

Πρέπει να ακολουθήσουμε τα παρακάτω βήματα για να δοκιμάσουμε τον κώδικα Python χρησιμοποιώντας τη μονάδα unittest.

#1. Γράψε τον κωδικό.

#2. Εισαγάγετε τη μονάδα δοκιμής μονάδας.

#3. Δημιουργήστε ένα αρχείο ξεκινώντας με τη δοκιμή λέξης-κλειδιού. Για παράδειγμα test_prime.py. Η δοκιμή λέξης-κλειδιού χρησιμοποιείται για την αναγνώριση των αρχείων δοκιμής.

#4. Δημιουργήστε μια κλάση που επεκτείνει την κλάση unittest.TestCase.

#5. Γράψτε μεθόδους (δοκιμές) μέσα στην τάξη. Κάθε μέθοδος περιέχει διαφορετικές περιπτώσεις δοκιμής με βάση τις απαιτήσεις σας. Πρέπει να ονομάσουμε τη μέθοδο ξεκινώντας με λέξη-κλειδί δοκιμής.

#6. Εκτελέστε τις δοκιμές. Μπορούμε να εκτελέσουμε τις δοκιμές με διαφορετικούς τρόπους.

  • Εκτελέστε την εντολή python -m unittest test_filename.py.
  • Εκτελούμε τα αρχεία δοκιμής όπως τα γενικά αρχεία Python με την εντολή python test_filename.py. Για να λειτουργήσει αυτή η μέθοδος, πρέπει να καλέσουμε την κύρια μέθοδο του unittest στο αρχείο δοκιμής.
  • Και τέλος, χρησιμοποιώντας την ανακάλυψη. Μπορούμε να εκτελέσουμε αυτόματα τις δοκιμές χρησιμοποιώντας την εντολή python -m unittest discover χωρίς να αναφέρουμε το όνομα αρχείου της δοκιμής. Θα βρει τις δοκιμές χρησιμοποιώντας τη σύμβαση ονομασίας που ακολουθήσαμε. Επομένως, πρέπει να ονομάσουμε τα αρχεία δοκιμής με τη λέξη-κλειδί test στην αρχή.
  Πού να βρείτε δωρεάν διαδικτυακά μαθήματα για να μάθετε κάτι νέο;

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

Μπορείτε να τα καταλάβετε εύκολα χωρίς καμία δυσκολία. Είναι ευθύς.

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

Σημείωση: Εάν έχετε απορίες σχετικά με τη μονάδα δοκιμής μονάδας, μπορείτε να μεταβείτε στο τεκμηρίωση και ξεκαθαρίστε τις αμφιβολίες σας. Χωρίς περαιτέρω καθυστέρηση, ας χρησιμοποιήσουμε τη μονάδα δοκιμής μονάδας.

Δοκιμές μονάδων σε Python χρησιμοποιώντας unittest

Θα γράψουμε πρώτα κάποιες συναρτήσεις και μετά θα επικεντρωθούμε στη σύνταξη των δοκιμών. Αρχικά, ανοίξτε έναν φάκελο στον αγαπημένο σας επεξεργαστή κώδικα. Και δημιουργήστε ένα αρχείο που ονομάζεται utils.py. Επικολλήστε τον παρακάτω κώδικα στο αρχείο.

import math


def is_prime(n):
    if n < 0:
        return 'Negative numbers are not allowed'

    if n <= 1:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


def cubic(a):
    return a * a * a


def say_hello(name):
    return "Hello, " + name

Έχουμε τρεις διαφορετικές λειτουργίες στο αρχείο utils.py. Τώρα, πρέπει να δοκιμάσουμε κάθε λειτουργία με διαφορετικές περιπτώσεις δοκιμής. Ας γράψουμε τα τεστ για την πρώτη συνάρτηση is_prime.

#1. Δημιουργήστε ένα αρχείο που ονομάζεται test_utils.py στο φάκελο δείγματος ως utils.py.

#2. Εισαγάγετε τη μονάδα Utils και unittest.

#3. Δημιουργήστε μια κλάση με το όνομα TestUtils επεκτείνοντας την κλάση unittest.TestCase. Το όνομα της τάξης μπορεί να είναι οτιδήποτε. Προσπαθήστε να δώσετε στην τάξη ένα ουσιαστικό όνομα.

#4. Μέσα στην κλάση, γράψτε μια μέθοδο που ονομάζεται test_is_prime η οποία δέχεται τον εαυτό ως όρισμα.

#5. Γράψτε διαφορετικές περιπτώσεις δοκιμής με ορίσματα στο is_prime και συγκρίνετε την έξοδο με την αναμενόμενη έξοδο.

#6. Παράδειγμα δοκιμαστικής περίπτωσης self.assertFalse(utils.is_prime(1)).

#7. Αναμένουμε ότι η έξοδος του is_prime(1) θα είναι ψευδής στην παραπάνω περίπτωση.

#8. Παρόμοια με την παραπάνω περίπτωση, θα δοκιμάσουμε διαφορετικές περιπτώσεις με βάση τη λειτουργία που δοκιμάζουμε.

Ας δούμε τις δοκιμές.

import unittest

import utils


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        self.assertFalse(utils.is_prime(4))
        self.assertTrue(utils.is_prime(2))
        self.assertTrue(utils.is_prime(3))
        self.assertFalse(utils.is_prime(8))
        self.assertFalse(utils.is_prime(10))
        self.assertTrue(utils.is_prime(7))
        self.assertEqual(utils.is_prime(-3),
                         "Negative numbers are not allowed")


if __name__ == '__main__':
    unittest.main()

Επικαλούμαστε την κύρια μέθοδο unittest της ενότητας για να εκτελέσουμε τις δοκιμές χρησιμοποιώντας την εντολή python filename.py. Τώρα, εκτελέστε τις δοκιμές.

  Τι είναι το Dropshipping και είναι απάτη;

Θα δείτε την έξοδο παρόμοια με την παρακάτω έξοδο.

$ python test_utils.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

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

...


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        ...

    def test_cubic(self):
        self.assertEqual(utils.cubic(2), 8)
        self.assertEqual(utils.cubic(-2), -8)
        self.assertNotEqual(utils.cubic(2), 4)
        self.assertNotEqual(utils.cubic(-3), 27)

    def test_say_hello(self):
        self.assertEqual(utils.say_hello("grtechpc.org"), "Hello, grtechpc.org")
        self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
        self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
        self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")


...

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

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

Τρόπος εκτέλεσης δοκιμών χρησιμοποιώντας unittest

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

#1. Χρησιμοποιώντας το όνομα αρχείου και τη μονάδα δοκιμής μονάδας.

Σε αυτήν τη μέθοδο, θα χρησιμοποιήσουμε τη μονάδα δοκιμής μονάδας και το όνομα αρχείου για να εκτελέσουμε τις δοκιμές. Η εντολή για την εκτέλεση των δοκιμών είναι python -m unittest filename.py. Στην περίπτωσή μας, η εντολή για την εκτέλεση των δοκιμών είναι python -m unittest test_utils.py.

#2. Χρησιμοποιώντας τη μέθοδο ανακάλυψης

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

Η εντολή για την εκτέλεση των δοκιμών χρησιμοποιώντας τη μέθοδο Discover είναι η python -m unittest discover. Η εντολή θα εντοπίσει όλα τα αρχεία των οποίων τα ονόματα ξεκινούν με δοκιμή και θα τα εκτελέσει.

Συμπέρασμα 👩‍💻

Οι δοκιμές μονάδων είναι βασικές δοκιμές στον κόσμο του προγραμματισμού. Υπάρχουν πολλά άλλα τεστ στον πραγματικό κόσμο. Προσπαθήστε να τα μάθετε μία προς μία. Ελπίζω αυτό το σεμινάριο να σας βοηθήσει να γράψετε βασικές δοκιμές στην Python χρησιμοποιώντας την ενότητα unittest. Υπάρχουν βιβλιοθήκες τρίτων όπως pytest, Robot Framework, nose, nose2, slash κ.λπ. Μπορείτε να τις εξερευνήσετε με βάση τις απαιτήσεις του έργου σας.

Καλές δοκιμές 😎

Μπορεί επίσης να σας ενδιαφέρουν Ερωτήσεις και απαντήσεις για συνέντευξη Python.