Étude de cas / Believe · 2023–2025

QaaS

Une plateforme commune pour écrire des tests centrés sur les comportements métier, puis les préparer et les exécuter dans un parcours guidé.

Architecture de plateformepytest · Cypress · k6Expérience développeur

Le problème

Chaque test pouvait nécessiter sa propre préparation : accès aux API, authentification, données, sélecteurs, attentes, dépendances et rapports. Les équipes passaient du temps à réunir les conditions du test avant de décrire ce qu’il devait vérifier.

Cette complexité se retrouvait dans la prise en main, le code dupliqué, la maintenance et les différences entre exécution locale et intégration continue.

Ma contribution

Architecture et développement des bibliothèques de test et de l’outillage d’exécution, avec intégration et adaptation des composants CI. Mon travail couvre les interfaces proposées aux auteurs de tests, les services techniques partagés, les environnements conteneurisés, les interfaces de lancement et de restitution, ainsi que la documentation qui accompagne leur adoption.

J’ai conçu et développé le socle de test partagé et des intégrations de QaaS, en collaboration avec les ingénieurs des équipes contributrices.

01 / ÉCRIRE

Garder l’intention métier lisible.

Les auteurs de tests assemblent des capacités déjà préparées dans la plateforme. Le socle prend en charge les détails techniques qui seraient autrement recopiés dans chaque scénario.

Tests API · pytest

Les fixtures préparent les clients et les données de test. Des assertions partagées vérifient les réponses et les objets métier. Les imports publics donnent accès à ces capacités sans imposer de parcourir la structure interne des packages.

Tests web · Cypress

Les commandes métier regroupent des étapes récurrentes, comme l’ouverture de session et les parcours de publication. Les sélecteurs, les attentes et les codes de statut techniques sont maintenus derrière ces commandes.

Performance · k6

Les fabriques de scénarios assemblent des opérations réutilisables, des profils de charge, des vérifications et des métriques. Les couches HTTP et d’instrumentation partagées harmonisent les appels et les mesures.

Les métadonnées, décorateurs, registres et plugins pytest organisent la déclaration, la sélection et l’exécution des scénarios. Une opération partagée peut ainsi évoluer à un seul endroit, puis être diffusée avec la plateforme.

02 / UN EXEMPLE

Confier la mécanique au socle.

Scénario API illustratif : créer un fichier média et vérifier son état d’envoi. Les clients partagés, fixtures de données et assertions prennent en charge la préparation récurrente.

Préparation répétée dans chaque test

def test_asset_upload():
    settings = load_settings()
    token = authenticate(settings)
    client = build_client(settings, token)
    payload = build_asset_data()
    created = client.create_asset(payload)
    assert created.status == 201
    asset_id = created.body["id"]
    client.mark_uploaded(asset_id)
    current = client.get_asset(asset_id)
    assert current.body["upload_state"] == "ready"

Assemblage de composants partagés

def test_asset_upload(asset_client, asset_data):
    created = asset_client.create(asset_data)
    assert_asset_created(created)
    asset_client.mark_uploaded(created.id)
    current = asset_client.get(created.id)
    assert_upload_state(current, "ready")

La fixture fournit un client déjà configuré ; la préparation des données et les assertions ont leur propre implémentation partagée. L’auteur lit la séquence métier et les mainteneurs gardent accès aux mécanismes sous-jacents.

03 / PRÉPARER ET EXÉCUTER

Un environnement préparé pour chaque moteur.

Environnements d’exécution versionnés

Les images Docker regroupent le moteur et ses dépendances logicielles. Les profils Compose couvrent le développement, le débogage, la collecte et l’accès au shell ; Cypress propose aussi un accès graphique via noVNC.

Outillage d’exécution

Les lanceurs préparent la configuration, les conteneurs, les volumes montés et l’emplacement des résultats. Le diagnostic Docker, les caches de dépendances et la gestion des utilisateurs et permissions répondent aux problèmes récurrents d’installation.

Livraison et résultats

La CI construit et publie les images, exécute les contrôles configurés et publie la documentation. Un lanceur k6 génère des Jobs Kubernetes et permet de suivre leur état, de consulter leurs journaux et de les nettoyer.

Les profils de la plateforme prennent en charge macOS, Linux et Windows via WSL2. Les conteneurs fournissent Python, Node et les dépendances navigateur ; la préparation du poste tient compte du réseau, des droits, des ressources et de l’architecture processeur.

Suivre le parcours de lancement et de restitution →

04 / INTERFACES UTILISATEUR

Guider l’exécution.
Rendre le résultat lisible.

QaaS comprend aussi les interfaces utilisées pour lancer et comprendre un test. Les points d’entrée traduisent un contexte et une sélection de tests en paramètres du moteur, configuration des conteneurs et emplacements de résultats.

Sorties pytest

Journaux structurés, réponses API lisibles, statut et durée de chaque test. Les composants de synthèse regroupent les tests réussis, échoués et ignorés, avec un accès au rapport.

Consoles Cypress

Un formateur de terminal dédié organise l’heure, le type, le contexte et le message, distingue les phases d’exécution et propose quatre niveaux : silencieux, normal, détaillé et débogage. Captures d’écran et vidéos facilitent l’investigation.

Exploration des API

L’API Tester de VS Code intègre la sélection des endpoints Swagger, les champs de requête et l’historique dans l’environnement de développement.

Une entrée de la plateforme telle que make cys-cli-showcase int smoke sélectionne les scénarios par métadonnées et délègue la configuration du lancement. Les auteurs peuvent se concentrer sur le scénario et son résultat.

05 / ACCÈS PARTAGÉS

Préparer une fois l’accès aux services.

Du contrat API au client Python

Le générateur récupère les contrats OpenAPI dans Backstage, le catalogue interne des services, puis produit des clients Python. Les équipes réutilisent des modèles typés de requête et de réponse, ce qui réduit le travail propre à chaque intégration.

Les clients générés fournissent un accès typé aux services. Les auteurs de scénarios y associent les données métier et les assertions.

Configuration et authentification

Une fabrique assemble le client généré adapté avec sa configuration et son authentification. Les intégrations communes à Vault et OIDC permettent de réutiliser ces accès entre services et équipes.

Les environnements de développement incluent une instance Vault locale. Les adaptateurs partagés prennent en charge la configuration des accès en dehors du scénario métier.

06 / RÉSULTATS

Un chemin plus court vers des tests utiles.

13 → 2

Un exemple d’interface Cypress

Une interface de recherche et d’export de sorties musicales ramenée à deux appels Cypress : une connexion et une commande métier.

Voir l’exemple d’interface →

La préparation mutualisée garde les scénarios lisibles et facilite la maintenance des comportements récurrents. Contexte des chiffres →

07 / ÉVOLUTION DE LA PLATEFORME

Une intention, plusieurs types de vérification.

Les fondations existantes

Bibliothèques modulaires, services partagés, commandes de lancement guidées, environnements conteneurisés, métadonnées, sorties personnalisées et assistant documentaire local constituent les fondations de la plateforme.

Prochaine étape

Un format commun de demande et un catalogue de scénarios permettraient de choisir une vérification métier, une cible et un profil, puis de suivre le résultat pour les tests front, API et de performance.

Les adaptateurs des moteurs traduiraient ce contrat commun en exécution et en vérifications propres à chaque outil.