Flusso di lavoro di test Haskell


101

Ho appena avviato un nuovo progetto Haskell e volevo impostare un buon flusso di lavoro di test dall'inizio. Sembra che Haskell abbia molti strumenti di test eccellenti e unici e molti modi diversi per integrarli.

Ho esaminato:

Tutti sembrano funzionare molto bene nei loro domini, ma sto cercando un approccio completo ai test e mi chiedevo cosa ha funzionato bene per le altre persone.

Risposte:


70

Ottenere test unitari, copertura del codice e benchmark corretti significa principalmente scegliere gli strumenti giusti.

  • test-framework fornisce uno sportello unico per eseguire tutti i casi di test HUnit e le proprietà QuickCheck da un unico cablaggio.
  • La copertura del codice è incorporata in GHC sotto forma di strumento HPC .
  • Criterion fornisce alcuni ottimi strumenti di benchmarking

Userò come esempio in esecuzione un pacchetto che ho appena iniziato ad abilitare con unit test, copertura del codice e benchmark:

http://github.com/ekmett/speculation

Puoi integrare i tuoi test e benchmark direttamente nel tuo file cabal aggiungendo sezioni per loro e mascherandoli dietro le bandiere in modo che non facciano in modo che ogni utente della tua libreria abbia accesso (e voglia usarli per se stesso ) la versione esatta degli strumenti di test che hai scelto.

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

Quindi, puoi dire a cabal come eseguire la tua suite di test. Poiché il test della cabala non esiste ancora, abbiamo uno studente che ci sta lavorando per l'estate del codice di quest'anno! - il miglior meccanismo che abbiamo è Ecco come utilizzare il meccanismo di user hook di cabal. Ciò significa passare a una build "personalizzata" con cabal e configurare un testHook. Un esempio di testHook che esegue un programma di test scritto con test-framework e quindi applica hpc al profilo può essere trovato qui:

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

E poi puoi usare test-framework per raggruppare i test QuickCheck e HUnit in un unico programma:

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

Il file cabal fa attenzione ad attivare -fhpc per abilitare il test della copertura del codice, quindi testHook in Setup.lhs esegue manualmente hpc e scrive il suo output nella directory dist.

Per il benchmarking, la storia è un po 'più manuale, non esiste un'opzione "cabal benchmark". Potresti collegare i tuoi benchmark al tuo hook di prova, ma mi piace eseguirli a mano, poiché Criterion ha così tante opzioni grafiche di reporting. Puoi aggiungere i tuoi benchmark al file cabal come mostrato sopra, dare loro flag di compilazione separati, nasconderli dietro una bandiera cabal e quindi usare Criterion per fare tutto il lavoro pesante:

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

È quindi possibile eseguire i benchmark dalla riga di comando e ottenere finestre KDE a comparsa con i risultati dei benchmark, ecc.

Dal momento che in pratica stai comunque vivendo nella cabala mentre sviluppi il codice Haskell, ha molto senso integrare la tua toolchain con esso.

Modifica : ora esiste il supporto per il test Cabal. Vedi http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
E cabal benchora esiste anche.
nh2

6
Vero. Vorrei ricordare a github.com/ekmett/lens come un esempio più moderno di come affrontare cabal teste cabal bench, mescolando HUnit, docteste quickchecktest basati con criterionparametri di riferimento. Il codice in speculationanteprime cabal teste cabal bench.
Edward KMETT

2
@EdwardKmett: ho visto che il pacchetto lense utilizza solo l'interfaccia della suite di test exitcode-stdio-1.0. La guida dell'utente di Cabal afferma che `` è preferibile scrivere nuove suite di test per l'interfaccia dettagliata 1.0 ''. Qualche commento su questo?
Copton

9
@ Copton Non l'hanno mai implementato. Quella documentazione deve essere ritirata e ripresa.
Edward KMETT

2
Sfortunatamente, i collegamenti a GitHub puntano tutti al ramo principale e sembra che tutto ciò che riguarda il test sia stato rimosso dal file cabal, quindi i collegamenti sono effettivamente interrotti.
Andrew Thaddeus Martin

52

L'approccio è sostenuto in RWH cap 11 e in XMonad è approssimativamente:

  • Indicare tutte le proprietà del sistema in QuickCheck
  • Mostra la copertura del test con HPC.
  • Conferma il comportamento dello spazio con il profilo dell'heap .
  • Conferma il comportamento del thread / parallelo con ThreadScope .
  • Conferma il comportamento del microbenchmark con Criterion .

Una volta stabiliti i principali invarianti tramite QuickCheck, è possibile avviare il refactoring, spostando tali test in invarianti di tipo.

Pratiche per supportare i tuoi sforzi:

  • Esegui una regressione QuickCheck semplificata su ogni commit.
  • Pubblica i dettagli sulla copertura HPC.

14

Il pacchetto del framework di test è davvero fantastico. È possibile integrare facilmente i test HUnit e QuickCheck e ottenere eseguibili che eseguono solo suite specifiche, in base ai flag della riga di comando, con più destinazioni di output.

Tuttavia, test e profiling sono bestie diverse. Per la profilazione avrei impostato un eseguibile separato che sottolinea solo la sezione che si desidera profilare e solo guardando attentamente i risultati delle compilazioni e delle esecuzioni della profilatura (con -prof-auto-all per la compilazione e + RTS -p per un runtime bandiera).


Un successore mantenuto più attivamente per test-framework è gustoso .
sjakobi

10

Per i test, mi affido alle proprietà HUnit e QuickCheck e utilizzo Haskell Test Framework per raccogliere automaticamente tutti gli unit test e tutte le proprietà QuickCheck.

Dichiarazione di non responsabilità: sono lo sviluppatore principale di Haskell Test Framework.


5
Stefan, c'è così poca documentazione su questo. Immagino che questa sia la ragione principale per cui rimane impopolare. C'è una domanda qui che merita sicuramente la tua attenzione: stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov

2
La nuova versione 0.9.0.0 di HTF ora viene fornita con molta documentazione. Inoltre, ho spostato lo sviluppo su github.com/skogsbaer/HTF . Spero che questo renderà più facile per le persone usare HTF e porre domande su HTF. Sentiti libero di farlo!
stefanwehr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.