Files
AIclinicalresearch/backend/src/tests/README.md
HaHafeng b47079b387 feat(iit): Phase 1.5 AI对话集成REDCap真实数据完成
- feat: ChatService集成DeepSeek-V3实现AI对话(390行)
- feat: SessionMemory实现上下文记忆(最近3轮对话,170行)
- feat: 意图识别支持REDCap数据查询(关键词匹配)
- feat: REDCap数据注入LLM(queryRedcapRecord, countRedcapRecords, getProjectInfo)
- feat: 解决LLM幻觉问题(基于真实数据回答,明确system prompt)
- feat: 即时反馈(正在查询...提示)
- test: REDCap查询测试通过(test0102项目,10条记录,ID 7患者详情)
- docs: 创建Phase1.5开发完成记录(313行)
- docs: 更新Phase1.5开发计划(标记完成)
- docs: 更新MVP开发任务清单(Phase 1.5完成)
- docs: 更新模块当前状态(60%完成度)
- docs: 更新系统总体设计文档(v2.6)
- chore: 删除测试脚本(test-redcap-query-for-ai.ts, check-env-config.ts)
- chore: 移除REDCap测试环境变量(REDCAP_TEST_*)

技术亮点:
- AI基于REDCap真实数据对话,不编造信息
- 从数据库读取项目配置,不使用环境变量
- 企业微信端测试通过,用户体验良好

测试通过:
-  查询项目记录总数(10条)
-  查询特定患者详情(ID 7)
-  项目信息查询
-  上下文记忆(3轮对话)
-  即时反馈提示

影响范围:IIT Manager Agent模块
2026-01-03 22:48:10 +08:00

9.0 KiB
Raw Blame History

Phase 1-5 测试指南

📋 测试概览

本目录包含 4 个独立的测试脚本,用于验证 Postgres-Only 架构的核心组件:

测试脚本 测试内容 预计耗时
test-postgres-cache.ts PostgresCacheAdapter缓存读写、过期、批量操作 ~30秒
test-pgboss-queue.ts PgBossQueue任务入队、处理、重试 ~20秒
test-checkpoint.ts CheckpointService断点保存、恢复、中断续传 ~15秒
test-task-split.ts 任务拆分工具splitIntoChunks、recommendChunkSize <1秒

🚀 快速开始

前置条件

  1. 数据库迁移已完成

    # 确认app_cache表和新字段已创建
    psql -U postgres -d ai_clinical -c "\dt platform_schema.app_cache"
    
  2. pg-boss依赖已安装

    npm list pg-boss
    
  3. 环境变量已配置

    • DATABASE_URL 指向正确的数据库

📝 测试执行

1 测试 PostgresCacheAdapter缓存

cd AIclinicalresearch/backend
npx ts-node src/tests/test-postgres-cache.ts

测试内容:

  • 基本读写set/get
  • 过期机制2秒TTL验证
  • 批量操作mset/mget
  • 删除操作delete
  • has() 方法
  • 过期数据自动清理(懒删除)

预期输出:

🚀 开始测试 PostgresCacheAdapter...

📝 测试 1: 基本读写
   ✅ 写入并读取: { name: 'Alice', age: 25 }

⏰ 测试 2: 过期机制
   写入缓存2秒后过期...
   ✅ 3秒后读取: null

📦 测试 3: 批量操作
   ✅ 批量写入并读取: [{ id: 1 }, { id: 2 }, { id: 3 }]

🗑️ 测试 4: 删除操作
   ✅ 删除后读取: null

🔍 测试 5: has() 方法
   ✅ 存在的key: true
   ✅ 不存在的key: false

🧹 测试 6: 过期缓存自动删除
   ✅ 过期数据已自动删除: 是

🎉 所有测试通过!

2 测试 PgBossQueue任务队列

npx ts-node src/tests/test-pgboss-queue.ts

测试内容:

  • 连接初始化pg-boss.start()
  • 推送任务push
  • 处理任务process
  • 批量任务处理3个并发
  • 任务失败重试(模拟失败+重试)

预期输出:

🚀 开始测试 PgBossQueue...

📝 测试 1: 连接初始化
   ✅ PgBoss连接成功

📝 测试 2: 推送任务
   ✅ 任务已推送ID: abc-123-def

📝 测试 3: 处理任务
   📥 收到任务: abc-123-def
   📦 任务数据: { message: 'Hello PgBoss', timestamp: 1234567890 }
   ✅ 任务处理完成
   ✅ 任务处理验证通过

📝 测试 4: 批量任务处理
   ✅ 已推送 3 个批量任务
   📥 处理批次 1
   📥 处理批次 2
   📥 处理批次 3
   ✅ 已处理 3/3 个批量任务

📝 测试 5: 任务失败重试
   📥 第 1 次尝试
   ❌ 模拟失败,将重试...
   📥 第 2 次尝试
   ✅ 第2次成功
   ✅ 重试机制验证通过

🎉 所有测试通过!

⚠️ 注意事项:

  • pg-boss 会在 platform_schema 下自动创建 jobversion
  • 测试会等待任务异步处理,总耗时约 20 秒
  • 如果测试超时,检查数据库连接和 pg-boss 日志

3 测试 CheckpointService断点续传

npx ts-node src/tests/test-checkpoint.ts

测试内容:

  • 保存断点saveCheckpoint
  • 加载断点loadCheckpoint
  • 模拟中断恢复SAE实例重启场景
  • 更新任务进度processedBatches/currentIndex
  • 清除断点clearCheckpoint
  • 完整流程模拟10批次

