Files
test-ci/conftest.py
T
2025-08-27 20:27:18 +02:00

105 lines
3.2 KiB
Python

# conftest.py
import json
import os
import pathlib
import sys
# ---------- Safe serialization ----------
def safe_serialize(obj):
try:
json.dumps(obj)
return obj
except TypeError:
try:
return str(obj)
except Exception:
return "<unserializable>"
def serialize_callspec_between_getparam_and_setmulti(callspec):
data = {}
if hasattr(callspec, "params"):
params = callspec.params
if isinstance(params, dict):
data["params"] = {str(k): safe_serialize(v) for k, v in params.items()}
else:
data["params"] = safe_serialize(params)
for attr in ["id", "param_index"]:
if hasattr(callspec, attr):
try:
value = getattr(callspec, attr)
if not callable(value):
data[attr] = safe_serialize(value)
except Exception:
data[attr] = "<error>"
return data
# ---------- Runtime params ----------
runtime_params = []
def pytest_runtest_makereport(item, call):
if call.when != "call":
return
entry = {"nodeid": item.nodeid, "callspec": None}
if hasattr(item, "callspec"):
entry["callspec"] = serialize_callspec_between_getparam_and_setmulti(item.callspec)
runtime_params.append(entry)
# ---------- Capture prints ----------
'''
LOGFILE = pathlib.Path("outputs/test-prints.log")
def pytest_sessionstart(session):
LOGFILE.parent.mkdir(parents=True, exist_ok=True)
LOGFILE.write_text("") # reset à chaque run
def pytest_runtest_logreport(report):
if report.when != "call": # éviter doublons
return
if report.capstdout and report.capstdout.strip():
with LOGFILE.open("a") as f:
f.write(
f"\n<span style='color:purple;font-weight:bold'>--- {report.nodeid} (stdout) ---</span>\n"
)
f.write(report.capstdout)
if report.capstderr and report.capstderr.strip():
with LOGFILE.open("a") as f:
f.write(
f"\n<span style='color:purple;font-weight:bold'>--- {report.nodeid} (stderr) ---</span>\n"
)
f.write(report.capstderr)
# ---------- Capture global/external output ----------
class TeeStdout:
def __init__(self, original):
self.original = original
self.buffer = ""
def write(self, data):
self.original.write(data)
self.buffer += data
if "\n" in self.buffer:
chunk, self.buffer = self.buffer.split("\n", 1)
if chunk.strip():
with LOGFILE.open("a") as f:
f.write(
f"\n<span style='color:purple;font-weight:bold'>"
f"--- [EXTERNAL PROCESS OUTPUT] ---</span>\n"
)
f.write(chunk + "\n")
def flush(self):
self.original.flush()
'''
def pytest_configure(config):
sys.stdout = TeeStdout(sys.stdout)
sys.stderr = TeeStdout(sys.stderr)
def pytest_sessionfinish(session, exitstatus):
os.makedirs("markdown", exist_ok=True)
with open("markdown/runtime_params.json", "w") as f:
json.dump(runtime_params, f, indent=2)