医疗保健评估框架 —— 患者安全验证
用于医疗应用部署的自动化验证系统。任何一个关键失败都会阻止部署。患者安全不容置疑。
注: 示例使用 Jest 作为参考测试运行器。请根据您的测试框架(Vitest、pytest、PHPUnit 等)调整命令 —— 测试类别和通过阈值与框架无关。
何时使用
- 部署 EMR/EHR 应用程序之前
- 修改 CDSS 逻辑(药物相互作用、剂量验证、评分)之后
- 更改涉及患者数据的数据库模式之后
- 修改身份验证或访问控制之后
- 在配置医疗应用的 CI/CD 管道期间
- 解决临床模块中的合并冲突之后
工作原理
评估框架按顺序运行五个测试类别。前三个(CDSS 准确性、PHI 暴露、数据完整性)是关键门控,要求 100% 通过率 —— 任何一个失败都会阻止部署。后两个(临床工作流、集成合规性)是高门控,要求 95% 以上通过率。
每个类别对应一个 Jest 测试路径模式。CI 管道对关键门控使用 --bail(遇到第一个失败即停止),并通过 --coverage --coverageThreshold 强制覆盖阈值。
评估类别
1. CDSS 准确性(关键 —— 要求 100%)
测试所有临床决策支持逻辑:药物相互作用对(双向)、剂量验证规则、临床评分与已发布规范的对比、无假阴性、无静默失败。
npx jest --testPathPattern='tests/cdss' --bail --ci --coverage
2. PHI 暴露(关键 —— 要求 100%)
测试受保护健康信息泄露:API 错误响应、控制台输出、URL 参数、浏览器存储、跨机构隔离、未认证访问、服务角色密钥缺失。
npx jest --testPathPattern='tests/security/phi' --bail --ci
3. 数据完整性(关键 —— 要求 100%)
测试临床数据安全:锁定病历、审计跟踪条目、级联删除保护、并发编辑处理、无孤立记录。
npx jest --testPathPattern='tests/data-integrity' --bail --ci
4. 临床工作流(高 —— 要求 95%+)
测试端到端流程:病历生命周期、模板渲染、用药组合、药物/诊断搜索、处方 PDF、红色警报。
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 "No clinical tests found" >&2
exit 1
fi
rate=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Clinical pass rate: ${rate}% ($passed/$total)"
5. 集成合规性(高 —— 要求 95%+)
测试外部系统:HL7 消息解析(v2.x)、FHIR 验证、实验室结果映射、格式错误消息处理。
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 "No integration tests found" >&2
exit 1
fi
rate=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Integration pass rate: ${rate}% ($passed/$total)"
通过/失败矩阵
| 类别 | 阈值 | 失败时操作 |
|---|---|---|
| CDSS 准确性 | 100% | 阻止部署 |
| PHI 暴露 | 100% | 阻止部署 |
| 数据完整性 | 100% | 阻止部署 |
| 临床工作流 | 95%+ | 警告,允许经审核后部署 |
| 集成合规性 | 95%+ | 警告,允许经审核后部署 |
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
# 关键门控 —— 要求 100%,遇到第一个失败即停止
- 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
# 高门控 —— 要求 95%+,自定义阈值检查
- 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::No clinical tests found"; exit 1
fi
RATE=$(echo "scale=2; $PASSED * 100 / $TOTAL" | bc)
echo "Pass rate: ${RATE}% ($PASSED/$TOTAL)"
if (( $(echo "$RATE < 95" | bc -l) )); then
echo "::warning::Clinical pass rate ${RATE}% below 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::No integration tests found"; exit 1
fi
RATE=$(echo "scale=2; $PASSED * 100 / $TOTAL" | bc)
echo "Pass rate: ${RATE}% ($PASSED/$TOTAL)"
if (( $(echo "$RATE < 95" | bc -l) )); then
echo "::warning::Integration pass rate ${RATE}% below 95%"
fi
反模式
- 跳过 CDSS 测试,因为“上次通过了”
- 将关键阈值设置为低于 100%
- 在关键测试套件中使用
--no-bail - 在集成测试中模拟 CDSS 引擎(必须测试真实逻辑)
- 在安全门控显示红色时允许部署
- 在 CDSS 套件上运行测试时不使用
--coverage
示例
示例 1:本地运行所有关键门控
npx jest --testPathPattern='tests/cdss' --bail --ci --coverage && \
npx jest --testPathPattern='tests/security/phi' --bail --ci && \
npx jest --testPathPattern='tests/data-integrity' --bail --ci
示例 2:检查高门控通过率
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"
# 预期输出: { "passed": 21, "total": 22, "rate": 95.45 }
示例 3:评估报告
## Healthcare Eval: 2026-03-27 [commit abc1234]
### Patient Safety: PASS
| Category | Tests | Pass | Fail | Status |
|----------|-------|------|------|--------|
| CDSS Accuracy | 39 | 39 | 0 | PASS |
| PHI Exposure | 8 | 8 | 0 | PASS |
| Data Integrity | 12 | 12 | 0 | PASS |
| Clinical Workflow | 22 | 21 | 1 | 95.5% PASS |
| Integration | 6 | 6 | 0 | PASS |
### Coverage: 84% (target: 80%+)
### Verdict: SAFE TO DEPLOY