Rapport de test qualité — Edu-Kit

Version : 1.0  |  Date : 03/06/2026  |  Statut : Livraison concluante
Sprint / Release : Sprint 5 (19/05/2026 – 03/06/2026)


Sommaire

  1. Présentation
  2. Périmètre de test
  3. Environnements de test
  4. Description des tests et résultats
  5. Anomalies
  6. Conclusion
  7. Lexique

1. Présentation

1.1 Objet du document

Ce rapport de test qualité documente les activités de test réalisées à la livraison du Sprint 5 du projet Edu-Kit. Il synthétise l’état de la couverture de test, les résultats obtenus sur l’ensemble de la suite automatisée, les anomalies identifiées et formule une recommandation de livraison.

Il s’inscrit dans la stratégie de test définie dans le document Stratégie de test et est produit avant toute démonstration ou mise à disposition de la release sprint.

1.2 Contexte du projet

Edu-Kit est une plateforme de virtualisation pédagogique permettant aux établissements d’enseignement de mettre à disposition des machines virtuelles pour leurs étudiants. Elle repose sur une architecture microservices composée de trois dépôts :

Composant Technologie Rôle
OrgService .NET 9 / C# — Clean Architecture + CQRS Gestion des organisations, utilisateurs, groupes, environnements, sessions de travail et licences
VmService .NET 9 / C# — Clean Architecture + CQRS Gestion des templates VM, provisionnement Proxmox, cycle de vie des machines virtuelles
Edukit-Front Angular 21 / TypeScript Interface utilisateur (SPA) consommant les deux services via REST et SignalR

L’authentification est déléguée à Keycloak 26 (protocole OIDC/PKCE) avec quatre rôles applicatifs : superadmin, admin, teacher, student.

1.3 Contexte du Sprint 5

Le Sprint 5 (19/05/2026 – 03/06/2026) a livré les fonctionnalités suivantes :

OrgService :

  • Système de licences : entité domaine License avec machine d’état à trois statuts (Active, Revoked, Superseded), gardes du constructeur (établissement, créateur, maxUsers, plages de dates), transitions idempotentes (Revoke, Supersede).
  • Opérations de gestion des licences : IssueLicense (émission avec supersession transactionnelle d’une licence existante), RevokeLicense (révocation avec raison et stamp d’audit), GetLicenseById, GetLicensesByEstablishment, SearchLicenses (recherche paginée avec filtres).
  • Création d’utilisateurs (CreateUser) : handler complet avec gate de licence (restrictions par type de fonctionnalité), invitation par e-mail (MailKit), et mécanisme de compensation Keycloak si la persistance en base de données échoue après la création du compte OIDC.

VmService :

  • Machines virtuelles par étudiant : CreateVmForStudent (provisionnement individuel avec gate de licence, vérification des préconditions, publication de la saga de provisionnement), DeleteVmForStudent (destruction via saga), GetEligibleStudents (liste des étudiants sans VM dans un environnement).
  • Cluster hyperviseur : GetHypervisorLimits et SetHypervisorLimits — configuration des plafonds de ressources Proxmox (RAM % et stockage %) par établissement.
  • Statut Proxmox : GetProxmoxStatus — consultation de l’état des ressources de l’hyperviseur.
  • Complément de tests sur la saga de provisionnement (VmProvisioningSaga).

VmService — Infrastructure :

  • ExpiredLicenseVmStopper : service de background surveillant périodiquement les VMs en cours d’exécution et publiant une saga d’arrêt pour chaque VM dont la licence de l’établissement a expiré, avec déduplication des contrôles de licence par établissement.

Edukit-Front :

  • Intégration des interfaces de gestion des licences, des VMs étudiantes et du tableau de bord hyperviseur. Aucun nouveau test automatisé n’a été ajouté (voir AN-001).

2. Périmètre de test

2.1 Fonctionnalités couvertes dans ce sprint

