Tesztelés a Haskell kurzuson

Tanuld meg, hogyan teszteld a Haskell feladataidat az Exercism-ön


A tesztek futtatása

A tesztek futtatásához hajtsd végre a következő parancsot a feladat könyvtárában:

stack test

Ha minden fájlmentésnél le szeretnéd futtatni a teszteket, akkor helyette ezt a parancsot futtasd:

stack test --file-watch

Ha ilyen hibaüzenetet kapsz...

No .cabal file found in directory

Valószínűleg a stack egy régi verzióját használod, és frissítened kell.

Ha viszont ilyen hibaüzenetet kapsz...

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

Csak tedd azt, amit ír, és le fogja tölteni, majd telepíteni a megfelelő fordítóverziót:

stack setup

A feladat megoldása

Egy feladat megoldása egy Haskell-modul. A modul nevét a tesztekben egy import utasítás határozza meg, általában a legelején:

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

import ModuleName (someFunc)

main :: IO ()
main ...

Ebben a példában a tesztfájl a 4. sorban importál egy ModuleName nevű modult, amely egy someFunc nevű függvényt exportál. Ez azt jelenti, hogy létre kell hoznod egy ModuleName.hs nevű fájlt, amely valahogy így néz ki:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Találsz majd egy ilyen nevű fájlt a src/ könyvtárban, amelyet kiindulópontként használhatsz a megoldásodhoz.

Csak tartsd észben, hogy ez a váz csak azért van ott, hogy elindulhass vele. Nyugodtan átalakíthatod teljesen, ha úgy gondolod, hogy az a helyes.

Csomagok használata

Ha néhány csomag használatával elegánsabb megoldást szeretnél írni, először add hozzá a csomagokat a megoldásod függőségeihez a package.yaml fájlban:

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

Amíg helyben dolgozol, bármilyen csomagot használhatsz, amit csak szeretnél. Az online tesztfuttató azonban csak korlátozott számú csomaghoz fér hozzá. A rendelkezésre álló csomagok:

  • azok, amelyek előre telepítve vannak a GHC-vel (többek között base, containers, array, time, mtl, deepseq, exceptions, bytestring), valamint
  • azok, amelyeket előre lefordítottak a tesztfuttatóhoz, és a haskell-test-runner/pre-compiled/package.yaml oldalon vannak felsorolva.

Ha olyan megoldást küldesz be, amely egy nem elérhető csomagot használ, akkor a tesztfuttató belefut abba, hogy nincs internet-hozzáférése, és egy ilyen hibaüzenetet ad:

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

A GHCi futtatása

Ha szeretnél játszani a megoldásoddal a GHCi-ben, csak futtasd ezt a parancsot:

stack ghci

HLint (opcionális)

Erősen ajánlott, hogy futtasd a hlint-et a megoldásodon, hogy lássd, elkap-e valamit, amit kihagytál:

hlint ModuleName.hs

Nem kell elfogadnod a hlint összes javaslatát, de általában segítenek megtanulni, hogyan írj szép, idiomatikus Haskell-kódot.