Aller au contenu

Cohérence des indicateurs de la démo publique

Billet #335 : Correction de la cohérence des indicateurs sur la démo publique et renforcement de la suite de tests
Type : Correction / Analyse métier / Automatisation des tests
Composants concernés : code_source_simule/flask_app.py, templates/demo_index.html, tests/test_demo.py, requirements.txt, docs/tests/index.md, docs/tests/demo.md, docs/fr/tests/index.md, docs/fr/tests/demo.md, coverage.xml, docs/reports/report.xml, docs/reports/report.jsonl


1. Contexte et symptômes

La page de démonstration publique (/demo) présente des données fictives, mais censées rester crédibles pour un visiteur qui évalue le produit sans y avoir un accès complet. Un examen attentif de cette page a révélé quatre incohérences métier qui nuisaient à cette crédibilité :

  • la carte Top 10 Performers pouvait afficher un titre en baisse, et la carte Bottom 10 Performers un titre en hausse;
  • un même titre pouvait apparaître à la fois dans Closest to 52-Week High et Closest to 52-Week Low;
  • un même titre pouvait apparaître à la fois dans les cibles hautes et basses des analystes, avec des cibles parfois très éloignées (jusqu'à plusieurs dizaines de pourcent) du prix affiché;
  • la carte Moving Against Expectations affichait un sous-titre mélangeant français et anglais, alors que toute la page démo est censée être unilingue anglaise.

2. Objectif

Corriger ces quatre incohérences sans ajouter de nouveaux titres factices, puisque la suite de tests existante verrouille déjà un plafond de 10 titres pour l'échantillon de démonstration.

3. Solution implémentée

3.1 — Séparation stricte des hausses et des baisses Le calcul des cartes Top/Bottom dans _build_demo_dashboard_context() filtre désormais séparément les titres en hausse et les titres en baisse avant le tri, plutôt que de découper une seule liste triée en deux tranches (haut et bas), ce qui pouvait faire chevaucher les deux cartes.

3.2 — Exclusivité des cartes 52 semaines Chaque titre est maintenant attribué à une seule carte (proche du sommet ou proche du creux annuel), selon la distance la plus courte entre son prix actuel et chacun des deux seuils. Un titre ne peut plus apparaître dans les deux cartes à la fois.

3.3 — Recalibrage des cibles d'analystes de démonstration Les valeurs fictives Lowest Price Target et Highest Price Target de l'échantillon de démonstration ont été resserrées pour rester dans une plage réaliste de 0 à 10 % autour du prix affiché, tout en conservant la cohérence avec les prix an_haut/an_bas déjà utilisés par les cartes 52 semaines.

3.4 — Libellé unilingue anglais Le sous-titre de la carte Moving Against Expectations a été traduit intégralement en anglais (Holding Gain Change (Gain %) / Investor Sentiment), pour retirer le dernier fragment francophone résiduel de la page démo.

4. Évaluation et renforcement de la suite de tests

Avant de considérer la correction terminée, la suite de tests existante (tests/test_demo.py) a été évaluée pour vérifier si elle verrouillait déjà ces quatre règles. Constat : elle validait le rendu général, le plafond de 10 titres et les liens des infobulles, mais aucun test ne verrouillait explicitement les signes, l'exclusivité des cartes, ni la cohérence des cibles affichées.

Un nouveau cas de test dédié (tc-demo14) a donc été ajouté pour verrouiller ces quatre règles métier de façon permanente, en lisant directement les données calculées par _build_demo_dashboard_context() plutôt qu'en inspectant uniquement le texte HTML rendu. Aucun test existant n'a été supprimé ni modifié.

La dépendance pytest-json-report, absente de requirements.txt malgré son usage prévu par manage.py, a été ajoutée pour rendre la régénération des rapports reproductible dans l'environnement local.

5. Validation et résultat

  • Suite de tests dédiée à la démo : 14 tests réussis.
  • Suite de tests complète : 254 tests réussis, 3 avertissements.
  • Couverture du code applicatif (code_source_simule/*) recalculée : 82,37 %.
  • Rapports régénérés : coverage.xml, docs/reports/report.xml, docs/reports/report.jsonl.
  • Documentation de suivi des tests (EN/FR) synchronisée avec le nouveau cas de test et les nouveaux résultats.

6. Leçons apprises

  1. Une couverture de rendu visuel ne remplace pas une couverture de règles métier. La suite existante validait que les cartes s'affichaient correctement, mais pas que leurs données respectaient les règles de cohérence attendues (signes, exclusivité, plage de valeurs). Un test doit verrouiller directement la règle métier, pas seulement sa présentation.
  2. Corriger les données de démonstration sans ajouter de titres factices est possible en retravaillant la logique de répartition (attribution par distance la plus courte) plutôt qu'en élargissant l'échantillon, ce qui aurait contredit le plafond déjà verrouillé par les tests.
  3. Coût token : 290,57 crédits IA Copilot consommés pour cette session, soit une valeur brute équivalente de 2,91 $. Ce coût reste marginal au regard du temps gagné (environ 2 heures) à corriger et verrouiller quatre règles métier distinctes en une seule session.