Rapport de test qualité - Edu-Kit

Version : 1.0  |  Date : 17/05/2026  |  Statut : Livraison concluante
Sprint / Release : Sprint 4 (01/05/2026 - 17/05/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 4 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 et sessions de travail
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 4

Le Sprint 4 (01/05/2026 - 17/05/2026) a livré les fonctionnalités suivantes :

OrgService :

  • Cycle de vie complet des sessions de travail (WorkSession) : création, démarrage, pause/reprise, complétion, annulation, mise à jour, consultation et historique des transitions.
  • Consommation de l’événement inter-service VmCredentialIssued : réception depuis VmService via RabbitMQ (Wolverine), décryptage AES-256-GCM du payload, envoi d’email SMTP via MailKit.
  • Template d’email d’accès VM bilingue texte/HTML (variantes émission initiale et réinitialisation), avec encodage sécurisé du contenu HTML, commande SSH intégrée si l’adresse IP est disponible.

VmService :

  • Sagas de cycle de vie des VMs : démarrage asynchrone (VmStartSaga), arrêt asynchrone (VmStopSaga), destruction asynchrone (VmDestroySaga).
  • Opérations batch sur un environnement : démarrage de toutes les VMs (StartAllEnvironmentVms), arrêt de toutes les VMs (StopAllEnvironmentVms), suppression de toutes les VMs (DeleteWorkEnvironmentVms).
  • Réinitialisation des credentials VM : génération d’un nouveau mot de passe, application via qemu-guest-agent (set-user-password), re-publication de l’événement VmCredentialIssued avec IsReset = true.
  • Nouvelle tentative de provisionnement sur VM en échec (RetryVmCreation).
  • Service d’autorisation pour le hub SignalR (VmStatusHubAuthorizationService) : contrôle d’accès par rôle et appartenance au groupe de l’environnement.

Edukit-Front :

  • Composant de gestion des utilisateurs (UserManagement) avec test de composant.
  • Intégration SignalR (VmStatusHubService) pour la réception des mises à jour temps réel de statut des VMs.

2. Périmètre de test

2.1 Fonctionnalités couvertes dans ce sprint

Composant Fonctionnalité Type(s) de test réalisé(s)
OrgService Sessions de travail - CreateWorkSession, StartWorkSession, CompleteWorkSession, CancelWorkSession, UpdateWorkSession Unitaire (handler, validator, authorization)
OrgService Sessions de travail - GetWorkSessions, GetWorkSessionById, GetWorkSessionHistories Unitaire (handler, validator, authorization)
OrgService Service de transition des sessions (WorkSessionTransitionService) Unitaire
OrgService Consommation de VmCredentialIssued : décryptage + envoi email Unitaire
OrgService Template d’email d’accès VM (corps HTML/texte, variante reset, encodage sécurisé) Unitaire
VmService Saga de démarrage VM (VmStartSaga) Unitaire
VmService Saga d’arrêt VM (VmStopSaga) Unitaire
VmService Saga de destruction VM (VmDestroySaga) Unitaire
VmService StartAllEnvironmentVms, StopAllEnvironmentVms, DeleteWorkEnvironmentVms Unitaire (handler, validator, authorization)
VmService ResetVmCredential (génération + agent + événement) Unitaire (handler, validator, authorization)
VmService RetryVmCreation Unitaire (handler, validator, authorization)
VmService Service d’autorisation SignalR Hub (VmStatusHubAuthorizationService) Unitaire
VmService Service de cycle de vie Proxmox - start/stop/destroy (VmLifecycleService) Infrastructure
Edukit-Front Composant UserManagement - initialisation Composant (Angular TestBed)

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

Fonctionnalité exclue Justification
Utilisateurs (CRUD), Établissements (CRUD) Fonctionnalités déjà 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
Templates VM (activation, archivage, packages) Idem - aucune modification dans ce sprint
Saga de provisionnement (VmProvisioningSaga) Livrée au Sprint 3 - aucune modification de code dans ce sprint
Authentification Keycloak Infrastructure externe, non modifiée dans ce sprint - 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 ; comportement 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 section 5 - Anomalies, AN-002)
SftpSnippetUploader Requiert une vraie session SSH - exclu intentionnellement de la suite automatisée (voir AN-004)

