diff --git a/slides/munit.md b/slides/munit.md index 44b39dd93e7ea9dc51e2004d979893d7bf6f5534..fcec7fe316442c0fe0b986c0cbe1bf0edcc22d81 100644 --- a/slides/munit.md +++ b/slides/munit.md @@ -72,7 +72,8 @@ Ici on utilisera: # Petit tuto $\mu$nit -Structure possible de tests: +* Pour plus d'informations voir [ce lien](https://nemequ.github.io/munit/). +* Structure possible de tests: ~~~{.mermaid format=png} graph TD; @@ -88,7 +89,8 @@ graph TD; munit.o --> tests ~~~ -*Exercice:* Écrire un `Makefile` avec une cible `tests` qui compile et exécute les tests. +**Exercice:** Écrire un `Makefile` avec une cible `tests` qui compile et +exécute les tests. # Utilisation simple @@ -122,6 +124,152 @@ ERROR> tests.c:5: assertion failed: add(1, -2) == -1 (-2 == -1) ``` -Les `munit_assert_TYPE()`{.C} existent en plusieurs saveurs (`char`{.C}, `float`{.C}, ...). +Plusieurs saveurs de `munit_assert_TYPE()`{.C} (`char`{.C}, `float`{.C}, ...). + +# Structure des tests (1/3) + +## Fonction de test + +* Chaque test doit être dans une fonction séparée. +* Chaque fonctionnalité doit avoir sa propre fonction de test. +* Le nom de la fonction doit ressembler à : + + ```C + // - MunitResult: type de retour du test + // - MUNIT_OK, MUNIT_SKIP, MUNIT_FAIL, MUNIT_ERROR + // - nom_du_test: l'identifiant de la fonction + // - params: les paramètres du test + // - user_data_or_fixture: permet plus de flexibilité + MunitResult nom_du_test(const MunitParameter params[], + void* user_data_or_fixture); + ``` + +* On s'intéresse pas à `params` et `user_data_or_fixture`. +* Le nombre de tests est arbitraire, maintenant voyons comment les exécuter. + +# Structure des tests (2/3) + +\footnotesize + +## Liste de tests + +* Les tests sont mis dans une liste: + + ```C + MunitTest mes_tests[] = { + { + "/mon_super_test", /* nom humain du test */ + nom_du_test, /* nom dela fonction de test */ + NULL, /* setup */ + NULL, /* tear_down */ + MUNIT_TEST_OPTION_NONE, /* options */ + NULL /* parameters */ + }, + // On peut rajouter plein d'autres tests + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } + // La ligne ci-dessus indique qu'il n'y a pas d'autres tests + // Elle est obligatoire + }; + ``` +* `setup`, `tear_down`, `options`, `parameters` servent à paramétrer les tests on les laisse à `NULL`{.C} ici. + +# Structure de tests (3/3) + +## Suite de tests + +* Quand on a notre liste de tests on peut les mettre dans une suite + + ```C + const MunitSuite suite = { + "/ma_suite", /* name */ + mes_tests, /* liste de tests */ + NULL, /* suites */ + 1, /* iterations, pour les tests PRNG */ + MUNIT_SUITE_OPTION_NONE /* options */ + }; + ``` + +# On mélange et on secoue tout (1/2) + +\footnotesize + +## Fichier `tests.c` + +```C +#include "munit/munit.h" +MunitResult test_init( // fonction de test + const MunitParameter params[], void* user_data_or_fixture) +{ + stack init = stack_init(); + munit_assert_ptr_equal(init, NULL); + return MUNIT_OK; +} +MunitTest test_suite_tests[] = { // liste de tests + { + "/test_init", /* name */ + test_init, /* test */ + NULL, /* setup */ + NULL, /* tear_down */ + MUNIT_TEST_OPTION_NONE, /* options */ + NULL /* parameters */ + }, + /* La fin de la liste de tests */ + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } +}; +``` + +# On mélange et on secoue tout (2/2) + +\footnotesize + +## Fichier `tests.c` + +```C +/* La suite de tests qu'on va exécuter */ +const MunitSuite test_suite = { + /* Une chaîne de caractères mise avant chaque test de la suite. */ + (char*) "", + /* La liste de tests. */ + test_suite_tests, + /* Une autre suite, ici on a rien d'autre. */ + NULL, + /* Le nombre de fois qu'on va exécuter les tests. Utile pour des tests + random. */ + 1, + /* Des options qu'on utilise pas ici. */ + MUNIT_SUITE_OPTION_NONE +}; + +int main(int argc, char** argv) { + /* On lance notre suite de tests: argc, argv pourraient être NULL. */ + return munit_suite_main(&test_suite, NULL, argc, argv); +} +``` + +# Comment inclure `munit` dans le code? + +\footnotesize + +Deux choix principaux: + +## Copier les fichiers depuis [ce lien](https://github.com/nemequ/munit) + +* On a besoin que des fichiers `munit.h` et `munit.c`. + +## L'utilisation de sous-modules git + +* Dans un repo git existant, ici `~/test`: + + ```git + $ git submodule add https://github.com/nemequ/munit + Cloning into '~/test/munit'... + remote: Enumerating objects: 615, done. + remote: Total 615 (delta 0), reused 0 (delta 0), pack-reused 615 + Receiving objects: 100% (615/615), 245.72 KiB | 2.61 MiB/s, done. + Resolving deltas: 100% (401/401), done. + $ ls -ltr + total 4 + drwxr-xr-x 2 orestis orestis 4096 Mar 16 23:18 munit + ```