按日期范围查询Study功能测试方案.md 16 KB

按日期范围查询 Study 功能 E2E 测试方案

功能概述

在 Worklist 和 History 列表中,用户可以通过日期范围查询 study。系统提供三个预设时间范围(今天、7天、所有)和自定义日期范围选择器。

功能描述

  • 页面: Worklist、History
  • 组件: TimeRangeSelector(预设范围)+ DatePicker.RangePicker(自定义范围)
  • 预设选项:
    • 今天: 查询今天的 study
    • 7天: 查询最近 7 天的 study
    • 所有: 不限制时间范围
  • 自定义范围: 用户可选择任意开始和结束日期

测试用例汇总表

用例ID 描述 输入 预期输出 测试类型 理由
TC-WL-DATE-01 Worklist - 选择"今天" 点击"今天"单选按钮 → 点击搜索 API 调用包含今天的日期范围,表格显示今天的 study 正常 验证预设时间范围"今天"的基本功能
TC-WL-DATE-02 Worklist - 选择"7天" 点击"7天"单选按钮 → 点击搜索 API 调用包含最近7天的日期范围,表格显示最近7天的 study 正常 验证预设时间范围"7天"的基本功能
TC-WL-DATE-03 Worklist - 选择"所有" 点击"所有"单选按钮 → 点击搜索 API 调用不包含日期范围限制,表格显示所有 study 正常 验证预设时间范围"所有"的基本功能
TC-WL-DATE-04 Worklist - 自定义日期范围 选择开始日期 2025-10-01,结束日期 2025-10-10 → 点击搜索 API 调用包含指定的日期范围,表格显示该范围内的 study 正常 验证自定义日期范围查询功能
TC-WL-DATE-05 Worklist - 日期范围组合患者名称查询 选择"今天" + 输入患者名称"张三" → 点击搜索 API 调用同时包含日期范围和患者名称,表格显示符合条件的 study 正常 验证多条件组合查询功能
TC-WL-DATE-06 Worklist - 清空自定义日期范围 选择日期范围后清空 → 点击搜索 API 调用不包含日期范围,表格显示所有 study 边界 验证清空日期范围的行为
TC-WL-DATE-07 Worklist - 预设和自定义日期切换 先选择"今天" → 再选择自定义日期范围 → 点击搜索 自定义日期范围优先,API 使用自定义日期 正常 验证预设和自定义日期的优先级
TC-WL-DATE-08 Worklist - 开始日期晚于结束日期 选择开始日期 2025-10-10,结束日期 2025-10-01 → 点击搜索 系统接受查询,API 调用包含该范围(或返回空结果) 边界 验证日期顺序异常情况的处理
TC-WL-DATE-09 Worklist - 未来日期范围 选择未来的日期范围 → 点击搜索 API 调用包含未来日期范围,表格显示空结果或提示 边界 验证未来日期的处理
TC-WL-DATE-10 Worklist - 同一天作为开始和结束 选择开始和结束都为 2025-10-01 → 点击搜索 API 调用包含该日期,表格显示当天的 study 边界 验证单日查询
TC-HIS-DATE-01 History - 选择"今天" 导航到 History → 点击"今天" → 点击搜索 API 调用 status=Completed 和今天日期范围,显示今天完成的 study 正常 验证 History 页面的"今天"功能
TC-HIS-DATE-02 History - 选择"7天" 导航到 History → 点击"7天" → 点击搜索 API 调用 status=Completed 和7天日期范围,显示7天内完成的 study 正常 验证 History 页面的"7天"功能
TC-HIS-DATE-03 History - 选择"所有" 导航到 History → 点击"所有" → 点击搜索 API 调用 status=Completed 不限日期,显示所有完成的 study 正常 验证 History 页面的"所有"功能
TC-HIS-DATE-04 History - 自定义日期范围 导航到 History → 选择日期范围 → 点击搜索 API 调用 status=Completed 和指定日期范围,显示该范围内完成的 study 正常 验证 History 页面的自定义日期功能
TC-DATE-STATE-01 Redux 状态同步 - timeRangeType 选择"今天" Redux search.timeRangeType = "today" 正常 验证预设时间范围在 Redux 中的状态管理
TC-DATE-STATE-02 Redux 状态同步 - 自定义日期 选择自定义日期范围 Redux search.start_time 和 end_time 正确存储 RFC3339Nano 格式日期 正常 验证自定义日期在 Redux 中的状态管理

