Définition et principe
Fonction → Test → Validation
Valider une unité de code à la fois
Test unitaire :
Test d'une seule fonction
Vérification du comportement
Détection d'erreurs précoces
Automatisation possible
Vérification du comportement
Détection d'erreurs précoces
Automatisation possible
Structure d'un test :
Entrée(s) définie(s)
Exécution de la fonction
Comparaison du résultat attendu
Exécution de la fonction
Comparaison du résultat attendu
Objectifs
Vérifier le bon fonctionnement
Détecter les bugs tôt
Faciliter la maintenance
Garantir la stabilité du code
Exemples de tests
# Fonction à tester
def carre(nombre):
"""Retourne le carré d'un nombre"""
return nombre * nombre
# Tests manuels
assert carre(5) == 25
assert carre(0) == 0
assert carre(-3) == 9
print("Tous les tests passent!")
# Avec unittest
import unittest
class TestCarre(unittest.TestCase):
def test_carre_positif(self):
self.assertEqual(carre(5), 25)
def test_carre_zero(self):
self.assertEqual(carre(0), 0)
def test_carre_negatif(self):
self.assertEqual(carre(-3), 9)
if __name__ == '__main__':
unittest.main()
Cas nominal : fonctionnement normal
Cas limite : valeurs extrêmes
Cas d'erreur : valeurs invalides
Couverture : tous les chemins exécutés
Frameworks de test
unittest : intégré à Python
pytest : plus simple et puissant
assertions : vérifications automatiques
Bonnes pratiques
Un test par cas de figure
Nommer les tests de façon descriptive
Exécuter les tests fréquemment
Tester les cas limites et erreurs
Isoler les tests les uns des autres
Erreurs Fréquentes
Erreur 1 :
Ne pas tester les cas limites
Erreur 2 :
Tester plusieurs comportements dans un seul test
Erreur 3 :
Dépendance entre tests
Erreur 4 :
Ne pas mettre à jour les tests lors de modifications
Types de tests
Tests fonctionnels :
Vérifier que la fonction fait ce qu'elle doit faire
Comparer résultats attendus vs obtenus
Comparer résultats attendus vs obtenus
Tests de robustesse :
Gestion des erreurs
Entrées invalides ou limites
Entrées invalides ou limites