Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Auf Deutsch lesen

Section 2.3 sur 2.8 · Intermédiaire · 18 min de lecture

Rédiger des scénarios d’attributs de qualité testables

Leçon vidéo

5 min · narré en anglais, avec sous-titres
Écouter seulement (audio)
Lire la transcription

La leçon précédente vous a donné le vocabulaire des qualités. Celle-ci vous en donne la grammaire : une forme simple qui transforme n’importe quel souhait de qualité en quelque chose que vous pouvez concevoir et tester.

Dire à un constructeur de faire un toit solide ne lui donne rien à vérifier. Dire que le toit doit supporter cinquante centimètres de neige mouillée pendant une tempête d’hiver, si. Cela précise ce qui se passe, la neige, et les conditions, une tempête. Et cela dit ce qui doit se passer, aucune fuite, avec un chiffre mesurable : pas plus de deux centimètres de fléchissement. Un scénario d’attribut de qualité fait la même chose pour le logiciel.

Chaque scénario a les mêmes six parties, et ensemble elles racontent une courte histoire. Suivons-la de gauche à droite. D’abord, la source du stimulus : la personne, le système ou l’événement qui déclenche tout. Des clients, un traitement par lots, un développeur, un attaquant ou un disque défaillant. Ensuite, le stimulus lui-même : l’événement auquel le système doit répondre. Une rafale de requêtes, la panne d’un serveur, une demande de changement ou une connexion avec des identifiants volés. Troisièmement, l’artefact : la partie du système qui est touchée. Le nommer indique à l’équipe où le travail de conception et la mesure doivent avoir lieu. Quatrièmement, l’environnement : les conditions. Fonctionnement normal, charge de pointe, mode dégradé ou attaque en cours. Une même panne peut exiger des réponses très différentes selon les conditions. Cinquièmement, la réponse : ce que fait le système. Et sixièmement, la mesure de la réponse : le chiffre qui vous dit que cela a suffisamment bien fonctionné. Le stimulus et la mesure sont les parties que l’on oublie le plus souvent. Voici un exemple complet. Cinq cents clients par seconde arrivent à l’étape de paiement le Black Friday. Les commandes sont confirmées, quatre-vingt-dix-neuf pour cent d’entre elles en moins d’une virgule cinq seconde, et aucune commande n’est perdue.

Il existe deux types de scénarios. Un scénario général est un modèle pour une qualité. Pour la disponibilité, il énumère des stimuli typiques, comme une panne ou une réponse incorrecte, et des mesures typiques, comme le temps de réparation. Un scénario concret renseigne des valeurs précises pour un système donné. La base de données principale des commandes tombe en panne pendant le fonctionnement normal, et les écritures reprennent en moins de soixante secondes sans perte d’aucune commande validée. Les scénarios concrets sont vos exigences. Vous utilisez donc le scénario général comme liste de contrôle, puis vous rédigez la poignée de scénarios concrets qui comptent pour votre système.

La plupart des exigences de qualité commencent leur vie sous forme d’adjectifs. « Le site doit être rapide » devient : au pic du soir de trois cents recherches par seconde, les résultats arrivent en moins de quatre cents millisecondes pour quatre-vingt-quinze pour cent des requêtes, et en moins d’une seconde pour quatre-vingt-dix-neuf pour cent. « Hautement disponible » devient : si l’un des trois serveurs tombe en panne, les réservations continuent, aucune réservation confirmée n’est perdue, et les utilisateurs voient des erreurs pendant trente secondes au plus. Remarquez que cela combine un chiffre de rapidité et un chiffre d’exactitude. « Facile à modifier » devient : un développeur peut ajouter une nouvelle option de livraison en trois jours au plus, en ne modifiant que le module de livraison. Si vous n’êtes pas sûr du bon chiffre, partez des données disponibles et proposez-en un. Demander si quatre cents millisecondes, c’est acceptable, suscite une bien meilleure conversation que demander à quelle vitesse cela doit aller.

