Update json_to_md.py
Run Pytest with Allure and Coverage Reports / tests (push) Successful in 53s
Run Pytest with Allure and Coverage Reports / deploy (push) Has been skipped

This commit is contained in:
2025-07-10 10:14:07 +02:00
parent 87d8f7a5a8
commit d24cd2a84c
+38 -39
View File
@@ -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)