Tester votre code

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous allons apprendre à écrire des tests unitaires pour notre code Python en utilisant le module unittest intégré. Nous commencerons par une fonction simple puis passerons à la mise à l'épreuve de code plus complexe, y compris du code qui interagit avec des bases de données.

Conditions préalables

Avant de commencer ce laboratoire, vous devriez avoir une compréhension de base du langage de programmation Python. Vous devriez également avoir une certaine familiarité avec l'écriture de fonctions en Python.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/function_definition -.-> lab-247{{"Tester votre code"}} python/arguments_return -.-> lab-247{{"Tester votre code"}} python/importing_modules -.-> lab-247{{"Tester votre code"}} python/catching_exceptions -.-> lab-247{{"Tester votre code"}} python/raising_exceptions -.-> lab-247{{"Tester votre code"}} python/custom_exceptions -.-> lab-247{{"Tester votre code"}} python/file_operations -.-> lab-247{{"Tester votre code"}} end

Ajouter des nombres

Configuration

Pour commencer, nous devons créer un nouveau fichier Python pour nos tests. Appelons-le test_my_code.py. Nous allons également créer un module qui contient le code que nous voulons tester. Appelons ce module my_code.py.

Test simple

Commencons par une fonction simple qui renvoie la somme de deux nombres. Dans my_code.py, créez une fonction nommée add_numbers qui prend deux arguments et renvoie leur somme.

def add_numbers(a, b):
    return a + b

Maintenant, écrivons un test pour cette fonction dans test_my_code.py. Tout d'abord, nous devons importer le module unittest et la fonction add_numbers.

import unittest
from my_code import add_numbers

Ensuite, nous allons créer une classe nommée TestAddNumbers qui hérite de unittest.TestCase.

class TestAddNumbers(unittest.TestCase):
    pass

Dans cette classe, nous allons créer une méthode nommée test_add_numbers qui testera la fonction add_numbers. Nous utiliserons la méthode assertEqual pour vérifier que la fonction renvoie la somme correcte.

class TestAddNumbers(unittest.TestCase):
    def test_add_numbers(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)

Maintenant, nous pouvons exécuter nos tests en utilisant la commande suivante :

python -m unittest test_my_code.py

Si le test réussit, vous devriez voir une sortie similaire à la suivante :

...
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Le . indique qu'un test a réussi.

Tester les exceptions

Ensuite, testons une fonction qui lève une exception. Dans my_code.py, créez une fonction nommée divide qui prend deux arguments et renvoie leur quotient. Si le second argument est zéro, la fonction devrait lever une ZeroDivisionError.

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError('Cannot divide by zero')
    return a / b

Maintenant, écrivons un test pour cette fonction dans test_my_code.py. Nous utiliserons la méthode assertRaises pour vérifier que la fonction lève une ZeroDivisionError lorsque le second argument est zéro.

class TestDivide(unittest.TestCase):
    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)

Maintenant, nous pouvons exécuter nos tests à nouveau :

python -m unittest test_my_code.py

Si le test réussit, vous devriez voir une sortie similaire à la suivante :

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

OK

Les .. indiquent que deux tests ont réussi.

Tests avec des bases de données

Enfin, testons du code qui interagit avec une base de données. Pour cet exemple, nous utiliserons SQLite et le module sqlite3.

Dans my_code.py, créez une fonction nommée create_table qui crée une nouvelle table dans une base de données SQLite.

import sqlite3

def create_table():
    conn = sqlite3.connect('my_database.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

Dans ce code, nous créons une nouvelle table de base de données SQLite nommée "my_table" avec deux colonnes : "id" et "name". Nous définissons ensuite une classe de test nommée TestCreateTable avec une méthode setUp qui crée une base de données SQLite pour les tests.

Maintenant, écrivons un test pour la fonction create_table. Tout d'abord, nous devons créer une nouvelle base de données pour les tests. Nous le ferons dans une méthode de configuration qui s'exécute avant chaque test.

class TestCreateTable(unittest.TestCase):
    def setUp(self):
        self.conn = sqlite3.connect('my_database.db')

    def test_create_table(self):
        create_table()
        c = self.conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
        result = c.fetchone()
        self.assertIsNotNone(result)

Dans la méthode setUp, nous créons une nouvelle base de données SQLite.

Dans la méthode test_create_table, nous appelons la fonction create_table puis vérifions que la table a été créée en utilisant une requête SQL.

Maintenant, nous pouvons exécuter nos tests à nouveau :

python -m unittest test_my_code.py

Si le test réussit, vous devriez voir une sortie similaire à la suivante :

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

Les ... indiquent que trois tests ont réussi.

Résumé

Dans ce laboratoire, nous avons appris à écrire des tests unitaires pour notre code Python en utilisant le module unittest. Nous avons commencé avec une fonction simple puis avons progressé jusqu'à tester du code plus complexe, y compris du code qui interagit avec des bases de données. Grâce à ces connaissances, vous pouvez écrire des tests pour votre code Python pour vous assurer qu'il fonctionne comme prévu et détecter les bugs tôt dans le processus de développement.