Pour tester le comportement d’une pièce d’un programme (composant ou module), les tests unitaires sont indispensables. Ils visent à tester plusieurs unités de code, souvent associées à des exigences. Par exemple, un test sur la partie du code qui valide la longueur d’un mot de passe.
Ces tests sont écrits dans le même langage de programmation que le module, et sont situés à un endroit particulier dans le code source. Ils ont généralement une vitesse d’exécution rapide, car ils sont lancés régulièrement.
L’unité de code n’est visible que par le développeur. Elle se déclenche à des moments précis pendant l’exécution de l’application, et peut être parfois déduite par un utilisateur lors d’un test sur une fonctionnalité (test fonctionnel).
Un test unitaire est un cas de test. Il vérifie un seul comportement à la fois. On spécifie les données du test (les entrées), la méthode ou la fonction à appeler (les étapes), et le résultat attendu du test. Le test est soit en réussite ou soit en échec. Pour tester une exigence, il faut au moins deux tests : un test positif et un test volontairement négatif.
Dans un test, il arrive qu’on utilise des doublures, appelé test double en anglais, pour isoler certains comportements pendant son exécution. Ça permet surtout de changer un test vers un niveau unitaire. Par exemple, remplacer la récupération d’une information en base de données (souvent réalisée par un autre module) par une donnée factice dans le test.
Un développeur ne connaît pas les comportements uniques de chaque module. En créant des tests unitaires, le module développe une ligne de conduite. Les développeurs sont alertés par les tests que les exigences ne sont plus respectées. Cela réduit les modifications involontaires dans le code source, difficiles à déceler plus tard.