diff --git a/json_to_md.py b/json_to_md.py
index 2f4b49db6..28ddecebc 100644
--- a/json_to_md.py
+++ b/json_to_md.py
@@ -2,73 +2,72 @@ import json
from datetime import datetime
import argparse
+def strip_params(nodeid):
+ """Supprime les paramètres des nodeids (ex: test[1-2] → test)"""
+ return nodeid.split('[')[0]
+
def json_to_adaptive_md(json_path, md_path):
- """Convertit le JSON pytest en Markdown avec structure dynamique"""
+ """Convertit le JSON pytest en Markdown avec blocs repliables"""
with open(json_path) as f:
data = json.load(f)
-
+
with open(md_path, 'w', encoding='utf-8') as f:
- # En-tête
f.write(f"# 🏗 Rapport de Tests (Générique)\n")
f.write(f"*Généré le {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*\n\n")
-
+
+ # Résumé
if 'summary' in data:
f.write("## 📋 Summary\n")
for key, value in data['summary'].items():
f.write(f"- **{key.capitalize()}:** `{value}`\n")
-
- total_duration = data.get('duration')
- if total_duration is not None:
- f.write(f"- **Durée totale:** `{total_duration:.3f}` s\n")
-
+ if 'duration' in data:
+ f.write(f"- **Durée totale:** `{data['duration']:.3f}` s\n")
f.write("\n")
-
- # Traitement hiérarchique automatique
+
+ # Section Collectors
+ if 'collectors' in data:
+ f.write("## 📦 Collectors\n")
+ for collector in data['collectors']:
+ if 'nodeid' in collector:
+ name = strip_params(collector['nodeid'])
+ f.write(f"\n📁 `{name}`
\n\n")
+ f.write("```json\n")
+ json.dump(collector, f, indent=2, ensure_ascii=False)
+ f.write("\n```\n \n\n")
+
+ # Section Tests
if 'tests' in data:
- current_file = None
-
+ f.write("## 🧪 Tests\n")
for test in data['tests']:
- # Nouveau fichier détecté
- if '::' in test['nodeid'] and current_file != test['nodeid'].split('::')[0]:
- current_file = test['nodeid'].split('::')[0]
- f.write(f"\n## 📄 Fichier: `{current_file}`\n")
-
- # Nom du test (sans les paramètres pour plus de clarté)
- test_name = test['nodeid'].split('::')[-1].split('[')[0]
- f.write(f"\n### 🧪 {test_name}\n")
-
- # Paramètres dynamiques
- if '[' in test['nodeid']:
- params = test['nodeid'].split('[')[1].rstrip(']')
- f.write("- **Paramètres:**\n")
- for i, param in enumerate(params.split('-'), 1):
- f.write(f" - Param {i}: `{param}`\n")
-
- # Métadonnées communes
+ base_name = strip_params(test['nodeid'])
+ f.write(f"\n🔹 `{base_name}`
\n\n")
+
+ # Outcome avec emoji
if "outcome" in test:
outcome_value = test["outcome"]
outcome_icons = {
"passed": "✅",
"skipped": "⏭️",
"failed": "❌",
- "error": "❗",
+ "error": "🛑",
}
emoji = outcome_icons.get(outcome_value)
f.write(f"- **Statut:** {emoji} `{outcome_value}`\n")
+ # Durée
if "call" in test and "duration" in test["call"]:
f.write(f"- **Durée:** `{test['call']['duration']:.6f}`s\n")
-
- # Détails spécifiques au résultat
+
+ # Si erreur ou autre, dump tout call[]
if test.get("outcome") != "passed":
call_data = test.get("call", {})
if call_data:
- f.write("\n**Détails (raw call):**\n")
- for key, value in call_data.items():
- f.write(f"\n- **{key}:**\n```\n{str(value)}\n```\n")
-
- f.write("\n" + "-"*50 + "\n")
+ f.write("\n\n🔍 Détails (raw call)
\n\n")
+ f.write("```json\n")
+ json.dump(call_data, f, indent=2, ensure_ascii=False)
+ f.write("\n```\n \n")
+ f.write(" \n\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Convert Pytest JSON report to Markdown")
@@ -76,4 +75,4 @@ if __name__ == "__main__":
parser.add_argument("--output", required=True, help="Chemin du fichier Markdown de sortie")
args = parser.parse_args()
- json_to_adaptive_md(args.input, args.output)
\ No newline at end of file
+ json_to_adaptive_md(args.input, args.output)