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

proptest pour Rust : guide complet du test basé sur les propriétés

1. Qu'est-ce que proptest et pourquoi l'utiliser ?

La bibliothèque proptest est un framework puissant pour le test basé sur les propriétés (property-based testing) en Rust. Contrairement aux tests unitaires classiques où vous spécifiez manuellement des entrées et un résultat attendu, le test basé sur les propriétés vous permet de décrire des propriétés (invariants) qui doivent être vraies pour toutes les entrées valides. La bibliothèque génère ensuite automatiquement une multitude de cas de test aléatoires et vérifie que la propriété est respectée.

Pourquoi est-ce utile ? D'abord, cela permet de détecter des "cas limites" (edge cases) auxquels le développeur n'aurait pas pensé : chaînes vides, nombres négatifs, valeurs très grandes, états assimilables à null. Ensuite, les tests basés sur les propriétés sont auto-documentés : ils décrivent le contrat d'une fonction ("pour tout nombre x, la fonction f(x) retourne un nombre supérieur à 0"), et non un exemple spécifique. Enfin, lors de modifications du code, ces tests continuent souvent de fonctionner sans changement, car ils vérifient des propriétés générales, et non des valeurs particulières.

proptest est l'équivalent Rust des bibliothèques QuickCheck (Haskell), Hypothesis (Python) et FsCheck (.NET). Elle offre un riche ensemble de stratégies de génération de données (des nombres simples aux structures complexes), un mécanisme de réduction (shrinkage) pour minimiser les exemples en échec, et une intégration avec le framework de test principal de Rust : cargo test.

2. Installation

Pour utiliser proptest, ajoutez-la dans la section [dev-dependencies] de votre fichier Cargo.toml :

[dev-dependencies]
proptest = "1.4"

Exécutez ensuite la commande :

cargo build

La bibliothèque sera téléchargée et compilée. Vous pouvez maintenant l'utiliser dans vos modules de test.

3. Démarrage rapide — un exemple minimal fonctionnel

Écrivons un test simple qui vérifie que la fonction reverse (inversion d'une chaîne) est une involution : si on l'applique deux fois, on obtient 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 ".*") {
            let reversed = reverse(&s);
            let double_reversed = reverse(&reversed);
            assert_eq!(s, double_reversed);
        }
    }
}

Lancez le test avec la commande 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, la bibliothèque tentera de trouver l'exemple minimal qui reproduit l'erreur.

4. Méthodes et fonctions principales

Voici les composants clés de la bibliothèque proptest. Tous les exemples supposent que use proptest::prelude::*; a été ajouté en début de module de test.

4.1. La macro proptest!

Signature : proptest! { ... }

Fonction : Macro principale qui définit un bloc de tests basés sur les propriétés. À l'intérieur, vous pouvez déclarer des fonctions de test avec génération automatique de données.

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

4.2. La stratégie any::<T>()

Recommendations