O que é Proptest e para que serve?
\n\nProptest é uma poderosa biblioteca para testes baseados em propriedades (property-based testing) na linguagem Rust. Diferente dos testes unitários tradicionais, onde você define manualmente dados de entrada específicos e resultados esperados, os testes baseados em propriedades permitem descrever propriedades que seu programa deve satisfazer para quaisquer dados de entrada válidos. A biblioteca gera automaticamente vários casos de teste aleatórios e verifica se as propriedades definidas são atendidas.
\n\nPara que serve?
\n- \n
- Detecção de bugs ocultos: Dados aleatórios frequentemente encontram casos extremos (edge cases) que o desenvolvedor nem imaginava. \n
- Redução do volume de código de teste: Em vez de escrever dezenas de exemplos, você escreve uma única propriedade. \n
- Minimização automática (shrinking): Se um teste falhar, o Proptest tenta automaticamente encontrar o menor conjunto de dados de entrada que reproduz o erro. \n
- Documentação da especificação: Propriedades são afirmações formais e verificáveis sobre o comportamento do código. \n
Proptest é inspirado na biblioteca QuickCheck de Haskell, mas adaptado às particularidades do Rust, incluindo o trabalho com posse, empréstimo e traits.
Instalação
\n\nProptest é uma biblioteca para Rust, portanto é instalada através do gerenciador de pacotes Cargo. Adicione-a na seção [dev-dependencies] do seu arquivo Cargo.toml:
[dev-dependencies]\nproptest = "1.4"\n\nDepois disso, execute o comando cargo build ou cargo test para baixar e compilar a biblioteca. Proptest é usado apenas durante os testes, portanto não aumenta o tamanho do seu binário final.
Para trabalhar com código assíncrono (tokio, async-std), pode ser necessária configuração adicional, mas na maioria dos casos a instalação padrão é suficiente.
\n\nInício rápido com exemplo de código
\n\nVamos escrever um teste simples que verifica se a função reverse (inverter string) é uma involução: aplicar duas vezes retorna a string original.
// src/lib.rs\npub fn reverse(s: &str) -> String {\n s.chars().rev().collect()\n}\n\n#[cfg(test)]\nmod tests {\n use super::*;\n use proptest::prelude::*;\n\n proptest! {\n #[test]\n fn test_reverse_involution(s in ".*") { // ".*" — qualquer string\n let reversed = reverse(&s);\n let double_reversed = reverse(&reversed);\n prop_assert_eq!(s, double_reversed);\n }\n }\n}\n\nExecute os testes: cargo test. O Proptest gerará 256 strings aleatórias (padrão) e verificará se a propriedade é atendida. Se o teste falhar, você verá uma mensagem com o exemplo mínimo que reproduz o erro.
Principais métodos e funções
\n\nAbaixo estão os componentes principais do Proptest. Para cada um, são fornecidos descrição, parâmetros e exemplo.
\n\n1. proptest! — macro para definir testes
\nDescrição: Macro principal que executa testes baseados em propriedades. Ela aceita um bloco com funções de teste e gera automaticamente os dados de entrada.
\nParâmetros: Dentro da macro, você define testes com o atributo #[test]. Os dados de entrada são definidos no formato param in strategy.
Exemplo:
\nproptest! {\n #[test]\n fn test_addition_commutative(a in 0..100i32, b in 0..100i32) {\n prop_assert_eq!(a + b, b + a);\n }\n}\n\n2. prop_assert! e prop_assert_eq! — asserções
\nDescrição: Análogas às macros padrão assert!
Também na biblioteca
Tokens JWT em C# (.NET): trabalhando com System.IdentityModel.Tokens.Jwt
Cliente Redis (go-redis) para Go: guia completo com exemplos
Bibliotecas WebSocket TypeScript: ws e Socket.IO – guia completo
Trabalho com XML em Java: DOM, SAX, StAX e JAXB