tadata
← Retour à l'accueil

Stratégies de Test Modernes : Au-delà de la Pyramide de Tests

#testing#devops#ci-cd#architecture#quality

La pyramide de tests -- tests unitaires a la base, intégration au milieu, bout en bout au sommet -- nous a bien servi pendant une decennie. Mais les architectures modernes (microservices, systèmes événementiels, serverless) ont expose ses limites. De nouveaux modèles comme le diamant de tests, le trophee de tests et le contract testing sont apparus pour combler les lacunes.

Taxonomie des Types de Tests

tadata
  • Tests unitaires
    • Tests de fonctions pures (sans dépendances)
    • Tests de composants (module unique avec mocks)
    • Tests de snapshot (rendu d'un composant UI)
  • Tests d'intégration
    • Intégration de service (API + base de données)
    • Tests de contrat (pilotés par le consommateur ou le fournisseur)
    • Intégration de composant (module + dépendances réelles)
  • Tests de bout en bout
    • Pilotés par l'UI (Playwright, Cypress)
    • Pilotés par l'API (flux de requête complet)
    • Monitoring synthétique (sondes en production)
  • Tests spécialisés
    • Property-based (entrées générées)
    • Tests de mutation (modification du code)
    • Tests de chaos (injection de pannes)
    • Tests de performance / charge
    • Tests de sécurité (DAST, SAST)
    • Tests de régression visuelle
  • Tests en production
    • Déploiements canary
    • Feature flags + tests A/B
    • Monitoring synthétique
    • Tests pilotés par l'observabilité

Comparaison des Stratégies : Pyramide vs Diamant vs Trophee

AspectPyramideDiamantTrophee
AccentTests unitaires dominentTests d'intégration dominentIntégration + analyse statique
Ratio unitaires70%20-30%20-30%
Ratio intégration20%50-60%40-50%
Ratio E2E10%10-20%10%
Analyse statiqueNon prioritaireNon prioritaireCouche fondation
VitessePlus rapide globalementModereeModeree
ConfianceElevee pour logique isoléeElevee pour comportement systèmeElevee pour comportement utilisateur
Cout maintenanceFaible (unitaires), élevé (E2E)ModereModere
Architecture idealeMonolithe, librairiesMicroservices, APIsFrontend, full-stack JS

Paysage d'Outils par Type de Test

Type de TestJavaScript/TSPythonGoCross-Platform
UnitaireVitest, Jestpytestgo test--
IntégrationSupertest, Testcontainerspytest + httpxtestcontainers-goTestcontainers
E2E (UI)Playwright, CypressPlaywright--Playwright
ContratPact JSPact PythonPact GoPact
Property-basedfast-checkHypothesisrapid--
MutationStrykermutmut----
Performancek6, ArtilleryLocustvegetak6
Analyse statiqueESLint, TypeScriptmypy, ruffgo vetSonarQube

Architecture d'Intégration CI/CD

tadata
  1. 1. Push du développeur
  2. 2. Pre-commit (< 30 s)
  3. 3. Pipeline CI (< 10 min)
  4. 4. Déploiement staging (< 30 min)
  5. 5. Production (en continu)
Pre-commit (< 30 s)
linting (ESLint, ruff), formatage (Prettier, black), vérification de types (TypeScript, mypy), uniquement les tests unitaires concernés
Pipeline CI (< 10 min)
suite complète de tests unitaires, tests d'intégration (Testcontainers), tests de contrat (broker Pact), analyse de sécurité (SAST), artefacts de build
Déploiement staging (< 30 min)
déploiement en staging, tests E2E (Playwright sur staging), tests de performance de référence, tests de régression visuelle, analyse de sécurité (DAST)
Production (en continu)
déploiement canary (5 % → 25 % → 100 %), monitoring synthétique, suivi du taux d'erreur, rollback automatique en cas de violation de SLO
Architecture d'intégration CI/CD : chaque étape s'exécute après la précédente
tadata
Canary release Users Azure Front Door /Traffic Managerweights weighted split v2.4 (stable) 4 instances 90% v2.5 (canary) 1 instance, watched 10% error rate > 1 % or p95 > 800 ms → weight 0 Ramp 10% 25% 50% 100% done
Canary release Users Azure Front Door /Traffic Managerweights weighted split v2.4 (stable) 4 instances 90% v2.5 (canary) 1 instance, watched 10% error rate > 1 % or p95 > 800 ms → weight 0 Ramp 10% 25% 50% 100% done
Canary avec routage pondéré et déclencheur de rollback automatique

Extrait de la fiche « AZ-400 Domain 3b: Packages, Testing and Release Strategies » · Demander la fiche complète

Cout du Defaut par Etape

Étape de DétectionCout RelatifExempleMéthode de Détection
Conception / planification1xExigence mal compriseRevue de conception
Codage (IDE)1.5xErreur de type, référence nulleAnalyse statique, système de types
Pre-commit2xErreur logique dans une fonctionTest unitaire, linting
Pipeline CI5xContrat d'intégration casseTest intégration, test contrat
Staging / QA15xFlux utilisateur casseTest E2E, QA manuelle
Production (détecté vite)50xCorruption données, panneMonitoring, tests synthétiques
Production (détecté tard)100-1000xCorruption silencieuse, non-conformitéAudit, rapport client

Contract Testing en Detail

AspectConsumer-Driven (Pact)Provider-DrivenBase sur Schema (OpenAPI)
Qui definit le contrat ?ConsommateurFournisseurSpecification partagée
Direction de vérificationConsommateur généré, fournisseur vérifiéFournisseur publié, consommateurs s'adaptentLes deux valident contre la spec
Ideal pourMicroservices avec consommateurs connusAPIs publiquesDéveloppement API-first
Détection de deriveExcellenteBonneBonne (si appliquee)
OutilsPact, PactFlowSpring Cloud ContractSpectral, Optic, Prism

Property-Based Testing : Quand et Pourquoi

ScenarioExemple de PropriétéFaiblesse du Test Traditionnel
Aller-retour serialisationdecode(encode(x)) == xNe testé que des exemples choisis
TriSortie triée ET même longueurRate les cas limités (vidé, doublons)
Validation entrées APIAucune entrée ne fait crasher le serveurNe testé que le happy path
Machines a étatsToutes les transitions maintiennent les invariantsExplosion combinatoire

Ressources

Nous utilisons des cookies analytiques pour améliorer votre expérience. Aucune donnée personnelle n'est collectée.