Les mêmes erreurs reviennent sans cesse. La première consiste à omettre la mesure de la réponse. Sans chiffre, un scénario n’est qu’un souhait. La deuxième consiste à utiliser une moyenne pour un temps. Les moyennes masquent les valeurs lentes extrêmes ; spécifiez donc plutôt des percentiles. La section deux point quatre explique pourquoi. La troisième consiste à mêler plusieurs stimuli, comme une charge qui double ou un serveur qui tombe en panne. Séparez-les en scénarios distincts. La quatrième est la plus dommageable : écrire une solution, comme « utiliser une file de messages », à la place du besoin. Si quelqu’un tient à une technologie, demandez quel problème elle résout. La réponse est le vrai scénario. Et la cinquième consiste à omettre l’environnement. « Se rétablit en moins de cinq minutes » : après quoi, et quand ?

Un scénario bien rédigé constitue déjà l’essentiel d’un test. Voici sa vie. Avant la mise en production, il devient un test d’acceptation. Un scénario de performances devient un test de charge, et un scénario de disponibilité devient un exercice de failover. Il devient ensuite une fonction d’aptitude : une vérification automatisée exécutée à chaque modification, de sorte que le build échoue quand la qualité dérive. La supervision en production le surveille en permanence, et ces constats reviennent affiner le scénario et ses chiffres.

La section complète présente les six parties en détail, des scénarios pour six qualités différentes et une liste de contrôle pour savoir quand un scénario est prêt. Ensuite, dans la section deux point quatre, nous verrons les performances et la scalabilité. À très vite.

Ce qu’il faut savoir

Pourquoi des scénarios

La section 2.2 vous a donné le vocabulaire des qualités ; cette section vous en donne la grammaire. Le nom d’une qualité à lui seul, comme les performances ou la sécurité, ne permet ni de concevoir ni de tester. Même un chiffre seul ne suffit pas : « 2 secondes » ne veut rien dire tant que l’on ne sait pas pour quelle opération, sous quelle charge, mesuré où et pour quelle proportion des requêtes. Le scénario d’attribut de qualité, mis au point au Software Engineering Institute (SEI) et exposé par Len Bass, Paul Clements et Rick Kazman dans Software Architecture in Practice, résout ce problème en imposant à chaque exigence de qualité la même forme en six parties.

L’idée est simple. Chaque qualité se manifeste lorsqu’il arrive quelque chose à un système : un afflux d’utilisateurs, une panne, une demande de changement, une attaque. Un scénario nomme cet événement, les circonstances, la partie du système touchée, ce qui doit se passer et la manière dont vous saurez que cela s’est passé suffisamment bien. Il est court (en général une à trois phrases), concret et testable. Et comme toutes les qualités utilisent la même forme, des scénarios de performances, de sécurité et de modifiabilité peuvent figurer côte à côte dans une même liste hiérarchisée.

Les six parties

Les six parties sont la source du stimulus, le stimulus, l’artefact, l’environnement, la réponse et la mesure de la réponse. Apprenez-les dans cet ordre, car ensemble elles racontent une courte histoire : quelqu’un ou quelque chose fait quelque chose à une partie du système dans certaines conditions ; le système fait quelque chose, et nous le mesurons ainsi. Le stimulus et la mesure de la réponse sont les deux parties que l’on oublie le plus souvent, et ce sont les deux qui comptent le plus.

Anatomie d’un scénario

Les six parties d’un scénario d’attribut de qualité : une source envoie un stimulus à un artefact dans un environnement, ce qui produit une réponse évaluée par une mesure de la réponse1 Sourcequi ou quoi2 Stimulusl’événement4 Environnementnormal, pic, dégradé, sous attaque3 Artefacttout ou partie5 Réponsece qu’il fait6 Mesure deréponsele chiffreExemple : 500 clients par seconde (source, stimulus) arrivent au paiement (artefact) le Black Friday (environnement) ;commandes confirmées (réponse), p99 sous 1,5 s, aucune commande perdue (mesure de la réponse).
Une source produit un stimulus qui atteint un artefact dans un environnement ; la réponse de l’artefact est évaluée par une mesure de la réponse.

Les six parties en détail

