Fluxo de trabalho de teste de Haskell

101

Acabei de começar um novo projeto Haskell e queria configurar um bom fluxo de trabalho de teste desde o início. Parece que Haskell tem muitas ferramentas de teste excelentes e exclusivas e muitas maneiras diferentes de integrá-las.

Eu pesquisei:

Todos parecem funcionar muito bem em seus domínios, mas estou procurando uma abordagem abrangente para testes e gostaria de saber o que funcionou bem para outras pessoas.

Amccausl
fonte

Respostas:

70

Obter testes de unidade, cobertura de código e benchmarks corretos é principalmente sobre escolher as ferramentas certas.

  • test-framework fornece um balcão único para executar todos os seus casos de teste HUnit e propriedades QuickCheck de um único chicote.
  • A cobertura do código é integrada ao GHC na forma da ferramenta HPC .
  • A Criterion fornece algumas ótimas máquinas de benchmarking

Usarei como exemplo de execução um pacote que acabei de ativar com testes de unidade, cobertura de código e benchmarks:

http://github.com/ekmett/speculation

Você pode integrar seus testes e benchmarks diretamente em seu arquivo de cabal, adicionando seções para eles, e mascarando-os atrás de sinalizadores para que eles não façam isso de forma que todos os usuários de sua biblioteca tenham acesso (e queiram usar para si próprios ) a versão exata das ferramentas de teste que você escolheu.

http://github.com/ekmett/speculation/blob/master/speculation.cabal

Então, você pode contar à cabal como executar seu conjunto de testes. Como o teste de cabala ainda não existe - temos um aluno trabalhando nisso para o verão de código deste ano! - o melhor mecanismo que temos é aqui como usar o mecanismo de gancho do usuário da cabal. Isso significa mudar para uma construção 'Custom' com cabal e configurar um testHook. Um exemplo de testHook que executa um programa de teste escrito com test-framework e, em seguida, aplica hpc ao perfil dele pode ser encontrado aqui:

http://github.com/ekmett/speculation/blob/master/Setup.lhs

E então você pode usar o test-framework para agrupar os testes QuickCheck e HUnit em um programa:

http://github.com/ekmett/speculation/blob/master/Test.hs

O arquivo cabal tem o cuidado de ativar -fhpc para habilitar o teste de cobertura de código e, em seguida, o testHook em Setup.lhs executa manualmente o hpc e grava sua saída em seu diretório dist.

Para benchmarking, a história é um pouco mais manual, não há opção de 'benchmark cabal'. Você poderia conectar seus benchmarks em seu gancho de teste, mas eu gosto de executá-los manualmente, uma vez que o Criterion tem muitas opções de relatórios gráficos. Você pode adicionar seus benchmarks ao arquivo de cabala conforme mostrado acima, dar-lhes sinalizadores de compilação separados, ocultá-los atrás de um sinalizador de cabala e, em seguida, usar o critério para fazer todo o trabalho pesado:

http://github.com/ekmett/speculation/blob/master/Benchmark.hs

Você pode então executar seus benchmarks a partir da linha de comando e obter janelas pop-up do KDE com resultados de benchmarks, etc.

Já que, na prática, você está vivendo em cabala enquanto desenvolve o código Haskell, faz muito sentido integrar seu conjunto de ferramentas a ele.

Edit : O suporte ao teste Cabal agora existe. Consulte http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites

Edward KMETT
fonte
2
E cabal benchagora existe também.
nh2
6
Verdade. Eu apontaria para github.com/ekmett/lens como um exemplo mais moderno de como lidar com cabal teste cabal bench, misturando HUnit, docteste quickchecktestes baseados com criterionbenchmarks. O código em speculationpredates cabal teste cabal bench.
Edward KMETT
2
@EdwardKmett: Eu vi que o pacote de lentes usa apenas a interface do conjunto de testes exitcode-stdio-1.0. O guia do usuário Cabal afirma que `` é preferível que novos conjuntos de testes sejam escritos para a interface detalhada-1.0 ''. Algum comentário sobre isso?
copton
9
@copton Eles nunca o implementaram. Essa documentação precisa ser retirada e fuzilada.
Edward KMETT
2
Infelizmente, todos os links para o github apontavam para o branch master, e parece que tudo relacionado ao teste foi removido do arquivo cabal, então os links estão efetivamente quebrados.
Andrew Thaddeus Martin
52

A abordagem é defendida em RWH ch 11 e em XMonad é aproximadamente:

  • Indique todas as propriedades do sistema no QuickCheck
  • Mostre a cobertura do teste com HPC.
  • Confirme o comportamento do espaço com o perfil de heap .
  • Confirme o comportamento de thread / paralelo com ThreadScope .
  • Confirme o comportamento do microbenchmark com o Critério .

Depois que suas invariantes principais forem estabelecidas por meio do QuickCheck, você pode começar a refatorar, movendo esses testes para invariantes de tipo.

Práticas para apoiar seus esforços:

  • Execute uma regressão QuickCheck simplificada em cada confirmação.
  • Publique detalhes de cobertura de HPC.
Don Stewart
fonte
14

O pacote test-framework é realmente incrível. Você pode integrar facilmente os testes HUnit e QuickCheck e obter executáveis ​​que executam apenas suítes especificadas, com base em sinalizadores de linha de comando, com vários destinos de saída.

Testar e criar perfis são feras diferentes. Para a criação de perfil, eu configuraria um executável separado que enfatiza apenas a seção que você deseja criar o perfil, e apenas observando cuidadosamente os resultados das compilações e execuções de criação de perfil (com -prof-auto-all para compilação e + RTS -p para um tempo de execução bandeira).

sclv
fonte
Um sucessor mais ativamente mantido para o framework de teste é saboroso .
sjakobi
10

Para testes, confio nas propriedades HUnit e QuickCheck e uso o Haskell Test Framework para coletar todos os testes de unidade e todas as propriedades QuickCheck automaticamente.

Aviso: Sou o principal desenvolvedor do Haskell Test Framework.

Stefanwehr
fonte
5
Stefan, há tão pouca documentação sobre isso. Acho que essa é a razão principal para que continue impopular. Há uma questão aqui definitivamente digna de sua atenção: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov
2
A nova versão 0.9.0.0 do HTF agora vem com bastante documentação. Além disso, mudei o desenvolvimento para github.com/skogsbaer/HTF . Espero que isso torne mais fácil para as pessoas usarem o HTF e fazerem perguntas sobre o HTF. Sinta-se a vontade para fazer isso!
stefanwehr