Proptest para Rust: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Proptest e para que serve?

\n\n

Proptest é 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\n

Para 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
\n\n

Proptest é inspirado na biblioteca QuickCheck de Haskell, mas adaptado às particularidades do Rust, incluindo o trabalho com posse, empréstimo e traits.

\n\n

Instalação

\n\n

Proptest é 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:

\n\n
[dev-dependencies]\nproptest = "1.4"
\n\n

Depois 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.

\n\n

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\n

Início rápido com exemplo de código

\n\n

Vamos escrever um teste simples que verifica se a função reverse (inverter string) é uma involução: aplicar duas vezes retorna a string original.

\n\n
// 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\n

Execute 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.

\n\n

Principais métodos e funções

\n\n

Abaixo estão os componentes principais do Proptest. Para cada um, são fornecidos descrição, parâmetros e exemplo.

\n\n

1. proptest! — macro para definir testes

\n

Descriçã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.

\n

Parâmetros: Dentro da macro, você define testes com o atributo #[test]. Os dados de entrada são definidos no formato param in strategy.

\n

Exemplo:

\n
proptest! {\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\n

2. prop_assert! e prop_assert_eq! — asserções

\n

Descrição: Análogas às macros padrão assert!

Recommendations