Composant Fonctionnalité Type(s) de test réalisé(s)
OrgService Entité domaine License — machine d’état, gardes constructeur, transitions (Revoke, Supersede) Unitaire (domaine)
OrgService IssueLicense — émission, supersession transactionnelle Unitaire (handler, validator, authorization)
OrgService RevokeLicense — révocation avec raison, idempotence Unitaire (handler, validator, authorization)
OrgService GetLicenseById, GetLicensesByEstablishment, SearchLicenses Unitaire (handler, validator, authorization)
OrgService CreateUser — gate de licence, invitation e-mail, compensation Keycloak Unitaire (handler, validator, authorization)
VmService CreateVmForStudent — préconditions, gate de licence, saga de provisionnement Unitaire (handler, validator, authorization)
VmService DeleteVmForStudent — saga de destruction Unitaire (handler, validator, authorization)
VmService GetEligibleStudents — liste étudiants sans VM Unitaire (handler, validator, authorization)
VmService GetHypervisorLimits / SetHypervisorLimits — limites RAM/stockage Unitaire (handler, validator, authorization)
VmService GetProxmoxStatus — état des ressources hyperviseur Unitaire (handler, authorization)
VmService VmProvisioningSaga — compléments de couverture Unitaire (saga)
VmService ExpiredLicenseVmStopper — arrêt automatique sur licence expirée Infrastructure (background service)

2.2 Fonctionnalités hors périmètre dans ce sprint

Fonctionnalité exclue Justification
Utilisateurs (CRUD sauf CreateUser), Établissements (CRUD) Fonctionnalités couvertes dans les sprints précédents — code non modifié (voir stratégie de couverture ciblée)
Groupes, Environnements de travail Idem — tests existants constituent la garantie de non-régression
Sessions de travail Livrées au Sprint 4 — aucune modification dans ce sprint
Sagas de cycle de vie VMs (Start, Stop, Destroy) Livrées au Sprint 4 — aucune modification
ResetVmCredential, StartAllEnvironmentVms Livrés au Sprint 4 — aucune modification
Authentification Keycloak Infrastructure externe, non modifiée — validée sur l’environnement de dev (voir AN-003)
Endpoints Minimal API Logique propre quasi nulle — couverts par les tests des handlers et la validation manuelle Insomnia
GlobalExceptionHandlerMiddleware Logique de mapping simple ; couvert implicitement par les tests des handlers
Migrations EF Core Vérifiées au démarrage automatique en environnement de développement
Tests E2E Non implémentés à ce stade du projet (voir AN-002)
SftpSnippetUploader Requiert une vraie session SSH — exclu intentionnellement (voir AN-004)

3. Environnements de test

Les tests unitaires et d’infrastructure s’exécutent entièrement en mémoire. La validation manuelle est réalisée sur l’environnement local de développement.

3.1 Environnement local (développement)

Composant URL / Accès Version
OrgService API http://localhost:5100 — Insomnia (projet partagé) .NET 9.0
OrgService gRPC http://localhost:5101 .NET 9.0
VmService API http://localhost:5200 — Insomnia (projet partagé) .NET 9.0
VmService Worker Port interne — health : http://localhost:5300/health .NET 9.0
VmService gRPC http://localhost:5201 .NET 9.0
Edukit-Front http://localhost:4200 Angular 21.x
Keycloak http://localhost:8080 26.x
PostgreSQL localhost:5432 16
RabbitMQ localhost:5672 3.x
Proxmox VE Accès restreint — secrets via dotnet user-secrets 8.x

Les dépendances (PostgreSQL, Keycloak, RabbitMQ) sont orchestrées via Docker Compose (dépôt Edukit-Local). La base de données est migrée et seedée automatiquement au démarrage de chaque service.

3.2 Environnement CI/CD (Azure DevOps)

Composant Détail
Pipeline azure-pipelines.yml — déclenché à chaque push et à l’ouverture d’une PR
Exécution des tests backend dotnet test — en mémoire, sans Docker
Exécution des tests frontend npx ng test — Vitest + jsdom
Collecte de couverture Rapport coverlet envoyé à SonarQubeCloud
Quality Gate Grade A requis — bloquant avant merge vers dev ou main

4. Description des tests et résultats

4.1 Rappel — Pyramide de tests et techniques appliquées

Conformément à la stratégie de test, le projet suit la pyramide suivante :

             ┌──────────┐
             │   E2E    │  Non implémenté — risque identifié (AN-002)
          ┌──┴──────────┴──┐
          │ Infrastructure  │  VmService uniquement — 105 tests / 12 fichiers
       ┌──┴─────────────────┴──┐
       │    Tests unitaires     │  Base principale — 1 145 tests / 201 fichiers
       └────────────────────────┘

Deux techniques de test sont appliquées, conformément à la section 3.5 de la stratégie :