ComposantSignificationExemples
Source du stimulusLa personne, le système ou l’événement qui génère le stimulus.Des clients sur téléphone mobile ; un traitement par lots interne ; un développeur ; un attaquant ; un disque défaillant.
StimulusL’événement auquel le système doit répondre.Une rafale de requêtes ; la panne d’un serveur ; une demande de changement ; une tentative de connexion avec des identifiants volés.
ArtefactLa partie du système qui reçoit le stimulus : le système entier ou un composant précis.Le service de paiement ; la base de données des commandes ; le module de tarification ; le pipeline de déploiement.
EnvironnementLes conditions dans lesquelles le stimulus survient.Fonctionnement normal ; pic du Black Friday ; un centre de données hors service ; pendant un déploiement ; en développement.
RéponseCe que fait le système (ou les personnes qui l’entourent) en conséquence.Traite la commande ; bascule sur la réplique ; la modification est réalisée, testée et déployée ; la tentative est bloquée et journalisée.
Mesure de la réponseLa manière dont la réponse est mesurée, pour que le scénario puisse être testé.p99 inférieur à 800 ms ; service rétabli en moins de 60 s sans aucune commande perdue ; moins de 2 jours-personne ; 100 % des tentatives bloquées.

L’environnement mérite une attention particulière, car un même stimulus peut exiger des réponses très différentes selon les conditions. Un serveur en panne pendant le fonctionnement normal peut exiger un failover (basculement) automatique en moins d’une minute ; la même panne pendant une fenêtre de maintenance planifiée peut être acceptable avec une reprise manuelle. Une demande de changement au moment de la conception (avant la mise en production) coûte bien moins cher que le même changement une fois que des données se sont accumulées en production. Écrire l’environnement explicitement évite que l’on compare des scénarios qui portent en réalité sur des situations différentes.

L’artefact compte pour une raison similaire. « Le système répond en 200 ms » cache quelle partie est responsable. Nommer l’artefact (le service de recherche, l’API gateway, le client mobile) indique à l’équipe où le travail de conception et la mesure doivent avoir lieu. Pour certaines qualités, comme la modifiabilité et la déployabilité, l’artefact peut être du code, de la configuration ou le pipeline de livraison plutôt qu’un composant en cours d’exécution.

Scénarios généraux et scénarios concrets

Bass, Clements et Kazman en distinguent deux types. Un scénario général est indépendant de tout système : pour un attribut de qualité donné, il énumère les valeurs typiques que peut prendre chaque partie. Pour la disponibilité, par exemple, les sources peuvent être internes ou externes, des personnes, du matériel, du logiciel ou de l’infrastructure ; les stimuli peuvent être une panne, une omission, un timing incorrect ou une réponse incorrecte ; les réponses peuvent consister à détecter, enregistrer, rétablir, masquer ou dégrader ; et les mesures peuvent être le temps de détection, le temps de réparation, le pourcentage de disponibilité ou la proportion de requêtes traitées.

Un scénario concret choisit des valeurs précises pour un système particulier : « la base de données principale des commandes tombe en panne pendant le fonctionnement normal ; la réplique prend le relais et les écritures reprennent en moins de 60 secondes sans perte d’aucune commande validée ». Les scénarios généraux sont des modèles et des listes de contrôle ; les scénarios concrets sont des exigences. Vous utilisez le scénario général pour vous assurer d’avoir envisagé les bonnes sources, les bons stimuli et les bonnes mesures, puis vous rédigez la poignée de scénarios concrets qui comptent pour votre système.

Des énoncés vagues aux scénarios testables

La plupart des exigences de qualité commencent leur vie sous forme d’adjectifs. Tout l’art consiste à poser les questions qui transforment chaque adjectif en scénario : quelle opération ? déclenchée par qui ? à quelle fréquence ou en quelle quantité ? dans quelles conditions ? que doit-il se passer ? quel chiffre nous dira que cela a fonctionné ? Le tableau présente des paires « avant » et « après » typiques. Remarquez que les versions « après » révèlent parfois que la partie prenante voulait dire plusieurs choses différentes, qui deviennent alors plusieurs scénarios.

Avant et après