3. Environnements de test

Les tests unitaires et d’infrastructure s’exécutent entièrement en mémoire, sans aucune dépendance Docker. 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 - Swagger : /swagger .NET 9.0
OrgService gRPC http://localhost:5101 .NET 9.0
VmService API http://localhost:5200 - Swagger : /swagger .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 - 89 tests / 11 fichiers
       ┌──┴─────────────────┴──┐
       │    Tests unitaires     │  Base principale - 1 030 tests / 184 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 (chemins nominaux, ressource absente, violations de règles)
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 - aucune dépendance Docker n’est requise. Toutes les dépendances externes (repositories, services gRPC, clients Proxmox, bus de messages) sont substituées par des objets simulés (mocks) via Moq.

Résultats globaux à la livraison du Sprint 4

Composant Fichiers de test Tests exécutés Réussis Échoués Ignorés
OrgService 97 509 509 0 0
VmService 85 517 517 0 0
Edukit-Front 2 4 4 0 0
Total 184 1 030 1 030 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 4 a contribué environ 252 nouveaux tests à cette suite cumulée (153 OrgService + 98 VmService unitaires + 1 front).

Détail OrgService - périmètre Sprint 4

Sous-ensemble Fichiers Tests
Handlers - Sessions de travail (8 opérations) 8 ~40
Validators - Sessions de travail (8 opérations) 8 ~32
Authorization - Sessions de travail (8 opérations) 8 ~55
WorkSessionTransitionService 1 11
VmCredentialIssuedHandler 1 4
CredentialIssuedEmailTemplate 1 11
Total Sprint 4 OrgService 27 ~153

Exemples de cas de test représentatifs :

  • Handle_WhenUserUnknown_LogsAndDoesNotSend - vérification que l’email n’est pas envoyé si l’utilisateur propriétaire de la VM est introuvable.
  • Build_WhenIpKnown_TextEmbedsSshOneLiner - vérification que la commande SSH complète est insérée dans l’email lorsque l’adresse IP est disponible.
  • Build_HtmlEncodesUserContent - vérification de l’encodage HTML du contenu utilisateur pour prévenir les injections XSS dans le corps email.
  • Handle_WhenWorkSessionAlreadyStarted_ThrowsInvalidOperation - protection contre les doubles démarrages de session.

Détail VmService - périmètre Sprint 4

Sous-ensemble Fichiers Tests
Sagas (VmStartSaga, VmStopSaga, VmDestroySaga) 3 15
Handlers - StartAll / StopAll / DeleteAll (handler + validator + auth) 9 ~26
Handlers - ResetVmCredential (handler + validator + auth) 3 13
Handlers - RetryVmCreation (handler + validator + auth) 3 14
VmStatusHubAuthorizationService 1 12
Total Sprint 4 VmService (unitaires) 19 ~80

Exemples de cas de test représentatifs :

  • Handle_OnSuccess_AppliesPasswordViaAgent_StampsResetAndPublishesEvent - vérifie que la réinitialisation appelle SetUserPasswordViaAgentAsync avec le hash SHA-512, incrémente CredentialResetCount et publie l’événement VmCredentialIssued avec IsReset = true.
  • Handle_WhenVmNotRunning_ThrowsInvalidOperation - protection contre les réinitialisations sur une VM non démarrée.

Détail Edukit-Front - périmètre Sprint 4

Fichier de test Composant testé Tests
user-management.spec.ts UserManagement 1

4.3 Tests d’infrastructure (VmService)

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

