Healthcare Eval Harness — Vérification de la Sécurité des Patients
Système automatisé de vérification pour les déploiements d'applications de soins de santé. Un seul échec CRITIQUE bloque le déploiement. La sécurité des patients n'est pas négociable.
Remarque : Les exemples utilisent Jest comme exécuteur de test de référence. Adaptez les commandes à votre framework (Vitest, pytest, PHPUnit, etc.) — les catégories de test et les seuils de réussite sont indépendants du framework.
Quand l'utiliser
- Avant tout déploiement d'applications EMR/EHR
- Après avoir modifié la logique CDSS (interactions médicamenteuses, validation des doses, scores)
- Après avoir modifié les schémas de base de données qui touchent aux données patients
- Après avoir modifié l'authentification ou le contrôle d'accès
- Lors de la configuration du pipeline CI/CD pour les applications de santé
- Après avoir résolu des conflits de fusion dans les modules cliniques
Comment ça fonctionne
Le banc d'essai exécute cinq catégories de tests dans l'ordre. Les trois premières (Précision CDSS, Exposition PHI, Intégrité des données) sont des barrières CRITIQUES nécessitant un taux de réussite de 100 % — un seul échec bloque le déploiement. Les deux suivantes (Flux de travail clinique, Intégration) sont des barrières HAUTES nécessitant un taux de réussite de 95 % ou plus.
Chaque catégorie correspond à un modèle de chemin de test Jest. Le pipeline CI exécute les barrières CRITIQUES avec --bail (arrêt au premier échec) et applique des seuils de couverture avec --coverage --coverageThreshold.
Catégories d'évaluation
1. Précision du CDSS (CRITIQUE — 100 % requis)
Teste toute la logique de support décisionnel clinique : paires d'interactions médicamenteuses (dans les deux sens), règles de validation des doses, scores cliniques par rapport aux spécifications publiées, aucun faux négatif, aucune défaillance silencieuse.
npx jest --testPathPattern='tests/cdss' --bail --ci --coverage
2. Exposition des PHI (CRITIQUE — 100 % requis)
Teste les fuites d'informations de santé protégées : réponses d'erreur de l'API, sortie console, paramètres d'URL, stockage navigateur, isolation entre établissements, accès non authentifié, absence de clé de rôle de service.
npx jest --testPathPattern='tests/security/phi' --bail --ci
3. Intégrité des données (CRITIQUE — 100 % requis)
Teste la sécurité des données cliniques : rencontres verrouillées, entrées de piste d'audit, protection contre les suppressions en cascade, gestion des modifications simultanées, absence d'enregistrements orphelins.
npx jest --testPathPattern='tests/data-integrity' --bail --ci
4. Flux de travail clinique (HAUTE — 95 %+ requis)
Teste les flux de bout en bout : cycle de vie des rencontres, rendu des modèles, ensembles de médicaments, recherche de médicaments/diagnostics, PDF de prescription, alertes de drapeau rouge.
tmp_json=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$tmp_json" || true
total=$(jq '.numTotalTests // 0' "$tmp_json")
passed=$(jq '.numPassedTests // 0' "$tmp_json")
if [ "$total" -eq 0 ]; then
echo "Aucun test clinique trouvé" >&2
exit 1
fi
rate=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Taux de réussite clinique : ${rate}% ($passed/$total)"
5. Conformité d'intégration (HAUTE — 95 %+ requis)
Teste les systèmes externes : analyse des messages HL7 (v2.x), validation FHIR, mappage des résultats de laboratoire, gestion des messages malformés.
tmp_json=$(mktemp)
npx jest --testPathPattern='tests/integration' --ci --json --outputFile="$tmp_json" || true
total=$(jq '.numTotalTests // 0' "$tmp_json")
passed=$(jq '.numPassedTests // 0' "$tmp_json")
if [ "$total" -eq 0 ]; then
echo "Aucun test d'intégration trouvé" >&2
exit 1
fi
rate=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Taux de réussite d'intégration : ${rate}% ($passed/$total)"
Matrice de réussite/échec
| Catégorie | Seuil | En cas d'échec |
|---|---|---|
| Précision CDSS | 100 % | BLOQUER le déploiement |
| Exposition PHI | 100 % | BLOQUER le déploiement |
| Intégrité des données | 100 % | BLOQUER le déploiement |
| Flux de travail clinique | 95 %+ | AVERTISSEMENT, autoriser avec révision |
| Intégration | 95 %+ | AVERTISSEMENT, autoriser avec révision |
Intégration CI/CD
name: Healthcare Safety Gate
on: [push, pull_request]
jobs:
safety-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
# Barrières CRITIQUES — 100 % requis, arrêt au premier échec
- name: Précision CDSS
run: npx jest --testPathPattern='tests/cdss' --bail --ci --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
- name: Vérification PHI
run: npx jest --testPathPattern='tests/security/phi' --bail --ci
- name: Intégrité des données
run: npx jest --testPathPattern='tests/data-integrity' --bail --ci
# Barrières HAUTES — 95 %+ requis, vérification de seuil personnalisée
- name: Flux de travail cliniques
run: |
TMP_JSON=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$TMP_JSON" || true
TOTAL=$(jq '.numTotalTests // 0' "$TMP_JSON")
PASSED=$(jq '.numPassedTests // 0' "$TMP_JSON")
if [ "$TOTAL" -eq 0 ]; then
echo "::error::Aucun test clinique trouvé"; exit 1
fi
RATE=$(echo "scale=2; $PASSED * 100 / $TOTAL" | bc)
echo "Taux de réussite : ${RATE}% ($PASSED/$TOTAL)"
if (( $(echo "$RATE < 95" | bc -l) )); then
echo "::warning::Le taux de réussite clinique ${RATE}% est inférieur à 95%"
fi
- name: Conformité d'intégration
run: |
TMP_JSON=$(mktemp)
npx jest --testPathPattern='tests/integration' --ci --json --outputFile="$TMP_JSON" || true
TOTAL=$(jq '.numTotalTests // 0' "$TMP_JSON")
PASSED=$(jq '.numPassedTests // 0' "$TMP_JSON")
if [ "$TOTAL" -eq 0 ]; then
echo "::error::Aucun test d'intégration trouvé"; exit 1
fi
RATE=$(echo "scale=2; $PASSED * 100 / $TOTAL" | bc)
echo "Taux de réussite : ${RATE}% ($PASSED/$TOTAL)"
if (( $(echo "$RATE < 95" | bc -l) )); then
echo "::warning::Le taux de réussite d'intégration ${RATE}% est inférieur à 95%"
fi
Anti-patrons
- Sauter les tests CDSS « parce qu'ils ont réussi la dernière fois »
- Définir des seuils CRITIQUES en dessous de 100 %
- Utiliser
--no-bailsur les suites de tests CRITIQUES - Simuler le moteur CDSS dans les tests d'intégration (doit tester la logique réelle)
- Autoriser les déploiements lorsque la barrière de sécurité est rouge
- Exécuter les tests sans
--coveragesur les suites CDSS
Exemples
Exemple 1 : Exécuter toutes les barrières critiques localement
npx jest --testPathPattern='tests/cdss' --bail --ci --coverage && \
npx jest --testPathPattern='tests/security/phi' --bail --ci && \
npx jest --testPathPattern='tests/data-integrity' --bail --ci
Exemple 2 : Vérifier le taux de réussite des barrières HAUTES
tmp_json=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$tmp_json" || true
jq '{
passed: (.numPassedTests // 0),
total: (.numTotalTests // 0),
rate: (if (.numTotalTests // 0) == 0 then 0 else ((.numPassedTests // 0) / (.numTotalTests // 1) * 100) end)
}' "$tmp_json"
# Attendu : { "passed": 21, "total": 22, "rate": 95.45 }
Exemple 3 : Rapport d'évaluation
## Évaluation Healthcare : 2026-03-27 [commit abc1234]
### Sécurité des patients : RÉUSSI
| Catégorie | Tests | Réussis | Échecs | Statut |
|-----------|-------|---------|--------|--------|
| Précision CDSS | 39 | 39 | 0 | RÉUSSI |
| Exposition PHI | 8 | 8 | 0 | RÉUSSI |
| Intégrité des données | 12 | 12 | 0 | RÉUSSI |
| Flux de travail clinique | 22 | 21 | 1 | 95,5 % RÉUSSI |
| Intégration | 6 | 6 | 0 | RÉUSSI |
### Couverture : 84 % (cible : 80 %+)
### Verdict : SÛR À DÉPLOYER