Pourquoi le BDD sur Rust n'est pas une question de tests ennuyeux
\n\nImaginez : vous écrivez un service à forte charge en Rust. Le code est sûr, rapide, mais quand le produit arrive chez le client, il dit : « Je pensais que le bouton devait fonctionner différemment ». Cela vous dit quelque chose ? Le fossé classique entre le code et les attentes. C'est là que le BDD (Behaviour-Driven Development) entre en jeu — une méthodologie qui traduit les exigences métier dans un langage compréhensible à la fois par le manager et le compilateur Rust.
\n\nDans cet article, nous allons voir comment mettre en œuvre le BDD sur Rust en pratique. Vous apprendrez à écrire des scénarios en langage humain (Gherkin), à les automatiser avec cucumber et specs, et pourquoi cela rend votre code non seulement fiable, mais aussi transparent pour toute l'équipe. Pas de blabla — seulement du code vivant et des exemples concrets.
Qu'est-ce que le BDD et pourquoi Rust est idéal pour cela
\n\nBehaviour-Driven Development est une évolution du TDD. Si le TDD se concentre sur « comment tester le code », le BDD répond à la question « quel comportement voulons-nous voir ». Vous écrivez des scénarios en langage Gherkin (Given-When-Then), qui sont à la fois des tests et de la documentation.
\n\nRust est un langage qui aime la rigueur et la prévisibilité. Le BDD sur Rust apporte :
\n- \n
- Un code auto-documenté — tout développeur lit le scénario et comprend la logique métier. \n
- La sécurité au niveau des types — le compilateur vérifie que vos étapes correspondent à la structure. \n
- L'exécution parallèle — les tests BDD sur Rust sont rapides grâce à
asyncet au multithreading. \n
Quand le BDD sur Rust est-il particulièrement utile ?
\n- \n
- Services API avec des contrats clairs (REST, GraphQL). \n
- Systèmes avec des règles métier (finance, logistique, jeux). \n
- Microservices où l'intégration entre composants est importante. \n
Outils pour le BDD sur Rust : Cucumber et Specs
\n\nL'écosystème Rust propose deux approches principales :
\n\n1. cucumber — le framework BDD classique
\nPermet d'écrire des scénarios en Gherkin (fichiers .feature) et de les lier au code Rust. Prend en charge async, les macros personnalisées et les rapports.
2. specs — un équivalent léger et rapide
\nNe nécessite pas de fichiers Gherkin — les scénarios sont écrits directement en Rust à l'aide de macros. Idéal si vous ne voulez pas ajouter un analyseur séparé.
\n\nNous nous concentrerons sur cucumber, car il offre une flexibilité maximale et respecte la norme BDD.
\n\nÉcrire notre premier scénario BDD sur Rust
\n\nCréons un calculateur de remises simple. Règle métier : si le montant de l'achat est supérieur à 1000 roubles, remise de 10 %. Sinon — 0 %.
\n\nÉtape 1. Installation des dépendances
\nAjoutez dans Cargo.toml :
[dev-dependencies]\ncucumber = "0.20"\ntokio = { version = "1", features = ["full"] }\nasync-trait = "0.1"\n\n\nÉtape 2. Création du fichier feature
\nFichier tests/features/discount.feature :
Feature: Calcul de la remise\n En tant qu'acheteur\n Je veux obtenir une remise sur un gros achat\n Afin d'économiser de l'argent\n\n Scenario: Achat supérieur à 1000 roubles\n Given le montant de l'achat est égal à "1500"\n When je demande le calcul de la remise\n Then le montant de la remise doit être "150"\n\n Scenario: Achat inférieur à 1000 roubles\n Given le montant de l'achat est égal à "500"\n When je demande le calcul de la remise\n Then le montant de la remise doit être "0"\n\n\nÉtape 3. Écrire les étapes en Rust
\nCréez tests/steps/discount_steps.rs :
use cucumber::{given, then, when, World};\nuse async_trait::async_trait;\n\n#[derive(Debug, Default)]\nstruct DiscountWorld {\n purchase_amount: f64,\n discount: f64,\n}\n\n#[async_trait(?Send)]\nimpl World for DiscountWorld {\n // Implémentation vide pour simplifier\n async fn new() -> Self {\n Self::d