elouann.dev
EN — English version

ProjetsBas-niveau & embarqué

Libunit

Framework de tests unitaires en C

Période
janv. 2026
Cadre
rush 42
Équipe
en groupe
Note
117/100
  • C
  • Bas-niveau
  • Programmation impérative
  • Testeur

Voir le code

Un framework de tests unitaires pour le C, écrit en C pendant un rush de deux jours. Son point fort : un test qui plante ne fait pas planter le reste.

batterietest 1test 2test 3fork()enfantexécute le testparentwaitpid()exit(code)ou signalOKKOSIG…WIFEXITED / WIFSIGNALEDsignaux reconnusSIGSEGVSIGBUSSIGABRTSIGFPESIGPIPESIGILL
SchémaChaque test tourne dans son propre processus. Le parent lit la façon dont l’enfant s’est terminé pour en déduire le résultat.

Le fonctionnement

Les tests sont rangés en « batteries », une par fonction testée. Chaque test est une fonction qui renvoie 0 si tout va bien. Pour chaque test, le framework fait un fork() : l’enfant exécute le test et sort avec son code de retour, le parent l’attend avec waitpid().

Grâce aux macros WIFEXITED et WIFSIGNALED, le parent sait si le test a réussi, échoué, ou s’il a été tué par un signal : SIGSEGV, SIGBUS, SIGABRT, SIGFPE, SIGPIPE ou SIGILL. Le résultat s’affiche en couleur, test par test.

Les bonus

Un test peut être marqué comme « doit planter » : par exemple, on s’attend à un SIGSEGV sur un pointeur nul. Une batterie peut aussi s’arrêter à la première erreur, et un test peut être désactivé sans être supprimé.

Ce que j’en retiens

  • Le processus est la meilleure isolation qu’offre Unix, et elle ne coûte qu’un fork().
  • Un signal est une information comme une autre : il se lit dans le statut de l’enfant.
  • Écrire l’outil qui teste son code fait relire son code autrement.