Énoncé vagueScénario testable
Le site doit être rapide.Pendant le pic des soirs de semaine, à 300 recherches par seconde, la recherche de produits renvoie des résultats en moins de 400 ms pour 95 % des requêtes et en moins de 1 s pour 99 %, mesuré au niveau de l’équilibreur de charge (load balancer).
Le système doit être hautement disponible.Si l’un des trois serveurs d’application tombe en panne pendant le fonctionnement normal, le service de réservation continue d’accepter des réservations ; aucune réservation confirmée n’est perdue et les utilisateurs voient des erreurs pendant 30 secondes au plus.
Le système doit être sécurisé.Lorsqu’un attaquant soumet 10 000 tentatives de connexion par minute avec des identifiants divulgués, le système bloque la source après 20 échecs, alerte l’équipe de sécurité en moins de 5 minutes, et les utilisateurs légitimes connectés depuis d’autres adresses peuvent toujours se connecter.
Le code doit être facile à modifier.Lorsque le métier demande une nouvelle option de livraison, un développeur qui connaît le code peut l’implémenter, la tester et la déployer en 3 jours au plus, en ne modifiant que le module de livraison et sa configuration.
L’application doit être conviviale.Un nouvel utilisateur sans formation peut s’inscrire et passer une commande en moins de 4 minutes ; 90 % des participants aux tests réussissent du premier coup.
Les déploiements doivent être faciles.Un développeur peut mettre en production une modification du service de commande en moins de 30 minutes après le merge, sans interruption de service, et la retirer par un retour arrière (rollback) en moins de 5 minutes si le taux d’erreur augmente.

Des exemples de scénarios pour six qualités

Les exemples ci-dessous portent tous sur une même boutique en ligne, pour que vous puissiez voir comment des qualités différentes se présentent dans le même format. Chacun est écrit de façon compacte avec ses six parties étiquetées ; en pratique, les équipes les écrivent souvent en une ou deux phrases.

Scénarios concrets pour une boutique en ligne

QualitéScénario (source, stimulus, artefact, environnement, réponse, mesure)
PerformancesSource : clients connectés. Stimulus : 2000 commandes soumises par minute. Artefact : service de paiement. Environnement : pic du vendredi soir. Réponse : commandes validées, enregistrées et confirmées. Mesure : p95 ≤ 1,5 s, p99 ≤ 3 s, aucune commande perdue.
DisponibilitéSource : matériel interne. Stimulus : le nœud principal de la base de données tombe en panne. Artefact : base de données des commandes. Environnement : fonctionnement normal. Réponse : réplique promue automatiquement, requêtes en cours relancées par de nouvelles tentatives. Mesure : écritures reprises en moins de 60 s ; aucune commande validée perdue (RPO = 0).
ModifiabilitéSource : product owner. Stimulus : demande d’ajout d’un nouveau moyen de paiement. Artefact : composant des moyens de paiement. Environnement : conception, après la première mise en production. Réponse : modification réalisée, testée et déployée. Mesure : ≤ 5 jours-personne ; aucune modification hors du composant des moyens de paiement ; aucune régression sur les moyens existants.
SécuritéSource : un client connecté agissant de manière malveillante. Stimulus : tente de lire les commandes d’un autre client en modifiant un identifiant dans l’URL. Artefact : API des commandes. Environnement : fonctionnement normal. Réponse : requête refusée et journalisée avec l’identité de l’appelant. Mesure : 100 % de ces requêtes rejetées ; alerte levée en moins de 1 minute après 5 tentatives.
UtilisabilitéSource : client novice. Stimulus : veut changer d’adresse de livraison après sa commande. Artefact : frontends web et mobile. Environnement : exécution, aucune aide disponible. Réponse : effectue le changement sans aide. Mesure : 90 % des participants aux tests d’utilisabilité réussissent en moins de 2 minutes.
DéployabilitéSource : développeur. Stimulus : une modification fusionnée dans le service catalogue. Artefact : pipeline de déploiement et service catalogue. Environnement : heures ouvrées, charge normale. Réponse : construite, testée et déployée progressivement. Mesure : en production en moins de 45 minutes ; aucune interruption de service ; retour arrière automatique en moins de 5 minutes si le taux d’erreur dépasse 1 %.

Deux caractéristiques de ces exemples méritent d’être relevées. D’abord, les scénarios ne portent pas uniquement sur le logiciel en cours d’exécution. Les scénarios de modifiabilité et de déployabilité ont pour sources des développeurs et des product owners, et leurs mesures portent sur l’effort, le temps écoulé et l’étendue du changement. Ensuite, les bonnes mesures combinent souvent un chiffre de rapidité et un chiffre d’exactitude : « en moins de 60 secondes » et « aucune commande validée perdue ». Un failover rapide qui perd des données n’est pas ce que voulait le métier.

