Proptest Rust : guide complet avec exemples concrets

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que Proptest et pourquoi l'utiliser ?

Proptest est une bibliothèque puissante pour le test par propriétés (property-based testing) en Rust. Contrairement aux tests unitaires classiques où vous définissez manuellement des données d'entrée et des résultats attendus, le test par propriétés vous permet de décrire des propriétés que votre programme doit respecter pour toutes les données d'entrée valides. La bibliothèque génère automatiquement une multitude de cas de test aléatoires et vérifie si les propriétés spécifiées sont satisfaites.

Pourquoi l'utiliser ?

  • Détection de bugs cachés : Les données aléatoires révèlent souvent des cas limites (edge cases) auxquels le développeur n'aurait pas pensé.
  • Réduction du code de test : Au lieu d'écrire des dizaines d'exemples, vous écrivez une seule propriété.
  • Minimisation automatique (shrinking) : Si un test échoue, Proptest tente automatiquement de trouver le plus petit jeu de données d'entrée qui reproduit l'erreur.
  • Documentation de la spécification : Les propriétés sont des assertions formelles et vérifiables sur le comportement du code.

Proptest s'inspire de la bibliothèque QuickCheck de Haskell, mais est adaptée aux spécificités de Rust, notamment la gestion de la possession, de l'emprunt et des traits.

Installation

Proptest est une bibliothèque Rust qui s'installe via le gestionnaire de paquets Cargo. Ajoutez-la dans la section [dev-dependencies] de votre fichier Cargo.toml :

[dev-dependencies]
proptest = "1.4"

Ensuite, exécutez la commande cargo build ou cargo test pour télécharger et compiler la bibliothèque. Proptest n'est utilisée que pendant les tests, elle n'augmente donc pas la taille de votre binaire final.

Pour le code asynchrone (tokio, async-std), une configuration supplémentaire peut être nécessaire, mais dans la plupart des cas, l'installation standard suffit.

Démarrage rapide avec un exemple de code

Écrivons un test simple qui vérifie que la fonction reverse (inversion d'une chaîne) est une involution : l'appliquer deux fois redonne la chaîne d'origine.

// src/lib.rs
pub fn reverse(s: &str) -> String {
    s.chars().rev().collect()
}

#[cfg(test)]
mod tests {
    use super::*;
    use proptest::prelude::*;

    proptest! {
        #[test]
        fn test_reverse_involution(s in ".*") { // ".*" — n'importe quelle chaîne
            let reversed = reverse(&s);
            let double_reversed = reverse(&reversed);
            prop_assert_eq!(s, double_reversed);
        }
    }
}

Lancez les tests : cargo test. Proptest générera 256 chaînes aléatoires (par défaut) et vérifiera que la propriété est respectée. Si le test échoue, vous verrez un message avec l'exemple minimal reproduisant l'erreur.

Méthodes et fonctions principales

Voici les composants clés de Proptest. Pour chacun, une description, les paramètres et un exemple sont fournis.

1. proptest! — macro pour définir des tests

Description : La macro principale qui exécute les tests par propriétés. Elle prend un bloc contenant les fonctions de test et génère automatiquement les données d'entrée.

Paramètres : À l'intérieur de la macro, vous définissez des tests avec l'attribut #[test]. Les données d'entrée sont spécifiées sous la forme param in strategy.

Exemple :

proptest! {
    #[test]
    fn test_addition_commutative(a in 0..100i32, b in 0..100i32) {
        prop_assert_eq!(a + b, b + a);
    }
}

2. prop_assert! et prop_assert_eq! — assertions

Description : Équivalents des assertions standard assert! et assert_eq!, mais adaptés à Proptest. Ils ne p

Recommendations