Come testare sulla traccia di Haskell

Scopri come testare i tuoi esercizi di Haskell su Exercism


Eseguire i test

Esegui il comando seguente nella directory dell'esercizio per eseguire i test:

stack test

Per eseguire i test a ogni salvataggio di file, usa invece questo comando:

stack test --file-watch

Se ricevi un messaggio di errore come questo...

No .cabal file found in directory

Probabilmente stai usando una versione vecchia di stack e devi aggiornarla.

Altrimenti, se ricevi un messaggio di errore come questo...

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

Fai come dice: scaricherà ed installerà la versione corretta del compilatore:

stack setup

Risolvere l'esercizio

La soluzione di un esercizio è un modulo Haskell. Il nome del modulo è definito in un'istruzione di import nella suite di test, di solito all'inizio:

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

import ModuleName (someFunc)

main :: IO ()
main ...

In questo esempio, il file di test importa, alla riga 4, un modulo chiamato ModuleName, che esporta una funzione chiamata someFunc. Questo significa che devi creare un file chiamato ModuleName.hs simile a questo:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Troverai un file con questo nome già presente in src/, che puoi usare come punto di partenza per la soluzione.

Tieni solo presente che questo stub serve solo a iniziare. Sentiti libero di modificarlo completamente se pensi che sia la cosa giusta da fare.

Usare i pacchetti

Se vuoi usare dei pacchetti per scrivere una soluzione più elegante, aggiungi prima i pacchetti alle dipendenze della soluzione in package.yaml:

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

Mentre lavori in locale, puoi usare tutti i pacchetti che vuoi. Il test runner online, invece, ha accesso solo a un insieme limitato di pacchetti. I pacchetti disponibili sono

Se invii una soluzione che usa un pacchetto non disponibile, il test runner si imbatterà nella sua mancanza di accesso a internet e produrrà un errore simile a questo:

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 ...)

Usare GHCi

Se vuoi giocare con la soluzione in GHCi, esegui semplicemente il comando:

stack ghci

HLint (opzionale)

È altamente consigliato eseguire hlint sulla soluzione per vedere se individua qualcosa che ti è sfuggito:

hlint ModuleName.hs

Non devi accettare tutti i suggerimenti di hlint, ma di solito ti aiuteranno a imparare a scrivere codice Haskell bello ed idiomatico.