Erreurs courantes

À relire des centaines de scénarios rédigés par des équipes, on retrouve sans cesse les mêmes erreurs. Chacune rend un scénario intestable ou trompeur.

Les erreurs et comment les corriger

ErreurExempleCorrection
Pas de mesure de la réponse« Sous la charge de pointe, le paiement répond rapidement. »Ajoutez un chiffre et une statistique : « p95 ≤ 1,5 s, p99 ≤ 3 s ».
Une moyenne au lieu d’un percentile« Temps de réponse moyen inférieur à 300 ms. »Les moyennes masquent les valeurs lentes extrêmes ; spécifiez des percentiles (section 2.4).
Plusieurs stimuli dans un même scénario« Quand la charge double, qu’un serveur tombe en panne ou qu’un déploiement est en cours, le système reste rapide. »Divisez-le en trois scénarios, chacun avec son propre environnement et sa propre mesure.
Une solution déguisée en exigence« Le système utilise Redis pour mettre en cache les pages produits. »Énoncez le besoin (« les pages produits se chargent en moins de 300 ms pour 95 % des affichages à 1000 affichages par seconde ») et laissez le cache comme option de conception.
Environnement manquant« Le service se rétablit en moins de 5 minutes. »Précisez après quoi et quand : « après la panne d’une seule zone pendant le fonctionnement normal ».
Des mots non mesurables« Gracieusement », « de façon transparente », « de manière robuste », « convivial ».Remplacez chacun par un comportement observable et un chiffre.
Des absolus impossibles« Le système ne tombe jamais en panne. » « 100 % des attaques bloquées. »Utilisez des objectifs réalistes et précisez ce qui se passe quand ils ne sont pas atteints.

Guide de décision

Guide de décision : ce scénario est-il prêt ?

Soumettez chaque brouillon de scénario à ces questions avant qu’il n’entre dans le document d’architecture ou dans le backlog.

  1. Décrit-il un seul stimulus avec une source nommée ?
    OuiContinuez.
    NonDivisez-le, ou nommez qui ou quoi provoque l’événement.
  2. Indique-t-il l’environnement (normal, pic, dégradé, pendant un déploiement, au moment de la conception) ?
    OuiContinuez.
    NonAjoutez les conditions ; sinon, la mesure ne peut pas être interprétée.
  3. Nomme-t-il l’artefact, c’est-à-dire la partie du système responsable ?
    OuiContinuez.
    NonNommez le composant, l’interface ou le pipeline, pour que l’équipe sache où concevoir et où mesurer.
  4. La réponse est-elle un comportement observable plutôt qu’un choix technologique ?
    OuiContinuez.
    NonRéécrivez le besoin et déplacez la technologie dans une décision de conception ou une contrainte.
  5. La mesure de la réponse contient-elle un chiffre, une unité et, pour un temps, un percentile ?
    OuiLe scénario est testable : ajoutez une priorité et un responsable.
    NonAjoutez la mesure ; sans elle, le scénario n’est qu’un souhait.

Des scénarios aux tests d’acceptation et aux fonctions d’aptitude

Un scénario bien rédigé constitue déjà l’essentiel d’un test. La source et le stimulus vous disent quelle charge ou quel événement générer, l’environnement vous dit comment préparer le test, l’artefact vous dit quoi observer et la mesure de la réponse fournit la condition de réussite. Un scénario de performances devient un test de charge ; un scénario de disponibilité devient un exercice de failover ou une expérience de chaos ; un scénario de modifiabilité devient l’examen de la quantité de code touchée par une modification type et du temps qu’elle a pris ; un scénario de sécurité devient un cas de test d’intrusion.

L’étape suivante consiste à continuer de vérifier. Une fonction d’aptitude (fitness function), terme popularisé par Neal Ford, Rebecca Parsons et Patrick Kua dans Building Evolutionary Architectures, est toute vérification automatisée ou reproductible de la mesure dans laquelle le système atteint un objectif architectural. Exécutée dans le pipeline de livraison ou sur la télémétrie de production, elle fait passer un scénario du statut de test d’acceptation ponctuel à celui de garde-fou permanent : le build échoue, ou une alerte se déclenche, quand la qualité dérive. Le chapitre 11 traite des fonctions d’aptitude en profondeur dans Fonctions d’aptitude et architecture évolutive.