Technique Définition Application dans ce sprint
Boîte blanche Le testeur connaît l’implémentation interne et structure ses cas de test en conséquence Tests unitaires et d’infrastructure : mocking ciblé des dépendances, couverture des branches métier (machine d’état licence, gate de licence, saga publishing, compensation Keycloak, génération YAML cloud-init)
Boîte noire Le testeur se base uniquement sur les entrées/sorties, sans connaître le code Tests manuels Insomnia (collection partagée) et interface Angular : validation des réponses HTTP, comportements UX observés

La responsabilité de la qualité est collective : chaque développeur rédige les tests de ses propres fonctionnalités ; le reviewer de PR valide la pertinence et la couverture des tests ; le pipeline CI (SonarQube + Azure DevOps) constitue le filet de sécurité automatique.


4.2 Tests unitaires

L’ensemble des tests unitaires est exécuté en mémoire. Toutes les dépendances externes (repositories, services gRPC, clients Proxmox, bus de messages, Keycloak, SMTP) sont substituées par des objets simulés (mocks) via Moq.

Résultats globaux à la livraison du Sprint 5

Composant Fichiers de test Tests exécutés Réussis Échoués Ignorés
OrgService 107 578 578 0 0
VmService 92 563 563 0 0
Edukit-Front 2 4 4 0 0
Total 201 1 145 1 145 0 0

Note : Ces totaux incluent l’ensemble des tests écrits depuis le Sprint 1 et présents au moment de la livraison. Le Sprint 5 a contribué environ 131 nouveaux tests à cette suite cumulée (69 OrgService + 46 VmService unitaires + 16 infra + 0 front).

Détail OrgService — périmètre Sprint 5

Sous-ensemble Fichiers Tests
Entité domaine — License (machine d’état, gardes constructeur, transitions) 1 16
Handlers — Licences (5 opérations : IssueLicense, RevokeLicense, GetLicenseById, GetLicensesByEstablishment, SearchLicenses) 5 ~17
Validators + Authorization — Licences et CreateUser ~3 ~19
Handler — CreateUser (gate de licence, invitation e-mail, compensation Keycloak) 1 7
Compléments handlers (GetEstablishmentById, GetWorkEnvironments) 2 ~10
Total Sprint 5 OrgService ~12 ~69

Exemples de cas de test représentatifs :

  • Revoke_WhenActive_SetsRevokedStatusAndStampsFields — vérification que la révocation positionne le statut Revoked, horodate le champ RevokedAt et enregistre la raison.
  • Supersede_WhenActive_SetsSupersededStatusAndLinksNew — vérification de la machine d’état lors de la supersession : la licence active passe à Superseded et référence la nouvelle.
  • Constructor_WhenMaxUsersZero_Throws — garde du constructeur : rejection d’une licence avec maxUsers = 0.
  • Handle_WhenActiveLicenseExists_SupersedesFirstThenCreatesIssueLicense : si une licence active existe déjà, elle est supersédée dans la même transaction avant la création de la nouvelle.
  • Handle_WhenLicenseAlreadyRevoked_ThrowsInvalidOperationRevokeLicense : protection contre la double révocation.
  • Handle_WhenLicenseRestrictsCreation_ThrowsAndDoesNotCallKeycloakCreateUser : la création est rejetée avant tout appel Keycloak si la licence de l’établissement ne permet pas la fonctionnalité requise.
  • Handle_WhenLocalSaveFails_DisablesKeycloakUserAsCompensationCreateUser : si la persistance en base échoue après la création du compte Keycloak, le compte est désactivé dans Keycloak (saga de compensation).
  • Handle_WhenSetupEmailFails_StillReturnsCreatedUserCreateUser : une panne SMTP est non-bloquante — la création de l’utilisateur réussit même si l’e-mail d’invitation ne part pas.

Détail VmService — périmètre Sprint 5

Sous-ensemble Fichiers Tests
Service CloudInitBuilder — génération YAML cloud-init pour VMs Debian 1 21
Handler — CreateVmForStudent (préconditions, gate licence, saga de provisionnement) 1 10
Handler — DeleteVmForStudent (saga de destruction, gate licence) 1 5
Handler — SetHypervisorLimits (limites RAM/stockage, mise à jour partielle/complète/effacement) 1 4
Divers (GetHypervisorLimits, GetProxmoxStatus, VmProvisioningSaga compléments) 3 ~6
Total Sprint 5 VmService (unitaires) 7 ~46

