Pergunta

QuickCheck e suas variantes (mesmo há um em Java ), parece ser interessante. No entanto, além de interesse acadêmico, é realmente útil em um teste de aplicativos reais (por exemplo. Uma aplicação GUI ou cliente / servidor ou mesmo tomar-se StackOverflow)? Todas as experiências que teve com geradores de teste semelhantes é apreciado.

Foi útil?

Solução

Sim, também. Na verdade não, mas eu estudei sob o homem que originalmente desenvolvido QuickCheck e ele é um cara muito interessante.

Em 2004, fomos forçados a usar QuickCheck para testar os nossos programas Haskell e foi combinação de bons e maus. Principalmente ruim porque Haskell era um pouco assustador em si, mas nunca a menos maravilhoso quando você tem que trabalhar.

John desde então tem aperfeiçoado o que ele escreveu anos atrás e teste Ericssion seu hardware de telecomunicações complexa realmente ajudou, e ele encontrou erros em 20 milhões ou menos linhas de código, reduzindo isso a apenas três passos através de sua abordagem. Ele é um grande orador por isso é sempre uma alegria ouvi-lo apresentar o que ele faz tão bem, mas apesar de tudo, o que fez com QuickCheck era novo para mim. Então eu perguntei a ele, o que seu interesse era em trazer isso para o mercado. Ele estava aberta à idéia, mas no momento em que seu negócio (baseado em torno QuickCheck) era relativamente novo e por isso havia outras áreas que ele iria se concentrar. Esta é agora 2007. Meu ponto é, você poderia aprender com QuickCheck mesmo se você não vai acabar usando-o.

Mas o que é QuickCheck? É uma uma estrutura de teste combinatória e uma maneira interessante de programas de teste. As pessoas em cima da Microsoft Research construiu Pex que é uma espécie de similar. Pex gera testes automaticamente examinando o seu IL. No entanto, John iria escrever um gerador para possíveis propriedades de entrada e de teste de uma função. A propriedade é algo que pode ser facilmente testado e é muito mais formal. por exemplo. revertendo uma lista? Bem, revertendo uma lista, é a mesma coisa que dividir uma lista em duas metades, revertendo-os cada um individualmente e, em seguida, concatenando as duas metades revertida em ordem inversa.

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

Esta é uma grande propriedade para teste com QuickCheck chamado a especificação eo resultado é bastante surpreendente.

Pex é bom, mas não tão legal quanto QuickCheck, Pex simplifica as coisas, QuickCheck faz para, mas é preciso muito esforço para escrever uma especificação bom.

O poder do QuickCheck é que quando ele é executado em um fracasso que irá reduzir a entrada que causou o teste falhar, a menor forma possível. Deixando-o com uma descrição detalhada do que progressão do estado causou o teste falhe. Em comparação com outras estruturas de teste que só vai tentar quebrar seu código de uma maneira força bruta.

Isto é possível devido à forma como você escreve sua especificação de testes. QuickCheck depende de pseudo-aleatoriedade para inventar entrada e é por isso, a sua capacidade de retrocesso e encontrar realmente pequena entrada que não passar o teste.

É muito mais trabalho para escrever propriedades QuickCheck mas o resultado final é melhor do teste. Como o próprio John disse, 70% dos erros são capturados por testes de unidade, mas é que outros 30%, o que faz com que seu programa para acidente. QuickCheck está testando esses últimos 30%.

Outras dicas

Eu fiz um problema real Haskell que envolveu a simulação de eventos discretos. Então eu escrevi uma biblioteca DES baseado na mônada continuação, juntamente com os equivalentes para MVars e Canais. Eu precisava verificar se isso funcionou corretamente, então eu escrevi um monte de propriedades QuickCheck para demonstrar que, por exemplo, dois fluxos de dados simultâneos escritos para um canal seria corretamente mescladas sem deixar cair nada.

Eu também usei QuickCheck para documentar e verificar as propriedades no meu Conjuntos de longo alcance e Decimal bibliotecas.

Em minha experiência QuickCheck às vezes é grande. Se você pode resumir uma propriedade importante de uma forma concisa, embora o algoritmo que proporciona que a propriedade tiver pêlos, QuickCheck é uma grande vitória. Por outro lado muitas vezes eu achar que o algoritmo é equivalente ao imóvel Pedir para verificar. Nesse caso, eu olhar para as propriedades mais simples. Por exemplo, a função supõem "foo" é suposto ser não-estritamente monotônica. Em seguida, você pode escrever

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

Eu uso QuickCheck para um monte de coisas pessoais. Nos últimos seis meses:

  • Ran QuickCheck para transformações de cores teste e transforma co-seno discretos em um compressor de imagem.

  • Ran QuickCheck para testar um módulo simbólico-diferenciação Eu chicoteado até por alguma otimização numérica.

  • Ran QuickCheck para testar uma árvore ternária-pesquisa no estilo de Bentley e Sedgewick.

QuickCheck raramente se encontra todas minha necessidades, mas é uma ótima maneira de começar --- e as leis QuickCheck fazer boa documentação de testes de unidade.

Eu usei-o bastante, principalmente na forma straighforward, principalmente para testar protocolo e analisador implementações.

No entanto, aqui é um pouco menos trivial da minha experiência pessoal: http://www.haskell.org/ haskellwiki / QuickCheck_as_a_test_set_generator

ScalaCheck (um QuickCheck para Scala) é usado para teste funcional Java, uma biblioteca que, entre outras coisas, implementos a QuickCheck para Java .

AFAIK xmonad é testada extensivamente com QuickCheck

Eu só tenho usado Haskell em um ambiente de produção para o desenvolvimento de pequenas ferramentas auxiliares. Principalmente porque eu sou o único desenvolvedor Sei que lê Haskell. Eu costumava QuickCheck extensivamente, porém, e ficou muito irritado que algo semelhante não está disponível em C #. Então, eu decidi tentar e escreva-me . Olhei para Pex também, mas encontrou as técnicas de exploração programa que são usados ??para encontrar entrada mínima menos interessante do que a maneira QuickCheck faz isso.

Eu uso QuickCheck para testar o comportamento de programas de linha de comando escritos em qualquer idioma.

É especialmente útil para encontrar entradas em que de baixo nível ou dinamicamente digitados programas acidente.

Por conveniência, eu escrevi http://hackage.haskell.org/package/proctest , que inclui alguns exemplos de QuickCheck ser utilizado em conjunto com hspec e HUnit para programas de linha de comando do teste desta forma.

FsCheck para verificar que os nossos OCaml para F # traduções estão corretas e que as nossas versões otimizadas trabalhar a mesmo que as versões-un optimizado. Eu também pretendo usá-lo para testar o lexer e analisador desde que o projeto NHol usa um analisador combinator.

Temos também funções auxiliares que permitem executar o teste dentro NUnit (xUnit para .Net). Consulte assertProp .

Eu tenho usado QuickCheck para testar codificador SMS PDU e decodificador em plataforma LG Linux Mobile. A (antiga) versão de um pedaço de software que desenvolveu nesse momento está disponível para download em http: / /hackage.haskell.org/package/GenSmsPdu-0.1

Não é meu projeto, mas o pacote containers usa QuickCheck bastante extensivamente. Pessoalmente, eu tentei usá-lo para comparar um primo pouco bobo peneira eu escrevi para um em arithmoi, o que me levou a descobrir que um em arithmoi às vezes segfaults.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top