预期输出:

🚀 开始测试 CheckpointService...

📝 准备测试数据...
   ✅ 创建测试任务 ID: task-123-abc

📝 测试 1: 保存断点
   ✅ 断点已保存

📝 测试 2: 加载断点
   ✅ 断点数据: {
     "currentBatchIndex": 3,
     "currentIndex": 350,
     "processedBatches": 3
   }
   ✅ 断点加载验证通过

📝 测试 3: 模拟中断恢复
   场景任务在第5批次突然中断...
   ⏸️ 保存中断点...
   🔄 模拟恢复...
   ✅ 恢复到批次 5索引 550
   ✅ 已处理 5 批次

📝 测试 4: 更新任务进度
   ✅ 任务进度: {
     processedBatches: 5,
     currentBatchIndex: 5,
     currentIndex: 550,
     progress: '550/1000'
   }

📝 测试 5: 清除断点
   ✅ 清除后的断点: null
   ✅ 断点清除验证通过

📝 测试 6: 完整流程模拟10批次
   📦 处理批次 1/10 (0-100)
   📦 处理批次 2/10 (100-200)
   ...
   📦 处理批次 10/10 (900-1000)
   ✅ 最终进度: {
     processedBatches: 10,
     totalBatches: 10,
     processedItems: 1000,
     totalItems: 1000
   }

🎉 所有测试通过!

⚠️ 注意事项:

  • 测试会创建临时的 AslScreeningProjectAslScreeningTask
  • 测试结束后会自动清理测试数据
  • 如果测试失败,手动清理:DELETE FROM asl_schema.screening_tasks WHERE project_id = 'test-...'

4 测试任务拆分工具(纯逻辑,无数据库)

npx ts-node src/tests/test-task-split.ts

测试内容:

  • 基本拆分100条数据每批10条
  • 不整除拆分105条数据最后一批5条
  • 大数据拆分1000条数据验证完整性
  • 推荐批次大小recommendChunkSize
  • 边界情况空数组、小数组、批次大小为1
  • 实际场景模拟1000篇文献筛选

预期输出:

🚀 开始测试任务拆分工具...

📝 测试 1: 基本拆分
   总数据: 100 条
   每批次: 10 条
   拆分结果: 10 批次
   ✅ 基本拆分通过

📝 测试 2: 不整除拆分
   总数据: 105 条
   每批次: 10 条
   拆分结果: 11 批次
   最后1批: 5 条
   ✅ 不整除拆分通过

📝 测试 3: 大数据拆分1000条
   ✅ 大数据拆分通过

📝 测试 4: 推荐批次大小
   文献筛选-100篇:
      推荐批次: 50 条/批
      总批次数: 2 批
   文献筛选-1000篇:
      推荐批次: 50 条/批
      总批次数: 20 批
   ...

📝 测试 5: 边界情况
   空数组拆分: ✅
   小数组拆分: ✅
   批次大小为1: ✅
   ✅ 边界情况通过

📝 测试 6: 实际应用场景模拟
   场景1000篇文献筛选
   总文献: 1000 篇
   推荐批次: 50 篇/批
   总批次数: 20 批
   预计总时间: 140.0 分钟 (假设每批7分钟)
   ✅ 实际场景模拟通过

🎉 所有测试通过!

🔍 故障排查

问题 1relation "platform_schema.app_cache" does not exist

原因: 数据库迁移未执行

解决:

cd AIclinicalresearch/backend
npx ts-node prisma/manual-migrations/run-migration.ts

问题 2Module '"pg-boss"' has no default export

原因: pg-boss 未安装或版本不兼容

解决:

npm install pg-boss@9.0.3 --save

问题 3Property 'appCache' does not exist on type 'PrismaClient'

原因: Prisma Client 未重新生成

解决:

npx prisma generate

问题 4测试卡住不动PgBossQueue测试

原因: pg-boss 连接失败或任务处理超时

排查:

  1. 检查数据库连接:psql -U postgres -d ai_clinical
  2. 检查 pg-boss 表:\dt platform_schema.job
  3. 查看 pg-boss 日志:检查终端输出

问题 5AslScreeningProject 创建失败

原因: 外键约束userId 不存在)

解决: 测试脚本会使用假的 UUID如果外键约束严格需要

-- 临时禁用外键约束
SET session_replication_role = 'replica';

-- 运行测试...

-- 恢复外键约束
SET session_replication_role = 'origin';

📊 测试结果总结

全部通过

如果所有 4 个测试脚本都输出 🎉 所有测试通过!,说明:

  1. PostgresCacheAdapter 可以正常缓存数据
  2. PgBossQueue 可以正常处理任务
  3. CheckpointService 可以正常保存/恢复断点
  4. 任务拆分工具 逻辑正确

下一步: 可以开始 Phase 6(改造 ASL 筛选服务)


部分失败

如果某个测试失败,不要继续 Phase 6,先排查错误:

  1. 查看错误堆栈
  2. 参考上面的"故障排查"部分
  3. 如有疑问,查看测试脚本源码(都有详细注释)

📚 扩展阅读


🎯 测试覆盖率

模块 测试覆盖 状态
PostgresCacheAdapter 100% (6/6 方法)
PgBossQueue 80% (5/6 方法,未测试 failJob)
CheckpointService 100% (3/3 方法)
TaskSplit Utils 100% (2/2 函数)

总体覆盖率95% 🎉


更新日期: 2025-12-13
版本: V1.0
作者: AI Clinical Research Team