Domanda

QuickCheck e sue varianti (anche c'è uno in Java ), sembra essere interessante. Tuttavia, a parte interesse accademico, è davvero utile in un vero e proprio test di applicazione (ad esempio. Un'applicazione GUI o client / server o anche prendere StackOverflow stesso)? Eventuali esperienze avete avuto con simili generatori di test è apprezzato.

È stato utile?

Soluzione

Sì, bene. In realtà no, ma ho studiato sotto l'uomo che ha originariamente sviluppato QuickCheck e lui è un ragazzo molto interessante.

Nel 2004, siamo stati costretti a utilizzare QuickCheck per testare i nostri programmi Haskell ed è stato combinazione di buoni e cattivi. Per lo più male perché Haskell era un po 'scoraggiante per sé ma mai meno meraviglioso quando l'avete ottenuto lavorando.

John ha da allora perfezionato ciò che ha scritto anni fa e in realtà ha aiutato Ericsson testare il loro hardware di telecomunicazioni complessi, e lui trovato cimici in 20 milioni o giù di lì righe di codice che riducendo a soli tre passi attraverso il suo approccio. Lui è un grande oratore quindi è sempre una gioia ascoltarlo presentare quello che fa così bene, ma, tutto sommato, quello che ha fatto con QuickCheck era nuovo per me. Così gli ho chiesto, ciò che il suo interesse era nel portare questo al mercato. E 'stato aperto all'idea, ma al momento la sua attività (basato intorno QuickCheck) era relativamente nuovo e quindi c'erano altre aree avrebbe concentrarsi su. Questo è ora il 2007. Il mio punto è, si potrebbe imparare da QuickCheck anche se voi non finisce di usarlo.

Ma che cosa è QuickCheck? Si tratta di un un framework di test combinatoria e un modo interessante per testare i programmi. Le persone con più di Microsoft Research ha costruito Pex , che è una sorta di simile. Pex genera automaticamente i test esaminando la vostra IL. Tuttavia, John scriverà un generatore di eventuali proprietà di input e di test di una funzione. Una proprietà è qualcosa che può essere facilmente testato ed è molto più formale. per esempio. invertendo una lista? Beh, invertendo una lista, è la stessa cosa di dividere la lista in due metà, li invertendo ciascuno individualmente e poi concatenando le due metà invertite in ordine inverso.

1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A

Questa è una grande proprietà di testare con QuickCheck chiamato la specifica e il risultato è abbastanza sorprendente.

Pex è bello, ma non così freddo come QuickCheck, Pex semplifica le cose, QuickCheck fa per ma ci vuole un grande sforzo per scrivere un buon specifica.

Il potere di QuickCheck è che quando si corre in un fallimento che ridurrà l'input che ha causato il vostro fallimento del test, alla più piccola forma possibile. lasciando con una descrizione dettagliata di ciò che la progressione dello stato causato il test al sicuro. In confronto ad altri framework di test che sarà solo cercare di rompere il codice in maniera forza bruta.

Ciò è reso possibile grazie al modo in cui si scrive lo specifiche analitiche. QuickCheck si basa su pseudo-casualità di inventare di ingresso ed è a causa di questo, il suo grado di backtracking e trovare veramente piccolo ingresso che non passa il test.

E 'molto più lavoro per scrivere le proprietà QuickCheck ma il risultato finale è migliore prova. Come ha detto Giovanni stesso, il 70% degli insetti sono catturati dai test di unità, ma è che il restante 30%, che fa sì che il crash del programma. QuickCheck sta testando quelli scorso del 30%.

Altri suggerimenti

Ho fatto un vero e proprio problema Haskell che ha coinvolto un simulazione ad eventi discreti. Così ho scritto una libreria DES basata sulla monade di continuazione, insieme con gli equivalenti a MVars e Canali. Avevo bisogno di controllare che questo ha funzionato correttamente, così ho scritto un sacco di proprietà QuickCheck per dimostrare che, per esempio, due flussi di dati simultanei scritti in un canale sarebbe correttamente fusi senza far cadere nulla.

