Aller au contenu

JSON Test Runner

mecapy.testing.TestRunner est un outil de test inclus dans le SDK MecaPy qui permet aux experts métier d’écrire des cas de test en JSON, sans écrire de code Python.

Le runner :

  • Charge automatiquement tous les fichiers test_*.json d’un répertoire
  • Importe dynamiquement les modules Python référencés
  • Compare les résultats avec une tolérance numérique configurable
  • Retourne un code de sortie CI/CD-compatible (0 = succès, 1 = échec)

Le test runner est inclus dans le SDK MecaPy :

Fenêtre de terminal
pip install mecapy-sdk

Une fois installé, la commande mecapy-test est disponible dans votre environnement.

Chaque fichier test_*.json suit cette structure :

{
"handler": "handler:ma_fonction",
"description": "Description générale des tests",
"test_cases": [
{
"name": "cas_nominal",
"description": "Cas nominal avec valeurs standard",
"request": {
"param1": { "a": 10, "b": 1.5 },
"param2": { "x": 100 }
},
"expected": {
"resultat": 42.0,
"valide": true
},
"tolerance": { "numeric": 0.1 }
}
]
}
ChampTypeDescription
handlerstringRéférence à la fonction Python ("module:fonction")
descriptionstringDescription globale des tests
test_casesarrayListe des cas de test
ChampTypeDescription
namestringIdentifiant unique (snake_case)
descriptionstringDescription du scénario
requestobjectParamètres passés à la fonction (dans l’ordre)
expectedobjectRésultat attendu (peut être partiel)
tolerance.numericfloatTolérance absolue pour les comparaisons numériques
FormatExempleDescription
module:fonctionhandler:calculerFonction au niveau module
module.Classe:methodehandler.Calc:runMéthode de classe
Fenêtre de terminal
# Lancer les tests du répertoire tests/
mecapy-test tests/
# Avec un titre personnalisé
mecapy-test tests/ --title "NF E25-030-1"
# Avec un répertoire de module à ajouter au sys.path
mecapy-test tests/ --sys-path /path/to/my/handler --title "Mon Projet"
OptionDescriptionDéfaut
tests_dirRépertoire contenant les test_*.jsontests/
--titleTitre affiché dans l’en-têteTEST RUNNER
--sys-pathRépertoire ajouté au sys.path pour l’import(aucun)
from pathlib import Path
from mecapy.testing import TestRunner
runner = TestRunner(Path("tests"), title="NF E25-030-1")
runner.run_all_tests() # sys.exit(0) ou sys.exit(1)
- name: Run MecaPy tests
run: |
cd repos/functions/mon-package
mecapy-test tests/ --sys-path . --title "Mon Package"

Le script retourne :

  • Code 0 : tous les tests réussis
  • Code 1 : au moins un test échoué

Il n’est pas nécessaire de spécifier toutes les valeurs dans expected. Seules les clés présentes sont vérifiées :

"expected": {
"valide": true,
"precharge": {
"F0_min": 18333.3
}
}

Un expected vide {} crée un smoke test : la fonction est appelée mais aucune valeur n’est vérifiée. Utile pour s’assurer qu’une fonction ne lève pas d’exception.

"expected": {}

Chaque cas de test peut définir sa propre tolérance :

"tolerance": { "numeric": 1.0 }
Type de valeurComparaison
int / floatabs(actual - expected) <= tolerance
boolStricte (==)
strStricte (==)
dictRécursive sur les clés présentes dans expected
listÉlément par élément

Structure d’un package MecaPy avec tests JSON :

mon-package/
├── handler.py # Fonctions de calcul
├── mecapy.yml # Manifeste MecaPy
└── tests/
├── test_calcul_A.json
└── test_calcul_B.json

Lancement :

Fenêtre de terminal
cd mon-package
mecapy-test tests/ --sys-path . --title "Mon Package"

Sortie :

╔══════════════════════════════════════════════════════════════════════════════╗
║ Mon Package ║
╚══════════════════════════════════════════════════════════════════════════════╝
================================================================================
Test File: test_calcul_A.json
================================================================================
Handler: handler:ma_fonction
Description: Tests de ma fonction de calcul
Test: cas_nominal
Description: Cas nominal avec valeurs standard
✓ PASSED
================================================================================
RÉSUMÉ DES TESTS
================================================================================
Total de tests : 1
Réussis : 1
Échoués : 0
Taux de réussite : 100.0%