进入检查功能测试方案.md 6.1 KB

进入检查功能测试方案

功能概述

本测试方案覆盖从Worklist和History列表双击进入检查的功能。根据任务的曝光状态,系统会自动导航到不同的界面:

  • 未曝光任务:进入检查界面(Exam)
  • 已曝光任务:进入处理界面(Process)

核心实现逻辑

业务流程

worklistToExam(task) {
  1. 调用 fetchTaskDetails(StudyID) 获取完整检查信息
  2. 转换数据格式,包含所有Views(体位)
  3. 判断曝光状态:
     - 所有体位已曝光 → 进入"处理界面"(businessFlow: 'process')
     - 有未曝光体位 → 进入"检查界面"(businessFlow: 'exam')
  4. 更新Redux状态:
     - clearWorks() - 清空缓存
     - addWork(updatedTask) - 保存任务
     - setBusinessFlow() - 设置流程
}

关键文件

  • src/domain/patient/worklistToExam.ts - 核心业务逻辑
  • src/pages/patient/worklist.tsx - Worklist页面(双击触发)
  • src/pages/patient/HistoryList.tsx - History页面(双击触发)

测试场景

场景1:Worklist双击进入检查(未曝光)

测试文件cypress/e2e/patient/worklist-enter-exam-unexposed.cy.ts

前置条件

  • 用户已登录
  • Worklist中存在未曝光任务

测试步骤

  1. 导航到Worklist
  2. 双击第一条未曝光任务
  3. 系统调用API获取任务详情
  4. 系统判断为未曝光状态
  5. 进入检查界面

验证点

  • API调用验证:
    • GET /dr/api/v1/auth/study/{id} 被正确调用
    • 返回数据包含未曝光的series和images
  • Redux状态验证:
    • examWorksCache 包含正确的任务数据
    • businessFlow 状态为 'exam'
  • 界面验证:
    • 检查界面的主要元素可见(工具栏、内容区域等)

场景2:Worklist双击进入处理(已曝光)

测试文件cypress/e2e/patient/worklist-enter-process-exposed.cy.ts

前置条件

  • 用户已登录
  • Worklist中存在已曝光任务

测试步骤

  1. 导航到Worklist
  2. 双击第一条已曝光任务
  3. 系统调用API获取任务详情
  4. 系统判断为已曝光状态
  5. 进入处理界面

验证点

  • API调用验证:
    • GET /dr/api/v1/auth/study/{id} 被正确调用
    • 返回数据的所有images状态为 'Exposed'
  • Redux状态验证:
    • examWorksCache 包含正确的任务数据
    • businessFlow 状态为 'process'
    • bodyPositionList 已正确转换
  • 界面验证:
    • 处理界面的主要元素可见

场景3:History双击进入检查(未曝光)

测试文件cypress/e2e/patient/history-enter-exam-unexposed.cy.ts

前置条件

  • 用户已登录
  • History中存在未曝光任务

测试步骤

  1. 导航到History
  2. 双击第一条未曝光任务
  3. 系统调用API获取任务详情
  4. 系统判断为未曝光状态
  5. 进入检查界面

验证点

  • API调用验证:同场景1
  • Redux状态验证:同场景1
  • 界面验证:同场景1

场景4:History双击进入处理(已曝光)

测试文件cypress/e2e/patient/history-enter-process-exposed.cy.ts

前置条件

  • 用户已登录
  • History中存在已曝光任务

测试步骤

  1. 导航到History
  2. 双击第一条已曝光任务
  3. 系统调用API获取任务详情
  4. 系统判断为已曝光状态
  5. 进入处理界面

验证点

  • API调用验证:同场景2
  • Redux状态验证:同场景2
  • 界面验证:同场景2

测试数据准备

Mock数据需求

1. 未曝光任务详情

mockGetStudyDetailsUnexposed(studyId: string)
  • 返回包含未曝光images的完整study信息
  • expose_status: 'Unexposed'

2. 已曝光任务详情

mockGetStudyDetailsExposed(studyId: string)
  • 返回包含已曝光images的完整study信息
  • expose_status: 'Exposed'
  • 包含图片路径信息

3. Worklist数据

mockFetchTwoWorks()
  • 返回至少2条任务记录(已存在)

4. History数据

mockFetchTwoHistoryWorks()
  • 返回至少2条历史任务记录

Page Object增强

HistoryPage

需要添加:

findTableAndDoubleClickFirstRow() {
  cy.get('table').within(() => {
    cy.get('tbody tr[data-testid="row-0"]')
      .scrollIntoView()
      .should('be.visible')
      .dblclick({ force: true });
  });
}

ExamPage

已有的验证方法:

  • verifyExamPageLoaded() - 验证检查界面加载
  • getToolbar() - 获取工具栏
  • getContentArea() - 获取内容区域

ProcessPage(如需要)

需要创建新的Page Object来验证处理界面元素

Redux状态验证模式

验证examWorksCache

cy.window()
  .its('store')
  .invoke('getState')
  .its('examWorksCache')
  .its('works')
  .should('have.length', 1)
  .its(0)
  .should('have.property', 'StudyID');

验证businessFlow

cy.window()
  .its('store')
  .invoke('getState')
  .its('businessFlow')
  .its('currentFlow')
  .should('eq', 'exam'); // 或 'process'

验证bodyPositionList(处理界面)

cy.window()
  .its('store')
  .invoke('getState')
  .its('bodyPositionList')
  .its('positions')
  .should('have.length.greaterThan', 0);

执行顺序

  1. ✅ 创建测试方案文档(本文档)
  2. 创建/增强Mock handlers
  3. 增强Page Objects
  4. 编写测试用例代码:
    • worklist-enter-exam-unexposed.cy.ts
    • worklist-enter-process-exposed.cy.ts
    • history-enter-exam-unexposed.cy.ts
    • history-enter-process-exposed.cy.ts

注意事项

  1. 不验证URL变化:根据用户反馈,去掉URL验证点
  2. 关注页面元素:重点验证目标页面的关键元素可见性
  3. Redux状态:每个场景都应验证相应的Redux状态
  4. API响应:确保Mock返回正确的曝光状态数据
  5. 等待策略:使用cy.wait()等待API调用完成后再验证状态

成功标准

所有4个测试场景都应:

  • ✅ 正确触发双击事件
  • ✅ 正确调用API
  • ✅ 正确更新Redux状态
  • ✅ 正确显示目标界面元素
  • ✅ 测试稳定可重复执行