Ho anche usato QuickCheck per documentare e verificare le proprietà del mio con intervallo Imposta e decimale librerie.

Nella mia esperienza QuickCheck a volte è grande. Se si può riassumere una proprietà importante in modo conciso, anche se l'algoritmo che fornisce che la proprietà è peloso, allora QuickCheck è una grande vittoria. D'altra parte spesso trovo che l'algoritmo è equivalente alla proprietà che voglio verificare. In quel caso io guardo per le proprietà più semplici. Per esempio, la funzione supponiamo "foo" dovrebbe essere non strettamente monotona. Poi si può scrivere

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)

Io uso QuickCheck per un sacco di cose personali. Negli ultimi sei mesi:

  • Ran QuickCheck testare trasformazioni di colore e coseno discreta trasforma in un compressore di immagini.

  • Ran QuickCheck per testare un modulo simbolico differenziazione ho incitato per qualche ottimizzazione numerica.

  • Ran QuickCheck per testare un albero ternario-ricerca nello stile di Bentley e Sedgewick.

QuickCheck incontra raramente tutti la mia unità-test esigenze, ma è un ottimo modo per iniziare --- e le leggi QuickCheck fare una buona documentazione.

L'ho usato un bel po ', per lo più in maniera straighforward, soprattutto per test di protocollo e parser implementazioni.

Tuttavia, qui è po 'meno banale dalla mia esperienza personale: http://www.haskell.org/ haskellwiki / QuickCheck_as_a_test_set_generator

ScalaCheck (un QuickCheck per Scala) è usato per testare Java funzionale , una biblioteca che, tra le altre cose, utensileria un QuickCheck per Java .

AFAIK XMonad viene testato ampiamente con QuickCheck

Ho solo usato Haskell in un ambiente di produzione per lo sviluppo di strumenti di supporto poco. Soprattutto perché io sono l'unico sviluppatore So che legge Haskell. Ho usato QuickCheck ampiamente, però, e sono davvero infastidito dal fatto che qualcosa di simile non è disponibile in C #. Così ho deciso di provare a scriverla io . Ho guardato Pex troppo, ma ha trovato le tecniche di esplorazione programma che vengono utilizzate per trovare un input minimo meno interessante il modo in cui lo fa QuickCheck.

Io uso QuickCheck per testare il comportamento dei programmi a linea di comando scritti in qualsiasi lingua.

E 'particolarmente utile per trovare gli ingressi su cui basso livello o programmi dinamicamente tipizzati incidente.

Per comodità, ho scritto http://hackage.haskell.org/package/proctest , che comprende alcuni esempi di QuickCheck utilizzato insieme con hspec e HUnit testare programmi da linea di comando in questo modo.

FsCheck per verificare che i nostri OCaml a F # traduzioni siano corrette, e che le nostre versioni ottimizzate funzionano stesse delle versioni non-ottimizzate. Ho anche intenzione di usarlo per testare il lexer e parser dal momento che il NHol progetto utilizza un parser combinatore.

Abbiamo anche funzioni di supporto che ci permettono di eseguire il test entro NUnit (xUnit per .Net). Vedere assertProp .

L'ho usato per la prova QuickCheck SMS PDU encoder e decoder nella piattaforma di LG Linux Mobile. A (vecchia) versione di un pezzo di software che ho sviluppato in quel momento è disponibile per il download all'indirizzo http: / /hackage.haskell.org/package/GenSmsPdu-0.1

Non è il mio progetto, ma il pacchetto containers utilizza QuickCheck abbastanza ampiamente. Personalmente, ho provato ad usarlo per confrontare un po 'di setaccio primo sciocco che ho scritto a uno in arithmoi, che mi ha portato a scoprire che uno in arithmoi volte segfaults.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top