Exemples de cas de test représentatifs :

  • Handle_WhenStudentAlreadyHasVm_ThrowsConflictExceptionCreateVmForStudent : protection contre un double provisionnement pour le même étudiant dans le même environnement.
  • Handle_WhenPreviousVmIsDestroyed_ProvisionsNewOneCreateVmForStudent : un étudiant peut se reprovisioner si sa VM précédente est à l’état Destroyed.
  • Handle_WhenLicenseFeatureBlocked_ThrowsLicenseRestrictionExceptionCreateVmForStudent et DeleteVmForStudent : la gate de licence est évaluée avant tout effet de bord.
  • Handle_WhenBothLimitsNull_ShouldClearLimitsSetHypervisorLimits : passage à null efface les limites (comportement non trivial à tester).
  • UserData_StartsWithCloudConfigHeaderCloudInitBuilder : le YAML commence obligatoirement par #cloud-config.
  • UserData_DeclaresStudentUserWithSshPasswordAccessCloudInitBuilder : le compte étudiant est déclaré avec accès SSH par mot de passe.
  • UserData_WhenExpireOnFirstLogin_AddsExpireFlagAndChageRuncmdCloudInitBuilder : l’option d’expiration au premier login injecte les runcmds chage appropriés.
  • UserData_InjectsContextHashedPassword_NotAHardcodedConstantCloudInitBuilder : le hash du mot de passe est injecté depuis le contexte et non écrit en dur (sécurité).
  • NetworkConfig_IsDhcpOnFirstEthernetCloudInitBuilder : la configuration réseau est DHCP sur la première interface Ethernet.

Détail Edukit-Front — périmètre Sprint 5

Aucun nouveau test de composant n’a été ajouté dans ce sprint. La couverture frontend reste à 4 tests répartis sur 2 fichiers, inchangée depuis le Sprint 4. Ce point est suivi comme anomalie ouverte (voir AN-001).


4.3 Tests d’infrastructure (VmService)

Les tests d’infrastructure vérifient les adaptateurs vers les systèmes externes (Proxmox HTTP, gRPC, sécurité, background services) en simulant leurs réponses via des handlers HTTP intercepteurs et des mocks. Aucune connexion réseau réelle n’est établie.

Composant Fichiers de test Tests Réussis Échoués
VmService — InfrastructureTests (total) 12 105 105 0
Fichier de test Composant testé Tests Sprint 5
ExpiredLicenseVmStopperTests.cs Arrêt automatique des VMs — licence expirée 5 (nouveau Sprint 5)
VmProvisioningServiceTests.cs Orchestration de provisionnement Proxmox Étendu — Sprint 5
VmLifecycleServiceTests.cs Start/stop Proxmox Préexistant — Sprint 4
VmLifecycleServiceDestroyTests.cs Destruction Proxmox Préexistant — Sprint 4
VmStatusReconcilerTests.cs Réconciliation périodique des statuts Préexistant
ProxmoxClientTests.cs Client HTTP Proxmox Préexistant
ProxmoxThrottlerTests.cs Throttling concurrent Préexistant
AesGcmPayloadCipherTests.cs Chiffrement AES-256-GCM Préexistant
PasswordGeneratorTests.cs Génération de mots de passe Préexistant
Sha512CryptHasherTests.cs Hashage SHA-512 crypt(3) Préexistant
GrpcGroupResolutionServiceTests.cs Client gRPC — résolution groupes Préexistant
GrpcWorkEnvironmentResolutionServiceTests.cs Client gRPC — résolution environnements Préexistant

Exemples de cas de test représentatifs (ExpiredLicenseVmStopperTests) :

  • EnforceOnceAsync_WhenLicenseNotAllowed_PublishesStop — une VM Running dont l’établissement n’a plus de licence valide déclenche la publication d’un StopVmSagaCommand.
  • EnforceOnceAsync_WhenLicenseAllowed_DoesNotStop — une VM Running dont la licence est active n’est pas touchée.
  • EnforceOnceAsync_TwoEnvsSameEstablishment_ChecksLicenseOncePerEstablishment — le contrôle de licence est dédupliqué par établissement pour ne pas interroger le service de licences une fois par VM.
  • EnforceOnceAsync_WhenEnvNotResolved_SkipsVm — si la résolution de l’environnement échoue (environnement supprimé), la VM est ignorée sans erreur fatale.

