Update json_to_md.py
This commit is contained in:
+38
-39
@@ -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"<details>\n<summary>📁 `{name}`</summary>\n\n")
|
||||
f.write("```json\n")
|
||||
json.dump(collector, f, indent=2, ensure_ascii=False)
|
||||
f.write("\n```\n</details>\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"<details>\n<summary>🔹 `{base_name}`</summary>\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<details>\n<summary>🔍 Détails (raw call)</summary>\n\n")
|
||||
f.write("```json\n")
|
||||
json.dump(call_data, f, indent=2, ensure_ascii=False)
|
||||
f.write("\n```\n</details>\n")
|
||||
|
||||
f.write("</details>\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)
|
||||
json_to_adaptive_md(args.input, args.output)
|
||||
|
||||
Reference in New Issue
Block a user