La vie d’un scénario

Un scénario de qualité devient un test d’acceptation avant la mise en production, puis une fonction d’aptitude qui le vérifie en continu ; la supervision en production alimente le scénario en retourScénarioqualitéTestaccep.Fonct. d’aptitudedans le pipelineSupervisionproductionles mesures affinent le scénario et ses chiffresavant livraisonà chaque modif.en permanence
Un scénario donne lieu à un test d’acceptation, puis à une fonction d’aptitude exécutée à chaque modification, et les constats faits en production reviennent affiner le scénario.
# A performance scenario expressed as an automated check (illustrative)
# Scenario: at 300 searches/s, p95 <= 400 ms and p99 <= 1000 ms.
import statistics

def check_search_latency(latencies_ms, p95_target=400, p99_target=1000):
    cuts = statistics.quantiles(latencies_ms, n=100)  # 99 cut points
    p95, p99 = cuts[94], cuts[98]
    assert p95 <= p95_target, f"p95 {p95:.0f} ms exceeds {p95_target} ms"
    assert p99 <= p99_target, f"p99 {p99:.0f} ms exceeds {p99_target} ms"
    return p95, p99

# latencies_ms comes from a load test that replays 300 searches per second
# for ten minutes against a production-like environment.
Un scénario de performances transformé en une vérification automatisée simple de la latence p95 et p99.

Comment les professionnels utilisent les scénarios

En pratique, les équipes rédigent rarement de longs tableaux de scénarios en six parties pour tout. Elles en écrivent un petit nombre, souvent de dix à trente pour un système d’une certaine taille, pour les qualités qui sont architecturalement significatives, et elles les conservent là où tout le monde peut les voir : dans le document d’architecture (la section 10 d’arc42 demande exactement cela), dans le backlog sous forme de critères d’acceptation, ou sur un tableau partagé des qualités. Certaines équipes utilisent une forme plus courte ; le projet Q42 de Gernot Starke, par exemple, recommande une structure compacte : contexte, déclencheur et critères d’acceptation. La forme compte moins que la discipline : chaque qualité importante a un stimulus, un contexte et un chiffre.

Les scénarios alimentent aussi les méthodes d’évaluation. Le Quality Attribute Workshop et l’Architecture Tradeoff Analysis Method (ATAM), tous deux issus du SEI, recueillent et hiérarchisent des scénarios avec les parties prenantes, puis confrontent l’architecture aux plus importants d’entre eux. La section 2.8 montre comment les scénarios sont recueillis et classés dans un arbre d’utilité.

Vérifiez votre compréhension

Nommez dans l’ordre les six parties d’un scénario d’attribut de qualité.

Source du stimulus, stimulus, artefact, environnement, réponse et mesure de la réponse.

Qu’est-ce qui ne va pas dans « le système utilise un CDN pour que les pages se chargent vite » ?

Cet énoncé formule une solution, pas un besoin, et n’a pas de mesure. L’exigence devrait décrire la charge, les conditions et le temps de réponse visé ; le CDN est une conception possible pour y répondre.

Qui est généralement la source du stimulus dans un scénario de modifiabilité ?

Une personne qui veut un changement, comme un product owner, un développeur ou un régulateur ; le stimulus est la demande de changement.

En quoi un scénario diffère-t-il d’une fonction d’aptitude ?

Un scénario est l’énoncé d’une exigence ; une fonction d’aptitude est une vérification automatisée ou reproductible, exécutée en continu, qui mesure si le système y satisfait.

Suivant · 2.4Performances et scalabilitéLa latence et le débit, les percentiles et la latence de queue, la loi de Little, les files d’attente et le seuil critique du taux d’utilisation, la loi d’Amdahl et la loi universelle de scalabilité, avec des calculs commentés et un panorama des tactiques de performance.Continuer →

Sources et lectures complémentaires

Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.

Demander : « Pouvez-vous m’aider à transformer « l’API doit être hautement disponible et rapide » en véritables scénarios d’attributs de qualité pour une application de livraison de repas ? »