Composant Fichiers de test Tests Réussis Échoués
VmService - InfrastructureTests (total) 11 89 89 0
Fichier de test Composant testé Tests Sprint 4 (nouveaux)
VmLifecycleServiceTests.cs Start/stop Proxmox - happy path, rollback 6 (nouveau Sprint 4)
VmLifecycleServiceDestroyTests.cs Destruction Proxmox - happy path, VM introuvable 5 (nouveau Sprint 4)
VmProvisioningServiceTests.cs Orchestration de provisionnement Préexistant - Sprint 3
VmStatusReconcilerTests.cs Réconciliation périodique des statuts Préexistant
ProxmoxClientTests.cs Client HTTP Proxmox - requêtes, erreurs Préexistant
ProxmoxThrottlerTests.cs Throttling concurrent des opérations Préexistant
AesGcmPayloadCipherTests.cs Chiffrement / déchiffrement AES-256-GCM Préexistant
PasswordGeneratorTests.cs Génération de mots de passe sécurisés Préexistant
Sha512CryptHasherTests.cs Hashage SHA-512 crypt(3) Préexistant
GrpcGroupResolutionServiceTests.cs Client gRPC - résolution de groupes Préexistant
GrpcWorkEnvironmentResolutionServiceTests.cs Client gRPC - résolution des environnements Préexistant

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
Session de travail - cycle complet Création → Démarrage → Complétion Insomnia (collection partagée) Réussi Transitions d’état validées
Session de travail - annulation Création → Démarrage → Annulation Insomnia (collection partagée) Réussi  
VmCredentialIssued - email Provisionnement d’une VM → réception email Interface Angular + Mailpit Réussi Email reçu avec commande SSH et mot de passe
Réinitialisation credential Reset sur une VM Running → réception email Insomnia (collection partagée) Réussi Compteur CredentialResetCount incrémenté
Démarrage batch d’un environnement Démarrage de toutes les VMs Insomnia (collection partagée) Réussi Mises à jour temps réel via SignalR visibles sur le front
Arrêt batch d’un environnement Arrêt de toutes les VMs Insomnia (collection partagée) Réussi  
Destruction de toutes les VMs Suppression batch d’un environnement Insomnia (collection partagée) Réussi VMs passées à l’état Destroyed
Retry provisionnement Déclenchement d’un retry sur une VM Failed Insomnia (collection partagée) + Angular Réussi VM repassée à Pending puis reprovisionnée
UserManagement - affichage Chargement de la page utilisateurs Interface Angular (:4200) Réussi Tableau paginé affiché
SignalR - temps réel Démarrage d’une VM depuis le front, observation des transitions Interface Angular Réussi Statut mis à jour sans rechargement de page

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 17/05/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 est en dessous du seuil objectif de 40 % en raison du faible nombre de tests Angular (4 tests, 2 fichiers) par rapport à la surface du projet. Ce point est connu, non bloquant à ce stade, 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 (guards authGuard, roleGuard, establishmentGuard, services et composants de fonctionnalité non couverts). 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.
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. En attendant, 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. 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 (11 fichiers d’infrastructure). Les adaptateurs gRPC et SMTP de l’OrgService 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).

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 4 a enrichi la plateforme Edu-Kit de fonctionnalités critiques pour le cycle de vie complet des VMs et la communication inter-services. À la date de livraison, la suite automatisée compte 1 030 tests unitaires (répartis sur 184 fichiers) et 89 tests d’infrastructure, soit 1 119 tests automatisés au total. Le Sprint 4 a contribué environ 252 nouveaux tests à cette suite.

L’ensemble des 1 119 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, identifiées dans la stratégie de test, non bloquantes pour la livraison et trackées dans la feuille de route du projet.

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 4 - cycle de vie des sessions de travail, communication inter-services par événements (VmCredentialIssued), sagas de cycle de vie des VMs et opérations batch - 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 d’infrastructure OrgService Court terme Ajout d’un projet InfrastructureTests pour couvrir les clients gRPC et le SmtpEmailSender (symétrie avec VmService - voir AN-004)
Tests de composants Angular Court terme Extension de la couverture Vitest aux guards (authGuard, roleGuard, establishmentGuard), services et composants de fonctionnalité (voir AN-001)
Tests E2E Moyen terme Implémentation de Playwright ou Cypress sur les parcours critiques : connexion Keycloak, provisionnement VM, cycle d’une session de travail (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 le VmService et l’OrgService
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é du credential 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é, notamment set-user-password
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 (collection partagée) et interface Angular

Retour en haut