Les tests sur le parcours Haskell

Apprends à tester tes exercices Haskell sur Exercism


Exécute les tests

Exécute la commande suivante dans le répertoire de ton exercice pour lancer les tests :

stack test

Pour exécuter les tests à chaque sauvegarde de fichier, exécute plutôt cette commande :

stack test --file-watch

Si tu obtiens un message d'erreur comme celui-ci...

No .cabal file found in directory

Tu utilises probablement une ancienne version de stack et tu dois la mettre à niveau.

Sinon, si tu obtiens un message d'erreur comme celui-ci...

No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...

Fais simplement ce qu'il indique et il téléchargera et installera la bonne version du compilateur :

stack setup

Résous l'exercice

La solution d'un exercice est un module Haskell. Le nom du module est défini dans une instruction d'import dans la suite de tests, généralement au début :

import Test.Hspec        (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith)

import ModuleName (someFunc)

main :: IO ()
main ...

Dans cet exemple, le fichier de test importe, à la ligne 4, un module nommé ModuleName, qui exporte une fonction nommée someFunc. Cela signifie que tu dois créer un fichier nommé ModuleName.hs qui ressemblerait à ceci :

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Tu trouveras un fichier portant ce nom déjà en place dans src/, que tu peux utiliser comme point de départ pour ta solution.

Garde simplement à l'esprit que ce squelette est là juste pour te permettre de démarrer. N'hésite pas à le modifier complètement si tu penses que c'est la bonne chose à faire.

Utilise des paquets

Si tu veux utiliser des paquets pour écrire une solution plus élégante, ajoute d'abord les paquets aux dépendances de ta solution dans package.yaml :

library:
  exposed-modules: ModuleName
  source-dirs: src
  dependencies:
    - foo
    - bar

Lorsque tu travailles en local, tu peux utiliser tous les paquets que tu veux. L'exécuteur de tests en ligne, cependant, n'a accès qu'à un ensemble limité de paquets. Les paquets disponibles sont

  • ceux qui sont préinstallés avec GHC (notamment base, containers, array, time, mtl, deepseq, exceptions, bytestring), plus
  • ceux précompilés pour l'exécuteur de tests, listés dans haskell-test-runner/pre-compiled/package.yaml.

Si tu soumets une solution qui utilise un paquet non disponible, l'exécuteur de tests se heurtera à son absence d'accès à internet et produira une erreur qui ressemble à ceci :

Cabal file info not found for unavailable-package-1.0@..., updating
Selected mirror https://hackage.haskell.org/
Downloading root
HttpExceptionRequest Request {
  host                 = "hackage.haskell.org"
  ...
}
 (ConnectionFailure ...)

Lance GHCi

Si tu veux tester ta solution dans GHCi, exécute simplement la commande :

stack ghci

HLint (facultatif)

Il est fortement recommandé d'exécuter hlint sur ta solution pour voir s'il détecte quelque chose qui t'échappe :

hlint ModuleName.hs

Tu n'es pas obligé d'accepter toutes les suggestions de hlint, mais en général elles t'aideront à apprendre à écrire du code Haskell beau et idiomatique.