4.4 Tests manuels

La validation manuelle est réalisée sur l’environnement de développement local avant l’ouverture de chaque PR, conformément à la Phase 3 de la stratégie de test. Les résultats sont documentés dans la section “Testing Notes” de chaque PR.

Fonctionnalité Parcours testé Outil Résultat Observations
Émission de licence Émission d’une première licence pour un établissement Insomnia (collection partagée) Réussi Licence créée à l’état Active
Émission de licence — supersession Émission sur un établissement ayant déjà une licence active Insomnia (collection partagée) Réussi Ancienne licence passée à Superseded, nouvelle créée
Révocation de licence Révocation avec raison — vérification de l’état Revoked Insomnia (collection partagée) Réussi RevokedAt et RevokedBy enregistrés
Création utilisateur Création d’un student dans un établissement avec licence valide Insomnia (collection partagée) + Mailpit Réussi E-mail d’invitation reçu avec credentials
Création utilisateur — gate licence Tentative de création sur établissement sans licence Insomnia (collection partagée) Réussi 403 retourné avant appel Keycloak
CreateVmForStudent Provisionnement individuel d’un étudiant Interface Angular + Insomnia Réussi VM passée à Pending puis provisionnée via saga
DeleteVmForStudent Suppression de la VM d’un étudiant Insomnia (collection partagée) Réussi VM passée à Destroyed
SetHypervisorLimits Configuration des limites RAM (80 %) et stockage (70 %) Insomnia (collection partagée) Réussi Limites sauvegardées, GET retourne les bonnes valeurs
SetHypervisorLimits — effacement Envoi de null sur les deux champs Insomnia (collection partagée) Réussi Limites supprimées
ExpiredLicenseVmStopper Révocation d’une licence avec VMs Running, attente du cycle de vérification Environnement local + logs Réussi VMs arrêtées automatiquement au cycle suivant
CloudInitBuilder Provisionnement d’une VM Debian avec compte étudiant Proxmox VE (dev) + Angular Réussi VM démarrée, connexion SSH avec le mot de passe généré

4.5 Analyse statique SonarQube

Les résultats ci-dessous correspondent à l’analyse SonarQube réalisée sur la dernière PR du sprint, fusionnée le 03/06/2026.

Critère Résultat Seuil Statut
Quality Gate global Grade A Grade A Réussi
Couverture de code — OrgService ≥ 60 % ≥ 60 % Réussi
Couverture de code — VmService ≥ 60 % ≥ 60 % Réussi
Couverture de code — Front < 40 % ≥ 40 % (objectif) Non atteint — non bloquant
Nouvelles violations sécurité 0 0 Réussi
Nouvelles violations fiabilité 0 0 Réussi
Nouvelles violations maintenabilité Informatif Informatif
Commentaires SonarQube sur PR traités Oui Oui Réussi

La couverture frontend reste en dessous du seuil objectif de 40 % en raison de l’absence de nouveaux tests Angular malgré les composants livrés dans ce sprint (gestion des licences, VMs étudiantes). Ce point est connu, non bloquant, et adressé dans la feuille de route (voir AN-001).


4.6 Pipeline CI (Azure DevOps)

Étape Statut
Build (OrgService + VmService + Edukit-Front) Réussi
Tests unitaires (dotnet test) Réussi
Tests d’infrastructure (dotnet test) Réussi
Tests frontend (npx ng test — Vitest) Réussi
Collecte couverture (coverlet → SonarQubeCloud) Réussi
Analyse SonarQube — Quality Gate Réussi

5. Anomalies

Conformément aux critères de livraison, aucune anomalie bloquante ou critique ne doit être ouverte à la livraison.

