Esempio di test unitario Python unittest

Oggi impareremo su python unittest e daremo un’occhiata a programmi di esempio di test unitari in python. Nel tutorial precedente abbiamo imparato sulla funzione zip di python.

Python unittest

Il modulo unittest di Python viene utilizzato per testare un’unità di codice sorgente. Supponiamo che tu abbia bisogno di testare il tuo progetto. Sai che tipo di dati restituirà la funzione. Dopo aver scritto un codice enorme, devi controllare se l’output è corretto o meno. Normalmente, ciò che facciamo è stampare l’output e confrontarlo con il file di output di riferimento o controllare l’output manualmente. Per ridurre questo problema, Python ha introdotto il modulo unittest. Utilizzando questo modulo puoi controllare l’output della funzione con un semplice codice. In questo tutorial discuteremo dell’uso di base del modulo unittest di Python e scriveremo alcuni casi di test unitari in python per testare le funzioni di una classe.

Esempio di codice sorgente del test unitario in Python

Prima di tutto dobbiamo scrivere del codice per testare unitariamente. Avremo una classe Python. Lo scopo principale della classe è quello di memorizzare e recuperare il nome di una persona. Quindi, scriviamo la funzione set_name() per memorizzare i dati e la funzione get_name() per recuperare il nome dalla classe.

class Person:
    name = []

    def set_name(self, user_name):
        self.name.append(user_name)
        return len(self.name) - 1

    def get_name(self, user_id):
        if user_id >= len(self.name):
            return 'There is no such user'
        else:
            return self.name[user_id]


if __name__ == '__main__':
    person = Person()
    print('User Abbas has been added with id ', person.set_name('Abbas'))
    print('User associated with id 0 is ', person.get_name(0))

Abbiamo chiamato il file della classe come Person.py. E l’output del codice sopra sarà come segue.

$ python3.6 Person.py 
User Abbas has been added with id  0
User associated with id 0 is  Abbas
$

Struttura del modulo di test di unità Python

Ora, impariamo come scrivere il codice per il test delle unità. Un singolo caso di test viene creato sottoclassando unittest.TestCase. Sovrascrivendo o aggiungendo funzioni appropriate, possiamo aggiungere la logica per il test. Il seguente codice avrà successo se a è uguale a b.

import unittest


class Testing(unittest.TestCase):
    def test_string(self):
        a = 'some'
        b = 'some'
        self.assertEqual(a, b)

    def test_boolean(self):
        a = True
        b = True
        self.assertEqual(a, b)

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

Come eseguire il modulo di test delle unità di Python

Se stai utilizzando l’IDE PyCharm, puoi semplicemente premere ctrl+shift+F10 per eseguire il modulo unittest. In caso contrario, puoi utilizzare il prompt dei comandi per eseguire questo modulo. Ad esempio, abbiamo chiamato il file per il test delle unità come Basic_Test.py. Quindi il comando per eseguire il test delle unità Python sarà: $python3.6 -m unittest Basic_Test.Testing. Se desideri vedere il dettaglio, allora il comando sarà: $python3.6 -m unittest -v Basic_Test.Testing. Utilizzando PyCharm, otteniamo l’output seguente.

Risultato del test unitario di Python e funzioni di base

Questo test unitario ha 3 possibili risultati. Sono elencati di seguito:

  1. OK: Se tutti i casi di test sono superati, l’output mostra OK.
  2. Fallimento: Se uno qualsiasi dei casi di test fallisce e genera un’eccezione AssertionError
  3. Errore: Se viene generata qualsiasi altra eccezione diversa da AssertionError.

Ci sono diverse funzioni nel modulo unittest. Sono elencate di seguito.

Method Checks that
assertEqual(a,b) a==b
assertNotEqual(a,b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a,b) a is b
assertIs(a,b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

Esempio di test unitario Python

Ora è il momento di scrivere i test unitari per la nostra classe di origine Person. In questa classe abbiamo implementato due funzioni – get_name() e set_name(). Ora, testeremo quelle funzioni usando unittest. Abbiamo quindi progettato due casi di test per quelle due funzioni. Dai un’occhiata al seguente codice, lo capirai facilmente.

import unittest

# Questa è la classe che vogliamo testare. Quindi, dobbiamo importarla
import Person as PersonClass


class Test(unittest.TestCase):
    """
    The basic class that inherits unittest.TestCase
    """
    person = PersonClass.Person()  # instantiate the Person Class
    user_id = []  # variable that stores obtained user_id
    user_name = []  # variable that stores person name

    # Funzione del caso di test per verificare la funzione Person.set_name
    def test_0_set_name(self):
        print("Start set_name test\n")
        """
        Any method which starts with ``test_`` will considered as a test case.
        """
        for i in range(4):
            # Inizializzare un nome
            name = 'name' + str(i)
            # Memorizzare il nome nella variabile della lista
            self.user_name.append(name)
            # Ottenere l'ID utente ottenuto dalla funzione
            user_id = self.person.set_name(name)
            # Verificare se l'ID utente ottenuto è nullo o meno
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # Memorizzare l'ID utente nella lista
            self.user_id.append(user_id)
        print("user_id length = ", len(self.user_id))
        print(self.user_id)
        print("user_name length = ", len(self.user_name))
        print(self.user_name)
        print("\nFinish set_name test\n")

    # Funzione del caso di test per verificare la funzione Person.get_name
    def test_1_get_name(self):
        print("\nStart get_name test\n")
        """
        Any method that starts with ``test_`` will be considered as a test case.
        """
        length = len(self.user_id)  # total number of stored user information
        print("user_id length = ", length)
        print("user_name length = ", len(self.user_name))
        for i in range(6):
            # Se non supera la lunghezza totale, verificare il nome restituito
            if i < length:
                # Se i due nomi non corrispondono, il caso di test fallirà
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # Se la lunghezza supera, controllare il messaggio di tipo 'nessun utente corrispondente'
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # Iniziare il unittest.main()
    unittest.main()

Nota che il modulo unittest esegue le funzioni di test nell’ordine del loro nome, non nell’ordine in cui sono definite. E poiché vogliamo che il nostro test set_name venga eseguito prima, abbiamo denominato le nostre funzioni di caso di test come test_0_set_name e test_1_get_name.

Esempio di output del test unitario Python

Le immagini seguenti mostrano l’output prodotto dal nostro programma di test unitario, sia in modalità normale che in modalità dettagliata.

$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test

user_id length =  4
[0, 1, 2, 3]
user_name length =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test

ok
test_1_get_name (PersonTest.Test) ... 
Start get_name test

user_id length =  4
user_name length =  4
Testing for get_name no user test
Testing for get_name no user test

Finish get_name test

ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$

Questo è tutto riguardo al tutorial sul test unittest di Python. Per saperne di più, leggi la Documentazione Ufficiale. Per ulteriori domande, utilizza il box dei commenti. 🙂

Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example