测试套件设计

测试套件 1: Worklist 日期范围查询

文件: cypress/e2e/patient/worklist/date-range-filter.cy.ts

测试场景:

正常场景

  1. 预设时间范围查询
    • 今天
    • 7天
    • 所有
  2. 自定义日期范围查询
    • 指定开始和结束日期
  3. 组合查询
    • 日期范围 + 患者名称
    • 日期范围 + 患者ID
    • 日期范围 + 登记号

边界场景

  1. 日期范围边界
    • 清空日期范围
    • 同一天作为开始和结束
    • 开始日期晚于结束日期
    • 未来日期范围
  2. 切换场景
    • 预设时间范围之间切换
    • 预设时间范围切换到自定义日期
    • 自定义日期切换到预设时间范围

异常场景

  1. API 失败
    • 查询 API 返回错误
    • 查询超时
  2. 无结果
    • 日期范围内无数据

测试套件 2: History 日期范围查询

文件: cypress/e2e/patient/history/date-range-filter.cy.ts

测试场景: 与 Worklist 类似,但验证 status=Completed 参数

测试套件 3: Redux 状态管理

文件: 集成在上述测试文件中

测试场景: 验证日期范围选择后 Redux 状态的正确性

测试目标

  1. 功能完整性: 验证所有预设和自定义日期范围查询功能正常工作
  2. 状态管理: 验证 Redux 状态正确同步和持久化
  3. API 集成: 验证查询参数正确传递给后端 API
  4. 用户体验: 验证日期选择器交互流畅,查询结果准确
  5. 边界处理: 验证各种边界情况的正确处理
  6. 错误处理: 验证 API 错误和无结果情况的处理

验证点详细说明

1. 预设时间范围验证点

今天:

  • Redux timeRangeType = "today"
  • API 调用包含 start_time = 今天 00:00:00
  • API 调用包含 end_time = 今天 23:59:59
  • 表格显示今天的 study

7天:

  • Redux timeRangeType = "7days"
  • API 调用包含 start_time = 7天前 00:00:00
  • API 调用包含 end_time = 今天 23:59:59
  • 表格显示最近7天的 study

所有:

  • Redux timeRangeType = "all"
  • API 调用不包含 start_timeend_time 参数
  • 表格显示所有 study

2. 自定义日期范围验证点

  • DatePicker.RangePicker 可以选择日期
  • Redux start_timeend_time 以 RFC3339Nano 格式存储
  • API 调用包含选定的日期范围
  • 表格显示指定日期范围的 study

3. 组合查询验证点

  • 多个查询条件同时生效
  • API 调用包含所有指定的参数
  • 表格显示同时满足所有条件的 study

4. API 调用验证点

Worklist:

  • URL: /dr/api/v1/auth/study
  • 参数包含: status=Arrived,InProgress
  • 日期参数: start_timeend_time

History:

  • URL: /dr/api/v1/auth/study
  • 参数包含: status=Completed
  • 日期参数: start_timeend_time

需要 Mock 的请求与响应

1. Mock: 今天的 study 数据

请求:

GET /dr/api/v1/auth/study?status=Arrived,InProgress&start_time=2025-10-13T00:00:00.000+08:00&end_time=2025-10-13T23:59:59.999+08:00

响应:

{
  "code": "0x000000",
  "description": "Success",
  "data": {
    "@type": "type.googleapis.com/dr.study.StudyList",
    "count": 2,
    "studies": [
      {
        "study_id": "TODAY001",
        "patient_name": "今天患者1",
        "study_start_datetime": "2025-10-13T08:00:00Z",
        "study_status": "Arrived",
        ...
      },
      {
        "study_id": "TODAY002",
        "patient_name": "今天患者2",
        "study_start_datetime": "2025-10-13T10:00:00Z",
        "study_status": "InProgress",
        ...
      }
    ]
  }
}

2. Mock: 7天的 study 数据

请求:

GET /dr/api/v1/auth/study?status=Arrived,InProgress&start_time=2025-10-06T00:00:00.000+08:00&end_time=2025-10-13T23:59:59.999+08:00

