Haskell 軌道的測試

了解如何在 Exercism 上測試你的 Haskell 練習


執行測試

在練習目錄中執行下列指令來執行測試:

stack test

如果想在每次儲存檔案時執行測試,請改用這個指令:

stack test --file-watch

如果你看到像這樣的錯誤訊息……

No .cabal file found in directory

你用的可能是舊版的 stack,需要升級。

否則,如果你看到像這樣的錯誤訊息……

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

照著它說的做就對了,它會下載並安裝正確的編譯器版本:

stack setup

解題

練習的解答是一個 Haskell 模組。模組名稱定義在測試套件裡的匯入敘述中,通常位於開頭:

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

import ModuleName (someFunc)

main :: IO ()
main ...

在這個例子中,測試檔在第 4 行匯入了一個名為 ModuleName 的模組,該模組匯出一個名為 someFunc 的函式。這表示你必須建立一個名為 ModuleName.hs 的檔案,內容大致如下:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

你會發現在 src/ 裡已經有同名檔案,可以把它當作解答的起點。

只要記得,這個起始範本只是為了讓你踏出第一步。如果你認為有必要,儘管把它整個改掉。

使用套件

如果你想用一些套件寫出更優雅的解答,請先在 package.yaml 中把這些套件加入解答的相依套件:

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

在本機開發時,你可以使用任何你喜歡的套件。不過,線上測試執行器只能使用有限的套件。可用的套件包括

  • GHC 預先安裝的套件(最常見的有 base、containers、array、time、mtl、deepseq、exceptions、bytestring),以及
  • 測試執行器預先建置好的套件,列在 haskell-test-runner/pre-compiled/package.yaml。

如果你提交的解答使用了無法取得的套件,測試執行器會因為沒有網路連線而產生像這樣的錯誤:

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

如果你想在 GHCi 中試玩自己的解答,只要執行這個指令:

stack ghci

HLint(選用)

強烈建議你對解答執行 hlint,看看它能不能抓到你漏掉的問題:

hlint ModuleName.hs

你不一定要接受 hlint 給的所有建議,但這些建議通常能幫助你學會怎麼寫出漂亮又道地的 Haskell 程式碼。