Lerne, wie du deine Haskell-Übungen auf Exercism testest
Führe den folgenden Befehl in deinem Übungsverzeichnis aus, um die Tests auszuführen:
stack test
Um die Tests bei jedem Speichern einer Datei auszuführen, verwende stattdessen diesen Befehl:
stack test --file-watch
No .cabal file found in directory
Dann verwendest du wahrscheinlich eine alte Version von stack und musst sie aktualisieren.
No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...
Dann befolge einfach die Anweisung, und die richtige Compiler-Version wird heruntergeladen und installiert:
stack setup
Eine Lösung für eine Übung ist ein Haskell-Modul. Der Name des Moduls wird in einer import-Anweisung in der Testsuite festgelegt, meist am Anfang:
import Test.Hspec (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith)
import ModuleName (someFunc)
main :: IO ()
main ...
In diesem Beispiel importiert die Testdatei in Zeile 4 ein Modul namens ModuleName, das eine Funktion namens someFunc exportiert. Das bedeutet, du musst eine Datei namens ModuleName.hs anlegen, die ungefähr so aussieht:
module ModuleName (someFunc) where
someFunc :: ...
someFunc ...
Eine Datei mit diesem Namen findest du bereits unter src/. Du kannst sie als Ausgangspunkt für deine Lösung verwenden.
Denk nur daran, dass dieses Stub nur als Einstieg für dich da ist. Du kannst es auch komplett ändern, wenn du das für richtig hältst.
Wenn du Pakete verwenden möchtest, um eine elegantere Lösung zu schreiben, füge sie zuerst in package.yaml zu den Abhängigkeiten deiner Lösung hinzu:
library:
exposed-modules: ModuleName
source-dirs: src
dependencies:
- foo
- bar
Wenn du lokal arbeitest, kannst du beliebige Pakete verwenden. Der Online-Test-Runner hat jedoch nur Zugriff auf eine begrenzte Auswahl an Paketen. Die verfügbaren Pakete sind
base, containers, array, time, mtl, deepseq, exceptions, bytestring), sowieWenn du eine Lösung einreichst, die ein nicht verfügbares Paket verwendet, stößt der Test-Runner auf seinen fehlenden Internetzugang und erzeugt eine Fehlermeldung wie diese:
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 ...)
Wenn du mit deiner Lösung in GHCi herumprobieren möchtest, führe einfach diesen Befehl aus:
stack ghci
Es wird sehr empfohlen, hlint auf deine Lösung anzuwenden, um zu sehen, ob es etwas findet, das dir entgangen ist:
hlint ModuleName.hs
Du musst nicht alle Vorschläge von hlint annehmen, aber meist helfen sie dir zu lernen, wie man schönen, idiomatischen Haskell-Code schreibt.