Files
slic/log_all_test_params.py
tligui_y eab2d10ffc
Run Pytest with HTML and XML Test Reports / tests (push) Successful in 39s
Add log_all_test_params.py
2025-07-16 15:49:21 +02:00

110 lines
4.5 KiB
Python

import os
import ast
import pprint
def extract_all_parametrize(filepath):
with open(filepath, "r") as f:
content = f.read()
parametrize_data = {}
print(f"\n📂 Fichier : {filepath}")
try:
tree = ast.parse(content, filename=filepath)
except Exception as e:
print(f"❌ Impossible de parser le fichier entier : {e}")
return parametrize_data
for node in tree.body:
if isinstance(node, ast.FunctionDef) and node.name.startswith("test_"):
print(f" 🔍 Fonction test détectée : {node.name}")
param_names = None
param_values = []
for deco in node.decorator_list:
# Vérifie que c'est un appel à pytest.mark.parametrize
if (
isinstance(deco, ast.Call)
and isinstance(deco.func, ast.Attribute)
and deco.func.attr == "parametrize"
):
try:
# noms de paramètres
names_node = deco.args[0]
if isinstance(names_node, ast.Str) or (
isinstance(names_node, ast.Constant) and isinstance(names_node.value, str)
):
raw_str = getattr(names_node, "s", names_node.value)
param_names = [x.strip() for x in raw_str.split(",")]
elif isinstance(names_node, ast.List):
param_names = [elt.s for elt in names_node.elts if isinstance(elt, ast.Str)]
else:
param_names = []
# valeurs
values_node = deco.args[1]
if isinstance(values_node, ast.List):
for elt in values_node.elts:
if isinstance(elt, ast.Call): # ex: pytest.param(...)
value = []
for arg in elt.args:
try:
value.append(ast.literal_eval(arg))
except Exception:
value.append("<dynamic>")
param_values.append(value)
elif isinstance(elt, ast.Tuple):
try:
value = [ast.literal_eval(e) for e in elt.elts]
param_values.append(value)
except Exception:
param_values.append(["<non-literal-tuple>"])
else:
try:
value = [ast.literal_eval(elt)]
param_values.append(value)
except Exception:
param_values.append(["<non-literal>"])
if param_names:
parametrize_data[node.name] = {
"names": param_names,
"values": param_values
}
print(f" ✅ Paramétré : {param_names}{len(param_values)} valeurs")
except Exception as e:
print(f" ⚠️ Décorateur parametrize ignoré : {e}")
if not param_names:
print(f" ⚠️ Pas de parametrize")
return parametrize_data
def find_test_files(root_dir):
test_files = []
for dirpath, _, filenames in os.walk(root_dir):
for fname in filenames:
if fname.startswith("test_") and fname.endswith(".py"):
test_files.append(os.path.join(dirpath, fname))
return test_files
def extract_all_tests_params(root_dir):
all_params = {}
test_files = find_test_files(root_dir)
for filepath in test_files:
try:
param_data = extract_all_parametrize(filepath)
if param_data:
all_params[filepath] = param_data
except Exception as e:
print(f"❌ Erreur lors du traitement de {filepath} : {e}")
return all_params
if __name__ == "__main__":
result = extract_all_tests_params("tests")
print("\n📊 Résultat final :")
pprint.pprint(result, sort_dicts=False)