响应: 返回 5 条记录,日期分布在最近 7 天

3. Mock: 所有 study 数据

请求:

GET /dr/api/v1/auth/study?status=Arrived,InProgress

响应: 返回所有 study,不限日期

4. Mock: 自定义日期范围数据

请求:

GET /dr/api/v1/auth/study?status=Arrived,InProgress&start_time=2025-10-01T00:00:00.000+08:00&end_time=2025-10-10T23:59:59.999+08:00

响应: 返回指定日期范围的 study

5. Mock: 组合查询数据

请求:

GET /dr/api/v1/auth/study?status=Arrived,InProgress&start_time=...&end_time=...&patient_name=张三

响应: 返回符合多个条件的 study

6. Mock: 空结果

请求: 未来日期范围或无数据的日期范围

响应:

{
  "code": "0x000000",
  "description": "Success",
  "data": {
    "@type": "type.googleapis.com/dr.study.StudyList",
    "count": 0,
    "studies": []
  }
}

7. Mock: API 失败

请求: 任意查询

响应:

{
  "statusCode": 500,
  "body": {
    "code": "0x000001",
    "description": "Internal Server Error",
    "solution": "请稍后重试"
  }
}

Page Object Model (POM)

新建 POM

SearchPanelPage

文件: cypress/support/pageObjects/SearchPanelPage.ts

方法:

class SearchPanelPage {
  // 输入框操作
  getPatientNameInput()
  getPatientIdInput()
  getAccessionNumberInput()
  typePatientName(name: string)
  typePatientId(id: string)
  typeAccessionNumber(accNo: string)
  
  // 时间范围选择器操作
  selectTimeRangeToday()
  selectTimeRange7Days()
  selectTimeRangeAll()
  verifyTimeRangeSelected(type: 'today' | '7days' | 'all')
  
  // 自定义日期范围操作
  selectCustomDateRange(startDate: string, endDate: string)
  clearCustomDateRange()
  getStartDateInput()
  getEndDateInput()
  
  // 搜索按钮
  clickSearchButton()
  
  // 验证
  verifySearchPanelVisible()
}

修改现有 POM

WorklistPage

新增方法:

// 验证表格中显示的日期范围
verifyStudyDatesWithinRange(startDate: Date, endDate: Date)

// 验证表格为空
verifyTableEmpty()

// 获取表格中第一行的日期
getFirstRowStudyDate()

HistoryPage

新增方法: 与 WorklistPage 相同

测试执行计划

第一阶段: Worklist 核心功能测试(优先级:高)

时间: 2-3 小时

  1. TC-WL-DATE-01: 选择"今天"
  2. TC-WL-DATE-02: 选择"7天"
  3. TC-WL-DATE-03: 选择"所有"
  4. TC-WL-DATE-04: 自定义日期范围

第二阶段: Worklist 组合和边界测试(优先级:中)

时间: 2-3 小时

  1. TC-WL-DATE-05: 组合查询
  2. TC-WL-DATE-06: 清空日期范围
  3. TC-WL-DATE-07: 预设和自定义切换
  4. TC-WL-DATE-08: 开始日期晚于结束日期
  5. TC-WL-DATE-09: 未来日期范围
  6. TC-WL-DATE-10: 同一天查询

第三阶段: History 功能测试(优先级:中)

时间: 1-2 小时

  1. TC-HIS-DATE-01: History 选择"今天"
  2. TC-HIS-DATE-02: History 选择"7天"
  3. TC-HIS-DATE-03: History 选择"所有"
  4. TC-HIS-DATE-04: History 自定义日期范围

第四阶段: 状态管理测试(优先级:低)

时间: 1 小时

  1. TC-DATE-STATE-01: Redux 状态同步 - timeRangeType
  2. TC-DATE-STATE-02: Redux 状态同步 - 自定义日期

测试覆盖率目标

  • 功能覆盖: 100% - 所有日期范围查询相关功能
  • 场景覆盖:
    • 正常场景: 100%
    • 边界场景: 90%+
    • 异常场景: 80%+
  • 组件覆盖:
    • TimeRangeSelector: 100%
    • DatePicker.RangePicker: 90%+
    • SearchPanel: 相关部分 100%

