Numérique et Sciences Informatiques • 1ère

Tests unitaires simples

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
Structure d'un test :
Entrée(s) définie(s)
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
Tests de robustesse :
Gestion des erreurs
Entrées invalides ou limites
Débogage et vérification Génie logiciel