ID Description Composant Criticité Statut Action
AN-001 Couverture de test frontend insuffisante : 4 tests pour l’ensemble du projet Angular. Le Sprint 5 a livré des composants supplémentaires (gestion des licences, VMs par étudiant, configuration hyperviseur) sans nouveau test associé. Les régressions UI ne sont pas détectées automatiquement. Correspond au risque R1 de la stratégie de test. Edukit-Front Mineur Ouvert Extension de la couverture Vitest planifiée à court terme : guards en priorité, puis composants des principales pages fonctionnelles. Le retard s’accumule à chaque sprint ; à prioriser en Sprint 6.
AN-002 Absence de tests E2E : aucun test de parcours complet utilisateur (connexion Keycloak → provisionnement VM → session de travail) n’est automatisé. Les régressions cross-services ne sont détectées que par les tests manuels. Correspond au risque R2 de la stratégie de test. Tous les composants Mineur Ouvert Tests E2E (Playwright ou Cypress) planifiés à moyen terme sur les parcours critiques. Atténué par les tests manuels systématiques avant chaque livraison sprint.
AN-003 Keycloak non couvert par des tests automatisés : les pannes d’authentification (émission de tokens JWT, configuration du realm) ne sont détectées qu’en validation manuelle. Le mécanisme de compensation de CreateUser (désactivation du compte Keycloak en cas d’échec DB) est couvert unitairement par un mock Keycloak, mais pas testé avec le vrai service. Correspond au risque R3 de la stratégie de test. Tous les composants Mineur Ouvert Validation manuelle systématique avec le compte testadmin avant chaque livraison ; monitoring en staging. Infrastructure externe — non modifiable dans le cadre du projet.
AN-004 Asymétrie entre OrgService (pas de projet InfrastructureTests) et VmService (12 fichiers d’infrastructure). Le Sprint 5 a ajouté des dépendances d’infrastructure supplémentaires côté OrgService : SmtpEmailSender (invitation utilisateur), gate de licence (appel inter-service ou dépôt), et compensation Keycloak. Ces adaptateurs ne sont pas couverts par des tests d’infrastructure. Correspond au risque R5 de la stratégie de test. OrgService Mineur Ouvert Ajout d’un projet InfrastructureTests côté OrgService planifié à court terme (clients gRPC, SmtpEmailSender). La croissance du surface d’infrastructure OrgService renforce la priorité de ce point.

Récapitulatif

Criticité Total Corrigés Ouverts
Bloquant 0 0 0
Critique 0 0 0
Majeur 0 0 0
Mineur 4 0 4

6. Conclusion

6.1 Synthèse

Le Sprint 5 a enrichi la plateforme Edu-Kit d’un système de licences complet (côté OrgService) et d’une gestion fine des VMs par étudiant avec contrôle de licence (côté VmService). À la date de livraison, la suite automatisée compte 1 145 tests unitaires (répartis sur 201 fichiers) et 105 tests d’infrastructure, soit 1 250 tests automatisés au total. Le Sprint 5 a contribué environ 131 nouveaux tests à cette suite (69 OrgService + 46 VmService unitaires + 16 VmService infrastructure).

L’ensemble des 1 250 tests sont en succès sur les trois composants du projet. Le pipeline CI est au vert sur toutes ses étapes (build, tests, couverture, Quality Gate SonarQube Grade A). La validation manuelle des parcours fonctionnels introduits dans ce sprint a été réalisée sur l’environnement local et s’est conclue sans anomalie fonctionnelle.

Quatre anomalies mineures persistent en open (AN-001 couverture frontend, AN-002 absence d’E2E, AN-003 Keycloak non testé automatiquement, AN-004 asymétrie InfrastructureTests OrgService) ; elles sont toutes connues, non bloquantes pour la livraison et trackées dans la feuille de route. L’anomalie AN-001 mérite une attention particulière en Sprint 6 : la surface de l’interface Angular s’étend à chaque sprint sans test associé.

6.2 Recommandation

Décision Condition
Livraison concluante Tous les tests unitaires et d’infrastructure passent à 100 %, Quality Gate SonarQube à Grade A, zéro anomalie bloquante ou critique ouverte, validation manuelle des parcours principaux réalisée et documentée dans la PR (section “Testing Notes”), et chaque PR a reçu au moins une approbation de reviewer.
Livraison rejetée Au moins une des conditions ci-dessus n’est pas remplie.

Décision : Livraison concluante

Tous les critères de livraison définis dans la stratégie de test sont satisfaits. Les fonctionnalités du Sprint 5 — système de licences avec machine d’état, création d’utilisateurs avec compensation Keycloak, provisionnement individuel de VMs par étudiant avec gate de licence, configuration de l’hyperviseur et arrêt automatique sur licence expirée — ont été validées par des tests automatisés et par une validation manuelle documentée dans chaque PR. Aucune anomalie bloquante ou critique n’est ouverte.

6.3 Évolutions prévues (feuille de route qualité)

Conformément à la section 5.5 de la stratégie de test, les évolutions suivantes sont planifiées pour les prochains sprints :

