Testes na trilha de Haskell

Aprenda a testar seus exercícios de Haskell no Exercism


Executando os testes

Execute o comando a seguir no diretório do exercício para rodar os testes:

stack test

Para rodar os testes a cada vez que você salvar um arquivo, use este comando:

stack test --file-watch

Se você receber uma mensagem de erro como esta...

No .cabal file found in directory

Provavelmente você está usando uma versão antiga do stack e precisa atualizá-la.

Caso contrário, se você receber uma mensagem de erro como esta...

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

É só fazer o que ela diz, e a versão correta do compilador será baixada e instalada:

stack setup

Como resolver o exercício

A solução de um exercício é um módulo Haskell. O nome do módulo é definido em uma instrução de importação na suíte de testes, geralmente no começo:

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

import ModuleName (someFunc)

main :: IO ()
main ...

Neste exemplo, o arquivo de teste importa, na linha 4, um módulo chamado ModuleName, que exporta uma função chamada someFunc. Isso significa que você precisa criar um arquivo chamado ModuleName.hs mais ou menos assim:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Você vai encontrar um arquivo com esse nome já pronto em src/, que você pode usar como ponto de partida para a sua solução.

Só tenha em mente que esse esboço está ali apenas para você começar. Fique à vontade para mudá-lo por completo se achar que é a coisa certa a fazer.

Usando pacotes

Se você quiser usar alguns pacotes para escrever uma solução mais elegante, primeiro adicione os pacotes às dependências da sua solução em package.yaml:

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

Enquanto trabalha localmente, você pode usar quaisquer pacotes que quiser. O executor de testes on-line, no entanto, tem acesso apenas a um conjunto limitado de pacotes. Os pacotes disponíveis são

  • os que já vêm instalados com o GHC (principalmente base, containers, array, time, mtl, deepseq, exceptions, bytestring), mais
  • aqueles pré-compilados para o executor de testes, listados em haskell-test-runner/pre-compiled/package.yaml.

Se você enviar uma solução que usa um pacote que não está disponível, o executor de testes vai esbarrar na falta de acesso à internet e produzir um erro parecido com este:

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

Executando o GHCi

Se você quiser brincar com a sua solução no GHCi, basta rodar o comando:

stack ghci

HLint (opcional)

É altamente recomendável que você rode o hlint na sua solução para ver se ele detecta algo que você deixou passar:

hlint ModuleName.hs

Você não precisa aceitar todas as sugestões do hlint, mas normalmente elas ajudam você a aprender a escrever um código Haskell bonito e idiomático.