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
- Présentation
- Périmètre de test
- Environnements de test
- Description des tests et résultats
- Anomalies
- Conclusion
- 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
Licenseavec 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 :
GetHypervisorLimitsetSetHypervisorLimits— 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 statutRevoked, horodate le champRevokedAtet enregistre la raison.Supersede_WhenActive_SetsSupersededStatusAndLinksNew— vérification de la machine d’état lors de la supersession : la licence active passe àSupersededet référence la nouvelle.Constructor_WhenMaxUsersZero_Throws— garde du constructeur : rejection d’une licence avecmaxUsers = 0.Handle_WhenActiveLicenseExists_SupersedesFirstThenCreates—IssueLicense: 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_ThrowsInvalidOperation—RevokeLicense: protection contre la double révocation.Handle_WhenLicenseRestrictsCreation_ThrowsAndDoesNotCallKeycloak—CreateUser: la création est rejetée avant tout appel Keycloak si la licence de l’établissement ne permet pas la fonctionnalité requise.Handle_WhenLocalSaveFails_DisablesKeycloakUserAsCompensation—CreateUser: 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_StillReturnsCreatedUser—CreateUser: 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_ThrowsConflictException—CreateVmForStudent: protection contre un double provisionnement pour le même étudiant dans le même environnement.Handle_WhenPreviousVmIsDestroyed_ProvisionsNewOne—CreateVmForStudent: un étudiant peut se reprovisioner si sa VM précédente est à l’étatDestroyed.Handle_WhenLicenseFeatureBlocked_ThrowsLicenseRestrictionException—CreateVmForStudentetDeleteVmForStudent: la gate de licence est évaluée avant tout effet de bord.Handle_WhenBothLimitsNull_ShouldClearLimits—SetHypervisorLimits: passage ànullefface les limites (comportement non trivial à tester).UserData_StartsWithCloudConfigHeader—CloudInitBuilder: le YAML commence obligatoirement par#cloud-config.UserData_DeclaresStudentUserWithSshPasswordAccess—CloudInitBuilder: le compte étudiant est déclaré avec accès SSH par mot de passe.UserData_WhenExpireOnFirstLogin_AddsExpireFlagAndChageRuncmd—CloudInitBuilder: l’option d’expiration au premier login injecte les runcmdschageappropriés.UserData_InjectsContextHashedPassword_NotAHardcodedConstant—CloudInitBuilder: le hash du mot de passe est injecté depuis le contexte et non écrit en dur (sécurité).NetworkConfig_IsDhcpOnFirstEthernet—CloudInitBuilder: 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’unStopVmSagaCommand.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 : Active → Revoked 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 |