Tests im Haskell-Track

Lerne, wie du deine Haskell-Übungen auf Exercism testest


Tests ausführen

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

Wenn du eine Fehlermeldung wie diese bekommst ...

No .cabal file found in directory

Dann verwendest du wahrscheinlich eine alte Version von stack und musst sie aktualisieren.

Andernfalls, wenn du eine Fehlermeldung wie diese bekommst ...

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

Die Übung lösen

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.

Pakete verwenden

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

  • die Pakete, die bei GHC bereits vorinstalliert sind (insbesondere base, containers, array, time, mtl, deepseq, exceptions, bytestring), sowie
  • diejenigen, die für den Test-Runner vorkompiliert wurden und unter haskell-test-runner/pre-compiled/package.yaml aufgeführt sind.

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

GHCi ausführen

Wenn du mit deiner Lösung in GHCi herumprobieren möchtest, führe einfach diesen Befehl aus:

stack ghci

HLint (optional)

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.