Évolution Priorité Description
Tests de composants Angular Court terme — à prioriser Sprint 6 Extension de la couverture Vitest aux guards (authGuard, roleGuard, establishmentGuard), services et composants de fonctionnalité (licence, VM étudiant, hyperviseur). La dette s’accumule à chaque sprint livré sans test front (voir AN-001).
Tests d’infrastructure OrgService Court terme Ajout d’un projet InfrastructureTests pour couvrir les clients gRPC, SmtpEmailSender et la gate de licence — symétrie avec VmService et adressage des risques introduits au Sprint 5 (voir AN-004).
Tests E2E Moyen terme Implémentation de Playwright ou Cypress sur les parcours critiques : connexion Keycloak, provisionnement VM, cycle d’une session de travail, gate de licence (voir AN-002).

7. Lexique

Terme Définition
CQRS Command Query Responsibility Segregation — pattern séparant les opérations d’écriture (Commands) des opérations de lecture (Queries)
Clean Architecture Architecture logicielle organisant le code en couches concentriques (Domain → Application → Infrastructure → API) avec des dépendances orientées vers l’intérieur
MediatR Bibliothèque .NET implémentant le pattern Mediator ; les handlers sont découplés de leurs appelants via des messages typés
Mock Objet simulé remplaçant une dépendance réelle lors d’un test, permettant de contrôler son comportement et de vérifier les interactions
Moq Bibliothèque .NET de création de mocks utilisée dans les tests unitaires et d’infrastructure
FluentValidation Bibliothèque .NET de validation de modèles basée sur des règles chaînées et expressives
FluentAssertions Bibliothèque .NET proposant une syntaxe d’assertions lisible (result.Should().Be(...))
xUnit Framework de test unitaire pour .NET
Vitest Framework de test JavaScript/TypeScript léger, compatible avec l’écosystème Vite/Angular
jsdom Implémentation JavaScript du DOM du navigateur pour Node.js, permettant de tester des composants Angular sans navigateur réel
Angular TestBed Module Angular permettant l’instanciation de composants dans un environnement de test isolé
Quality Gate Ensemble de critères de qualité configurés dans SonarQube dont le non-respect bloque le merge
CI/CD Continuous Integration / Continuous Delivery — automatisation du build, des tests et du déploiement
Saga Pattern de gestion de processus longs et distribués via une séquence d’étapes avec compensation sur échec
Wolverine Bibliothèque .NET de messaging (RabbitMQ) et d’implémentation de sagas utilisée dans VmService et OrgService
Machine d’état Modèle de conception représentant les transitions d’un objet entre un ensemble fini d’états (ici : ActiveRevoked ou Superseded pour l’entité License)
Gate de licence Contrôle applicatif vérifiant que la licence de l’établissement autorise une fonctionnalité avant d’exécuter une commande
Compensation Keycloak Mécanisme de rollback désactivant un compte Keycloak si la persistance locale échoue après sa création, afin d’éviter un état incohérent entre Keycloak et la base de données
Cloud-init Standard de configuration des VMs au premier démarrage (hostname, utilisateurs, packages, réseau) via des fichiers YAML
gRPC Protocole d’appel de procédure à distance haute performance basé sur HTTP/2 et Protocol Buffers
SignalR Bibliothèque ASP.NET Core permettant des communications temps réel entre serveur et clients (WebSocket)
OIDC / PKCE OpenID Connect / Proof Key for Code Exchange — flux d’authentification sécurisé utilisé par Keycloak
Proxmox VE Hyperviseur open-source de virtualisation (VMs KVM)
AES-256-GCM Algorithme de chiffrement symétrique authentifié utilisé pour le transport sécurisé des credentials VM entre VmService et OrgService
qemu-guest-agent Agent s’exécutant dans la VM permettant à l’hyperviseur (Proxmox) d’envoyer des commandes au système invité
E2E End-to-End — test du parcours complet d’un utilisateur à travers toutes les couches du système
SPA Single Page Application — application web dont le rendu est géré côté client (Angular dans ce projet)
Boîte blanche Technique de test où le testeur a connaissance de l’implémentation interne — utilisée pour les tests unitaires et d’infrastructure
Boîte noire Technique de test où le testeur se base uniquement sur les entrées/sorties sans connaître le code — utilisée pour les tests manuels Insomnia et interface Angular

Retour en haut