Harnais d'évaluation santé — Vérification de la sécurité des patients
Système de vérification automatisé pour les déploiements d'applications de santé. Un seul échec CRITIQUE bloque le déploiement. La sécurité des patients est non 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 modification de la logique CDSS (interactions médicamenteuses, validation des doses, scores)
- Après changement de schémas de base de données qui touchent aux données patients
- Après modification de l'authentification ou du contrôle d'accès
- Lors de la configuration du pipeline CI/CD pour des applications de santé
- Après résolution de conflits de fusion dans les modules cliniques
Comment ça fonctionne
Le harnais d'évaluation 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 passerelles CRITIQUES exigeant un taux de réussite de 100 % — un seul échec bloque le déploiement. Les deux dernières (Flux de travail clinique, Intégration) sont des passerelles HAUTES exigeant un taux de réussite de 95 % ou plus.
Chaque catégorie correspond à un motif de chemin de test Jest. Le pipeline CI exécute les passerelles CRITIQUES avec --bail (arrêt sur premier échec) et impose des seuils de couverture avec --coverage --coverageThreshold.
Catégories d'évaluation
1. Précision CDSS (CRITIQUE — 100% requis)
Teste toute la logique d'aide à la décision 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 PHI (CRITIQUE — 100% requis)
Teste les fuites d'informations de santé protégées : réponses d'erreur API, sortie console, paramètres 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 : consultations 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 consultations, 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 de 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
# Passerelles CRITIQUES — 100% requis, s'arrêter au premier échec
- name: CDSS Accuracy
run: npx jest --testPathPattern='tests/cdss' --bail --ci --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
- name: PHI Exposure Check
run: npx jest --testPathPattern='tests/security/phi' --bail --ci
- name: Data Integrity
run: npx jest --testPathPattern='tests/data-integrity' --bail --ci
# Passerelles HAUTES — 95%+ requis, vérification de seuil personnalisée
# Passerelles HAUTES — 95%+ requis
- name: Clinical Workflows
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: Integration Compliance
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
- Ignorer 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 passerelle de sécurité est rouge
- Exécuter les tests sans
--coveragesur les suites CDSS
Exemples
Exemple 1 : Exécuter toutes les passerelles 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 passerelles 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 santé : 27/03/2026 [commit abc1234]
### Sécurité des patients : RÉUSSI
| Catégorie | Tests | Réussi | Échec | 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% (objectif : 80%+)
### Verdict : SÛR À DÉPLOYER