- Testes baseados em propriedades são um raro exemplo de pesquisa acadêmica que se tornou mainstream em menos de 30 anos.
- Sob o slogan "não escreva testes, gere-os", ganharam apoio em comunidades de várias linguagens de programação.
- A página da Wikipedia do QuickCheck, originalmente uma biblioteca de Haskell, lista 57 reimplementações em outras linguagens.
Levantamento das bibliotecas de testes baseados em propriedades
- Foram analisadas as bibliotecas de testes baseados em propriedades mais usadas atualmente e comparadas com o estado da arte de 15 anos atrás (2009).
- A maioria das bibliotecas não oferece os recursos mais avançados de testes baseados em propriedades.
Por que as bibliotecas de testes baseados em propriedades estão nesse estado triste?
Testes baseados em estado e testes paralelos não são tão úteis quanto testes puros
- A modelagem baseada em estado exige treinamento.
- Há quem defenda que o código fechado ajuda na adoção pela indústria.
A modelagem baseada em estado exige treinamento
- Testes baseados em estado e testes paralelos exigem uma forma de pensar diferente dos testes comuns.
- Ao oferecer essas ferramentas a novos usuários, é necessário treinamento adequado.
Há quem defenda que o código fechado ajuda na adoção pela indústria
- Argumenta-se que o open source não funcionou e que produtos de código fechado, junto com serviços relacionados, ajudam na adoção.
O que podemos fazer
- Fornecer implementações open source curtas de testes baseados em propriedades com estado e paralelos.
- Tornar a parte de especificação formal mais fácil, para exigir menos treinamento dos desenvolvedores.
Resumo dos testes baseados em propriedades puros
- Testar uma nova função ou funcionalidade é considerado uma boa prática.
- Por exemplo, se você escreveu uma função
reverse para inverter uma lista encadeada, faz sentido testá-la com algumas listas, como uma lista vazia.
- Gerar entradas aleatórias é a principal característica dos testes baseados em propriedades.
- A ideia é que entradas aleatórias eventualmente encontrarão casos extremos.
Testes baseados em propriedades com estado
- Ao testar componentes com estado, a mesma entrada não produz a mesma saída.
- Em testes baseados em estado, gera-se uma sequência de entradas para testar como o sistema muda ao longo do tempo.
- Usa-se uma implementação de referência em memória (modelo) para descrever explicitamente o estado.
Exemplo: contador
- Implementação de um contador usando uma variável global mutável.
- O modelo é representado como um inteiro.
- O teste gera e executa uma sequência de comandos para comparar a saída real com a saída do modelo.
Testes baseados em propriedades paralelos
- Testes paralelos reutilizam o modelo de testes baseados em estado para detectar condições de corrida.
- Testes paralelos usam um modelo de máquina de estados sequencial para executar testes paralelos por meio de linearizabilidade.
Conclusão e trabalhos futuros
- Para melhorar o estado dos testes baseados em propriedades, é necessário fornecer implementações open source e facilitar as especificações formais.
Opinião do GN⁺
- Este texto explica bem a história e o estado atual dos testes baseados em propriedades.
- Destaca a importância dos testes baseados em estado e paralelos, além de levantar a necessidade de implementações open source.
- Propõe formas de tornar os testes baseados em propriedades mais acessíveis.
- Outros projetos com funcionalidades semelhantes incluem Hypothesis (Python) e PropEr (Erlang).
- Reforça que treinamento e suporte são necessários ao adotar novas tecnologias ou open source.
1 comentários
Comentários do Hacker News
clojure.spec.alphaetest.checkfoi boahypothesisdo Python foi abandonado porque não conseguia lidar com conjuntos de dados grandesproptestdo Rust para escrever testes baseados em propriedades com estadoStateModelexige código adicional de framework e não é eficiente