Les tests sur le parcours Fortran

Apprends à tester tes exercices Fortran sur Exercism


Chaque exercice fournit les tests unitaires et une recette de compilation CMake. C'est à toi de fournir l'implémentation. Chaque fichier de test est conçu pour être lié à ton implémentation, afin de produire un exécutable en console qui exécute les tests. Quand on lance cet exécutable, il affiche un message pour chaque test qui échoue et signale un code de sortie non nul lorsque des tests échouent.

Le fichier de test porte le nom <exercise>_test.f90. Pour l'exercice « Bob », le fichier contenant les tests est donc bob_test.f90. Chaque test comporte un commentaire qui le décrit, suivi du test proprement dit, qui commence par call assert_equal, par exemple :

  ! Test 16: non-letters with question
  call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Pour désactiver un test, il suffit de le mettre en commentaire avec un '!', par exemple :

  ! Test 16: non-letters with question
  ! call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Chaque exercice se travaille en suivant ces étapes :

  • Crée la compilation initiale avec CMake
  • Pour chaque test unitaire :
    • Résous les erreurs de compilation pour faire échouer le test.
    • Implémente juste ce qu'il faut pour que le test passe.
    • Réécris ton implémentation pour améliorer la lisibilité, réduire les duplications, etc.
    • Décommente le test suivant

Crée la compilation initiale avec CMake

Chaque exercice apporte un fichier CMakeLists.txt en même temps que les tests unitaires. Il contient la recette CMake toute prête qui gère la compilation à ta place. Tu ne devrais pas avoir besoin de modifier ce fichier. La recette fournie suppose que ton implémentation se trouve dans un fichier source portant le nom de l'exercice.

Par exemple, l'exercice « Bob » attend une implémentation dans le fichier bob.f90.

Crée tes fichiers d'implémentation initiaux avant de lancer CMake. Si tu n'as pas le fichier bob.f90 au moment de lancer CMake pour l'exercice « Bob », CMake produira une erreur indiquant que des fichiers sont introuvables. Ces fichiers peuvent être vides, mais ils doivent exister.

Avec cette recette, CMake peut générer un projet adapté à ton environnement en lançant cmake -G avec un générateur approprié, ainsi que le chemin du dossier de l'exercice. CMake génère un script de compilation adapté à ton système d'exploitation. Pour garder ces fichiers générés séparés du code source de ton exercice, on crée souvent un dossier nommé build qui accueille ces fichiers de compilation générés, ainsi que le code compilé.

Ainsi, ton dossier d'exercice reste propre et bien rangé.

**Remarque : la première fois que cmake est appelé, testlib est téléchargé automatiquement. testlib est nécessaire au bon fonctionnement des tests unitaires.

Comme tu vas lancer CMake pour créer les instructions de compilation de chaque exercice, tu peux avoir intérêt à créer un script bash (Linux/MacOS) ou un fichier batch (Windows) pour cette commande.

Une fois l'environnement de compilation créé par CMake, tu peux compiler ton code avec la commande appropriée à ton environnement :

  • Linux avec make : make
  • Windows avec Visual Studio : sélectionne Build / Build Solution dans le menu.
  • Windows avec MingW : mingw32-make.exe
  • Windows avec nMake : nmake.exe
  • MacOS avec Xcode : sélectionne Build dans la barre d'outils.

Voici des exemples de lancement de CMake pour différents environnements.

Linux\MacOS avec Make

Le nom du générateur pour CMake est Unix Makefiles. En supposant que l'exercice en cours soit bob et que l'on soit dans le dossier de l'exercice :

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make

Cet exemple montre comment créer des fichiers vides pour l'implémentation avant de lancer CMake.

Il suffit de taper make dans le dossier de compilation pour compiler les tests. Cela devrait générer des erreurs de compilation. Une fois les erreurs corrigées, relance make. Quand toutes les erreurs de compilation sont corrigées, lance les tests :

$ ctest -V

Windows avec Visual Studio 2017

Le nom du générateur pour CMake est Visual Studio 15. Ce même générateur prend en charge toutes les éditions IDE de Visual Studio 2017 : Community, Professional et Enterprise. En supposant que l'exercice en cours soit bob et que l'on soit dans le dossier de l'exercice :

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "Visual Studio 15" ..

Cet exemple montre comment créer des fichiers vides pour l'implémentation avant de lancer CMake.

Windows avec MingW

Le nom du générateur pour CMake est MinGW Makefiles. En supposant que l'exercice en cours soit bob et que l'on soit dans le dossier de l'exercice :

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "MinGW Makefiles" ..

Cet exemple montre comment créer des fichiers vides pour l'implémentation avant de lancer CMake.

Il suffit de taper make dans le dossier de compilation pour compiler les tests. Cela devrait générer des erreurs de compilation. Une fois les erreurs corrigées, relance make. Quand toutes les erreurs de compilation sont corrigées, lance les tests :

MacOS avec Xcode

Le nom du générateur pour CMake est Xcode. En supposant que l'exercice en cours soit bob et que l'on soit dans le dossier de l'exercice :

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G Xcode ..

Cet exemple montre comment créer des fichiers vides pour l'implémentation avant de lancer CMake.

Il suffit de taper make dans le dossier de compilation pour compiler les tests. Cela devrait générer des erreurs de compilation. Une fois les erreurs corrigées, relance make. Quand toutes les erreurs de compilation sont corrigées, lance les tests :

$ ctest -V

Testlib

Les tests dépendent d'une petite bibliothèque appelée testlib, qui est téléchargée depuis github la première fois que la compilation est configurée avec cmake.

Si le téléchargement échoue, celui-ci peut être fait manuellement, par exemple :

mkdir testlib
cd testlib
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/CMakeLists.txt
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/TesterMain.f90