Тестування на треку Haskell

Дізнайтеся, як тестувати свої вправи з Haskell на Exercism


Запуск тестів

Виконайте наступну команду в каталозі вправи, щоб запустити тести:

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 у наборі тестів, зазвичай на початку:

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

Працюючи локально, можна використовувати будь-які пакети. А от онлайн test runner має доступ лише до обмеженого набору пакетів. Доступні такі пакети:

  • ті, що встановлені разом із GHC (зокрема base, containers, array, time, mtl, deepseq, exceptions, bytestring), а також
  • ті, що наперед зібрані для test runner і перелічені в haskell-test-runner/pre-compiled/package.yaml.

Якщо надіслати рішення, яке використовує недоступний пакет, то test runner натрапить на відсутність доступу до інтернету і видасть приблизно таку помилку:

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.