潜在遗漏风险

1. 时区问题

风险: 日期时间可能因时区差异导致错误 缓解:

  • 明确使用 +08:00 时区
  • 测试跨时区边界情况(如 23:59:59)

2. 日期格式问题

风险: RFC3339Nano 格式不一致 缓解:

  • 验证 API 请求中的日期格式
  • 测试不同格式的日期输入

3. 预设和自定义日期的优先级

风险: 用户同时选择预设和自定义日期时行为不明确 缓解:

  • 明确测试 TC-WL-DATE-07
  • 文档化预期行为

4. 分页与日期范围的交互

风险: 切换日期范围时分页状态可能不正确 缓解:

  • 验证查询后分页重置为第一页
  • 测试在第二页时改变日期范围

5. 性能问题

风险: 大日期范围查询可能导致性能问题 缓解:

  • Mock 大量数据测试
  • 验证加载状态显示

6. 并发查询

风险: 快速多次点击搜索可能导致状态混乱 缓解:

  • 测试防抖/节流机制
  • 验证最后一次查询结果正确显示

如何运行测试

运行所有日期范围查询测试

npx cypress run --spec "cypress/e2e/patient/worklist/date-range-filter.cy.ts,cypress/e2e/patient/history/date-range-filter.cy.ts"

运行 Worklist 测试

npx cypress run --spec "cypress/e2e/patient/worklist/date-range-filter.cy.ts"

运行 History 测试

npx cypress run --spec "cypress/e2e/patient/history/date-range-filter.cy.ts"

在 Cypress UI 中运行

npx cypress open

然后选择相应的测试文件

运行特定测试用例

在测试文件中使用 .only:

it.only('应该选择今天查询 study', () => {
  // 测试代码
});

测试环境要求

依赖的 Mock Handlers

  1. 用户认证: mockLoginSuccess()
  2. 国际化: i18n mocks
  3. 配额: quota mocks
  4. 协议数据: protocol mocks(患者类型、身体部位等)
  5. 日期查询: 新建的 dateRangeQuery mocks

测试数据要求

  • 至少 10 条不同日期的 study 数据
  • 覆盖今天、7天内、7天外的数据
  • 包含不同状态的 study(Arrived、InProgress、Completed)

环境配置

  • 使用固定的"当前日期"进行测试,避免时间依赖问题
  • 或使用 Cypress 的时钟功能 cy.clock()

验收标准

功能验收

  • ✅ 所有测试用例通过
  • ✅ 预设时间范围(今天、7天、所有)工作正常
  • ✅ 自定义日期范围查询功能正常
  • ✅ 日期范围与其他查询条件组合正常
  • ✅ Worklist 和 History 页面功能一致

质量验收

  • ✅ 测试代码遵循 Given-When-Then 模式
  • ✅ 使用 POM 封装,代码可维护
  • ✅ Mock 数据完整,覆盖各种场景
  • ✅ 测试文档完整,说明清晰

用户体验验收

  • ✅ 日期选择器交互流畅
  • ✅ 查询结果准确
  • ✅ 错误情况有适当提示
  • ✅ 状态反馈及时(加载、成功、失败)

文档版本

  • 版本: 1.0.0
  • 创建日期: 2025-10-13
  • 最后更新: 2025-10-13
  • 作者: Cline AI Assistant
  • 状态: 待审核

附录

时间格式说明

RFC3339Nano 格式:

2025-10-13T08:00:00.000+08:00
  • 日期: YYYY-MM-DD
  • 时间: HH:mm:ss.SSS
  • 时区: +08:00 (中国标准时间)

Redux State 结构

{
  search: {
    timeRangeType: 'today' | '7days' | 'all',
    start_time: string, // RFC3339Nano 格式
    end_time: string,   // RFC3339Nano 格式
    id: string,
    name: string,
    acc_no: string,
    // ...其他字段
  }
}

API 查询参数

参数名 类型 必填 说明
status string Worklist: "Arrived,InProgress"
History: "Completed"
start_time string 开始日期,RFC3339Nano 格式
end_time string 结束日期,RFC3339Nano 格式
patient_id string 患者ID
patient_name string 患者姓名
access_number string 登记号
page number 页码,从1开始
page_size number 每页记录数