Audit Exhaustif (via scripts audit_tool.py)
| Artefact | Attendu | Observé | Couverture | Commentaire |
|---|---|---|---|---|
| package-info.java | 35 (1 par module) | ✗ Aucun | 0% | 🔴 Critique — aucune doc package |
| Javadoc classes | 726 classes | 232 documentées | 32% | ⚠️ Insuffisant (cible : 80%) |
| Javadoc méthodes publiques | ~4 800 méthodes | ~1 200 documentées | 25% | 🔴 Très insuffisant |
| ADR (Architecture Decision Records) | ≥10 décisions majeures | ✗ Aucun | 0% | Perte de contexte architectural |
| Diagrammes C4 | 4 niveaux (Context, Container, Component, Code) | ✗ Aucun | 0% | Difficulté onboarding |
| User Stories / Acceptance Criteria | ~200 US estimées | ✗ Non accessibles | ? | Stockées dans Jira ? |
| Documentation BPM | 30+ workflows | ⚠️ Fichiers BPMN non fournis | ? | Bloquant pour analyse |
Exemple de Javadoc Manquante (God Class)
x// app-pre-main/src/.../controller/EcSatPreWkf001Controller.java/** * Contrôleur workflow WKF001. * TODO: compléter documentation */public class EcSatPreWkf001Controller {
// ❌ Aucune Javadoc sur méthode publique critique public String traiterIncident(IncidentDTO incident) { // 350 lignes de code... }
// ❌ Pas de @param, @return, @throws public List<Tache> getTachesEnAttente(String acteur, Date debut, Date fin) { // ... }}Recommandations Documentation
Court terme (0–3 mois)
✅ Créer package-info.java pour 35 modules (effort : 7 j/h)
✅ Documenter 14 God Classes (méthodes publiques uniquement) — effort : 10 j/h
✅ Générer diagrammes C4 niveau 1–2 (Context + Container) — effort : 3 j/h
Moyen terme (3–6 mois) — si Option A (Refactoring) retenue
Documenter toutes APIs publiques (cible 80% couverture) — effort : 25 j/h
Créer 15 ADRs pour décisions architecturales passées — effort : 5 j/h
Reverse engineering User Stories depuis code + interviews PO — effort : 15 j/h
Option B (Greenfield) — Documentation Native
✅ Documentation First : Javadoc obligatoire pour tout nouveau code (Checkstyle enforced)
✅ ADRs systématiques : toute décision architecture documentée (template Markdown)
✅ Living Documentation : génération automatique doc depuis tests BDD (Cucumber)
Bus Factor Analysis
| Domaine Métier | Expert(s) Clé(s) | Bus Factor | Risque | Mitigation |
|---|---|---|---|---|
| Modèle de données SIAS | 1 architecte (nom non communiqué) | 1 | 🔴 Critique | Event Storming + doc |
| Workflows BPM (30+ processus) | 2 développeurs BPM | 2 | 🔴 Élevé | Reverse engineering |
| Intégrations SPQR/SSOL | 1 tech lead | 1 | 🔴 Critique | Documentation contrats |
| Logique métier TICC | 3 développeurs | 3 | ⚠️ Moyen | Pair programming |
| Migration PostgreSQL | 0 (connaissance externe) | 0 | ⚠️ Moyen | Formation + POC |
Actions Urgentes
Event Storming SIAS (2 semaines) — capturer processus métier complets
Participants : PO SIAS, architecte, 3 développeurs seniors
Livrable : 200+ User Stories, diagramme événements métier
Knowledge Transfer Sessions (1 mois)
10 sessions × 2h avec experts techniques
Enregistrement vidéo + transcription
Création documentation "How-To" (Confluence)
Pair Programming Systématique (continu)
Rotation développeurs juniors ↔ seniors
Code review obligatoire (≥2 reviewers par PR)
⚠️ Absence de Données Empiriques
JaCoCo non configuré dans POMs Maven
Aucun rapport de couverture disponible dans /target/
Estimation par inspection manuelle (via Glob "**/*Test.java") :
| Type de Test | Fichiers Détectés | Estimation Couverture | Commentaire |
|---|---|---|---|
| Tests unitaires JUnit | 142 fichiers *Test.java | ~30–40% | Principalement utilitaires/DTO |
| Tests d'intégration | 18 fichiers *IT.java | ~10% | Quelques tests DAO/Service |
| Tests Selenium/UI | ✗ Aucun | 0% | Aucun test end-to-end détecté |
| Tests API (REST Assured) | ✗ Aucun | 0% | Aucun test contrat d'API |
| Tests BPM | ✗ Aucun | 0% | 3 processus Software AG détectés, non testés |
| Tests de charge (JMeter) | ✗ Aucun | 0% | Performance non testée |
Exemples de Tests Existants
xxxxxxxxxx// Exemple test unitaire basique (utilitaire)public void testDateFormatter() { String result = DateUtils.formatToFrench(new Date()); assertNotNull(result); assertTrue(result.matches("\\d{2}/\\d{2}/\\d{4}"));}
// ❌ Aucun test sur logique métier critique// Ex: pas de test pour TraitementMasseServiceImpl (44 dépendances, 380 LOC)Métrique Qualité Estimée
xxxxxxxxxxCouverture globale estimée : 25–35% (LOC testés / LOC total)Cible recommandée : ≥80% (ISO 25010 — Software Product Quality)Déficit : ~45–55% → effort 60–80 j/h pour rattrapage complet
Test Pyramid (approche moderne)
xxxxxxxxxx▲/ \/ \/ E2E \ ← 5% (Selenium, Cypress)/_______\/ \/ Intégrat. \ ← 15% (TestContainers, Spring Test)/_____________\/ \/ Unitaires \ ← 80% (JUnit 5, Mockito, AssertJ)/___________________\
Outils et Frameworks Cibles
| Niveau | Framework | Usage | Exemple |
|---|---|---|---|
| Unitaire | JUnit 5 + Mockito | Tester logique métier isolée | IncidentServiceTest |
| Intégration | Spring Boot Test + TestContainers | Tester avec vraie DB (PostgreSQL dockerisé) | IncidentRepositoryIT |
| API | REST Assured + WireMock | Tester contrats REST + mocker services externes | IncidentApiContractTest |
| End-to-End | Cypress (recommandé) ou Selenium | Tester parcours utilisateur complets | CreateIncidentE2ETest |
| Charge | Gatling (Scala DSL) | Tester scalabilité (1000 req/s cible) | IncidentLoadTest |
| Mutation | Pitest | Vérifier qualité assertions tests | Détection tests "vides" |
| Contrat | Pact (Consumer-Driven) | Vérifier contrats API SPQR/SSOL | SPQRContractTest |
BDD (Behavior-Driven Development) — Recommandé
xxxxxxxxxx# features/incident_creation.featureFonctionnalité: Création d'incident SIAS depuis SPQR
Contexte: Étant donné un opérateur SIAS authentifié Et un compteur matricule "GZ78459032" valide dans le référentiel
Scénario: Création incident fuite de gaz priorité P1 Quand SPQR envoie une requête de création incident avec : | type | FUITE_GAZ | | priorite | P1 | | adresse | 12 Rue de la Paix, 75002 Paris | | matricule | GZ78459032 | Alors l'incident est créé avec succès Et un identifiant incident est retourné Et une notification est envoyée au topic Kafka "sias.incidents.created" Et l'opérateur SIAS reçoit une alerte email dans les 30 secondesImplémentation avec Cucumber
xxxxxxxxxxpublic class IncidentCreationSteps {
private IncidentService incidentService;
private KafkaTemplate<String, IncidentEvent> kafkaTemplate;
private IncidentDTO createdIncident;
("SPQR envoie une requête de création incident avec :") public void spqr_envoie_requete(DataTable dataTable) { Map<String, String> data = dataTable.asMap(String.class, String.class); IncidentCreateRequest request = IncidentCreateRequest.builder() .type(IncidentType.valueOf(data.get("type"))) .priorite(Priorite.valueOf(data.get("priorite"))) .adresse(data.get("adresse")) .matriculeCompteur(data.get("matricule")) .build();
createdIncident = incidentService.createIncident(request); }
("l'incident est créé avec succès") public void incident_cree_succes() { assertThat(createdIncident).isNotNull(); assertThat(createdIncident.getId()).isNotNull(); }}Couverture Cible Option B
| Phase MVP | Couverture Unitaire | Couverture Intégration | E2E | Cible Globale |
|---|---|---|---|---|
| Phase 1 (4–5 mois) | 75% | 60% | 5 scénarios critiques | 70% |
| Phase 2 (3–4 mois) | 80% | 70% | 15 scénarios | 75% |
| Phase 3 (3–4 mois) | 85% | 75% | 30 scénarios | 80% |