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.