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

This commit is contained in:
2025-07-10 11:46:56 +02:00
parent 72ea57bcfc
commit cfcea1fad9
+28 -43
View File
@@ -14,41 +14,26 @@ def stringify(obj):
return f"`{str(obj)}`"
def extract_params(test):
# 1. Cas où les params sont déjà extraits dans l'objet test
if "params" in test and test["params"]:
params = test["params"]
if isinstance(params, dict):
return "\n".join(f" - `{k}` = `{v}`" for k, v in params.items())
return f" - `{params}`"
# 2. Extraction depuis le nodeid (format: test_name[params])
if "params" in test:
return stringify(test["params"])
nodeid = test.get("nodeid", "")
if "[" not in nodeid:
return None
params_str = nodeid.split("[")[-1].rstrip("]")
if not params_str:
return None
# Détection du format (nommé ou positionnel)
raw_params = nodeid.split("[")[-1].rstrip("]")
lines = []
if "=" in params_str: # Format nommé: key=value
for param in params_str.split("-"):
named = all("=" in p for p in raw_params.split("-"))
if named:
for param in raw_params.split("-"):
if "=" in param:
key, val = param.split("=", 1)
lines.append(f" - `{key.strip()}` = `{val.strip()}`")
name, value = param.split("=", 1)
lines.append(f" - `{name.strip()}`: `{value.strip()}`")
else:
lines.append(f" - `{param.strip()}`")
else: # Format positionnel: value1-value2
for i, val in enumerate(params_str.split("-"), 1):
lines.append(f" - Param {i}: `{val.strip()}`")
lines.append(f" - `{param.strip()}`")
else:
for i, value in enumerate(raw_params.split("-"), 1):
lines.append(f" - Param {i}: `{value.strip()}`")
return "\n".join(lines)
def clean_filename(filename):
"""Enlève le préfixe tests\ des noms de fichiers"""
return filename.replace("tests\\", "").replace("tests/", "")
def json_to_md_nested(json_path, md_path):
with open(json_path) as f:
data = json.load(f)
@@ -71,40 +56,40 @@ def json_to_md_nested(json_path, md_path):
for test in data["tests"]:
nodeid = test.get("nodeid", "")
parts = nodeid.split("::")
filename = clean_filename(parts[0])
filename = parts[0]
funcname = parts[1].split("[")[0]
grouped[filename][funcname].append(test)
for filename, funcs in grouped.items():
f.write(f"<details>\n <summary>📁 {filename}</summary>\n\n")
f.write(f"<details>\n<summary>📁 {filename}</summary>\n\n")
for funcname, tests in funcs.items():
f.write(f" <details>\n <summary>🔧 Fonction: `{funcname}`</summary>\n\n")
f.write(f"<details>\n<summary>🔧 Fonction: `{funcname}`</summary>\n\n")
for idx, test in enumerate(tests, 1):
outcome = test.get("outcome", "unknown")
icons = {"passed": "", "failed": "", "skipped": "⏭️", "error": ""}
emoji = icons.get(outcome, "")
f.write(f" <details>\n <summary>{emoji} #{idx}</summary>\n\n")
f.write(f"<details>\n<summary>{emoji} #{idx}</summary>\n\n")
param_string = extract_params(test)
if param_string:
f.write(f" - **Paramètres:**\n{param_string}\n")
f.write(f"- **Paramètres:**\n{param_string}\n")
f.write(f" - **Statut:** {emoji} `{outcome}`\n")
f.write(f"- **Statut:** {emoji} `{outcome}`\n")
duration = test.get("call", {}).get("duration")
f.write(f" - **Durée:** `{duration:.6f}` s\n" if duration else " - **Durée:** `None`\n")
f.write(f"- **Durée:** `{duration:.6f}` s\n" if duration else "- **Durée:** `None`\n")
if outcome != "passed":
f.write(" - **Détails:**\n")
f.write(" <details>\n <summary>Détails</summary>\n\n")
f.write("- **Détails:**\n")
f.write("<details>\n<summary>Détails</summary>\n\n")
for key in ['duration', 'outcome', 'crash', 'traceback', 'longrepr']:
value = test.get("call", {}).get(key)
f.write(f" - **{key}:**\n")
f.write(" ```\n")
f.write(f" {value if value else 'None'}\n")
f.write(" ```\n\n")
f.write(" </details>\n")
f.write(" </details>\n\n")
f.write(" </details>\n\n")
f.write(f"- **{key}:**\n")
f.write("```\n")
f.write(f"{value if value else 'None'}\n")
f.write("```\n\n")
f.write("</details>\n")
f.write("</details>\n\n")
f.write("</details>\n\n")
f.write("</details>\n\n")
def main():