Files
everything-is-suitable/everything-is-suitable-uniapp/docs/RELEASE_TEST_PLAN.md
T
zhangxiang 69da92b58b test: 修复所有已知问题并全面提高测试覆盖率至 90%
KNOWN-007: solarTime.ts 单元测试
KNOWN-008: 消除生产代码中 as any 类型断言
KNOWN-002: 工具层测试覆盖
KNOWN-003: lruCache 边界测试
KNOWN-004: templateService 分支覆盖(100%)
KNOWN-001: 6个业务组件测试
额外修复: searchOptimizer memoize bug, templateService 常量修改 bug

测试覆盖率: 75.71% -> 90.22%, 测试用例: 412 -> 671
2026-08-13 00:09:46 +08:00

340 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 万事宜 v1.0.0 封版测试计划
> **版本**: 1.0.0
> **创建日期**: 2026-08-12
> **测试类型**: 封版全面测试与验收
---
## 一、测试范围与策略
### 1.1 测试目标
| 维度 | 说明 | 验收标准 |
|------|------|---------|
| 功能完整性 | 所有核心功能模块正常运行 | 单元测试通过率 ≥ 90%,E2E 核心流程通过率 ≥ 80% |
| 性能稳定性 | 算法执行效率、页面加载速度 | 算法执行 < 1s,页面加载 < 3s |
| 兼容性适配 | 多浏览器/多设备/多平台 | 主流浏览器正常渲染,无功能性差异 |
| 安全性验证 | 纯客户端数据安全 | 无 XSS 注入风险,本地存储加密 |
| 用户体验 | 交互流程、国际化、异常处理 | 9 种语言完整覆盖,异常场景有提示 |
### 1.2 测试范围
| 模块 | 优先级 | 测试类型 |
|------|--------|---------|
| 黄历搜索 (almanac-search) | P0 | 单元测试 + E2E |
| 紫微斗数排盘 (ziwei) | P0 | 单元测试 + E2E + 交叉验证 |
| 运势分析 (fortune) | P0 | 单元测试 + E2E |
| 核心算法 (algorithms) | P0 | 单元测试 + 交叉验证 |
| 业务服务 (services) | P1 | 单元测试 |
| 工具函数 (utils) | P1 | 单元测试 |
| 通用组件 (components) | P1 | 单元测试 |
| 国际化 (locales) | P1 | 手动验证 |
| 页面结构 (pages) | P1 | 单元测试 + E2E |
---
## 二、测试环境配置
### 2.1 单元测试环境 (Vitest)
| 配置项 | 值 |
|--------|-----|
| 框架 | Vitest v4.0.18 |
| 环境 | jsdom |
| 覆盖率阈值 | Lines: 70%, Functions: 70%, Branches: 60% |
| 测试文件匹配 | `src/**/*.{test,spec}.{js,ts}` |
### 2.2 E2E 测试环境 (Playwright)
| 配置项 | 值 |
|--------|-----|
| 框架 | Playwright v1.57.0 |
| 基础 URL | `http://localhost:5173` |
| 浏览器 | Chromium (Desktop), Mobile Chrome (Pixel 5), Mobile Safari (iPhone 13) |
| 截图策略 | 仅失败时截图 |
| Trace 策略 | 首次重试时记录 |
### 2.3 兼容性测试矩阵
| 浏览器 | 桌面端 | 移动端 |
|--------|--------|--------|
| Chrome | ✅ 1440×900 | ✅ 375×667 (Pixel 5) |
| Safari | ✅ 1440×900 | ✅ 390×844 (iPhone 13) |
| Firefox | ✅ 1440×900 | ❌ (未配置) |
| Edge | ✅ 1440×900 | ❌ (未配置) |
---
## 三、测试用例设计
### 3.1 功能测试用例
#### 3.1.1 黄历搜索模块
| 编号 | 测试场景 | 前置条件 | 验证点 |
|------|---------|---------|--------|
| TC-ALM-001 | 页面加载 | 导航到 almanac-search 页 | 页面标题、搜索面板、模板面板正常渲染 |
| TC-ALM-002 | 添加搜索条件 | 进入搜索页面 | 可添加宜忌条件,条件数量正确递增 |
| TC-ALM-003 | 删除搜索条件 | 已添加条件 | 条件可删除,数量正确递减 |
| TC-ALM-004 | 执行搜索 | 至少添加一个条件 | 调用 searchService,显示结果或空状态 |
| TC-ALM-005 | 搜索结果排序 | 有搜索结果 | 可按日期/匹配度排序,可切换升序/降序 |
| TC-ALM-006 | 模板选择 | 选择预置模板 | 自动填充条件并执行搜索 |
| TC-ALM-007 | 空状态显示 | 无搜索条件 | 显示 EmptyState 组件 |
| TC-ALM-008 | 错误处理 | 搜索失败 | 显示错误信息和重试按钮 |
| TC-ALM-009 | 关键词搜索 | 从 URL 携带 keyword 参数 | 自动执行关键词搜索 |
| TC-ALM-010 | 加载状态 | 搜索进行中 | 显示 LoadingIndicator |
#### 3.1.2 紫微斗数排盘模块
| 编号 | 测试场景 | 前置条件 | 验证点 |
|------|---------|---------|--------|
| TC-ZW-001 | 页面加载 | 导航到 ziwei 页 | 显示出生信息表单 |
| TC-ZW-002 | 日期选择 | 点击日期选择器 | 可正确选择出生日期 |
| TC-ZW-003 | 时辰选择 | 点击时辰选择器 | 12 个时辰选项完整 |
| TC-ZW-004 | 性别切换 | 点击性别选项 | 可切换男/女,选中状态高亮 |
| TC-ZW-005 | 排盘计算 | 选择日期、时辰、性别 | 调用 ziweiService.generateChart |
| TC-ZW-006 | 宫位展示 | 排盘完成 | 12 宫位卡片正确渲染 |
| TC-ZW-007 | 三方四正分析 | 排盘完成 | 三方四正评分正确显示 |
| TC-ZW-008 | 综合评断 | 排盘完成 | 显示整体运势评断文字 |
| TC-ZW-009 | 空输入验证 | 未选择日期 | 排盘按钮不执行计算 |
| TC-ZW-010 | 算法正确性 | 已知输入 | 与已知案例交叉验证(46 项测试) |
#### 3.1.3 运势分析模块
| 编号 | 测试场景 | 前置条件 | 验证点 |
|------|---------|---------|--------|
| TC-FT-001 | 页面加载 | 导航到 fortune 页 | 显示日运/月运标签页 |
| TC-FT-002 | 标签切换 | 默认日运 | 可切换到月运标签 |
| TC-FT-003 | 默认日运选中 | 首次加载 | 日运标签默认高亮 |
| TC-FT-004 | 无排盘数据 | 未排盘 | 显示提示信息 |
| TC-FT-005 | 日期选择器 | 日运页面 | 可弹出日期选择器 |
| TC-FT-006 | 月份选择器 | 月运页面 | 可弹出月份选择器 |
| TC-FT-007 | 四维度建议 | 有排盘数据 | 显示事业/财运/感情/健康建议 |
| TC-FT-008 | 幸运信息 | 有排盘数据 | 显示幸运色/数字/方位 |
### 3.2 算法交叉验证用例
| 编号 | 测试场景 | 验证点 | 状态 |
|------|---------|--------|------|
| TC-ALGO-001 | 黄历宜忌一致性 | 同一建除日期的宜忌交集 | ✅ 68 项测试通过 |
| TC-ALGO-002 | 紫微斗数交叉验证 | 已知生辰的排盘结果一致性 | ✅ 46 项测试通过 |
| TC-ALGO-003 | 紫微算法单元测试 | 32 个排盘算法函数 | ✅ 全部通过 |
| TC-ALGO-004 | 运势策略测试 | 28 个运势策略场景 | ✅ 全部通过 |
| TC-ALGO-005 | 三方四正测试 | 9 个三方四正分析场景 | ✅ 全部通过 |
### 3.3 性能测试用例
| 编号 | 测试场景 | 预期指标 | 测试方法 |
|------|---------|---------|---------|
| TC-PERF-001 | 紫微排盘算法执行时间 | < 500ms | 单元测试计时 |
| TC-PERF-002 | 黄历计算算法执行时间 | < 200ms | 单元测试计时 |
| TC-PERF-003 | 页面首次加载时间 | < 3s | E2E 页面加载计时 |
| TC-PERF-004 | 搜索结果渲染 | < 1s (100 条) | 手动测试 |
| TC-PERF-005 | 长时间使用稳定性 | 无内存泄漏 | 手动操作 30 分钟 |
### 3.4 国际化验证用例
| 编号 | 语言 | 验证点 |
|------|------|--------|
| TC-I18N-001 | 简体中文 (zh-CN) | 完整翻译 |
| TC-I18N-002 | 繁体中文 (zh-TW) | 完整翻译 |
| TC-I18N-003 | 英文 (en) | 完整翻译 |
| TC-I18N-004 | 日文 (ja) | 完整翻译 |
| TC-I18N-005 | 韩文 (ko) | 完整翻译 |
| TC-I18N-006 | 法文 (fr) | 完整翻译 |
| TC-I18N-007 | 德文 (de) | 完整翻译 |
| TC-I18N-008 | 西班牙文 (es) | 完整翻译 |
| TC-I18N-009 | 葡萄牙文 (pt) | 完整翻译 |
### 3.5 安全验证用例
| 编号 | 测试场景 | 验证点 |
|------|---------|--------|
| TC-SEC-001 | XSS 注入 | 搜索关键词含 XSS 脚本不执行 |
| TC-SEC-002 | 本地存储安全 | 敏感数据不泄露 |
| TC-SEC-003 | 网络权限 | manifest.json 中 INTERNET 权限为 false |
| TC-SEC-004 | 隐私政策 | 首次启动显示隐私政策 |
---
## 四、测试执行流程
### 4.1 执行顺序
```
Phase 1: 基线建立
├── 运行单元测试套件 (npm run test)
├── 运行覆盖率测试 (npm run test:coverage)
└── 运行 E2E 测试 (npm run test:e2e)
Phase 2: 缺陷修复
├── 修复测试失败
├── 补充缺失测试用例
└── 回归验证
Phase 3: 专项测试
├── 性能测试
├── 兼容性测试
├── 安全验证
└── 国际化验证
Phase 4: 验收报告
├── 汇总测试结果
├── 缺陷清单与修复建议
└── 验收结论
```
### 4.2 测试命令
```bash
# 单元测试
npm run test # 运行所有单元测试
npm run test:coverage # 运行测试并生成覆盖率报告
# E2E 测试
npm run test:e2e # 运行所有 E2E 测试
npm run test:e2e:ui # 带 UI 界面的 E2E 测试
# 单文件测试
npx vitest --run src/algorithms/__tests__/almanac.test.ts
npx playwright test e2e/ziwei-chart.spec.ts
```
---
## 五、缺陷管理机制
### 5.1 缺陷分级
| 级别 | 定义 | 处理要求 |
|------|------|---------|
| P0 (阻断) | 核心功能不可用,数据丢失 | 立即修复,必须在封版前解决 |
| P1 (严重) | 功能偏离预期,但可绕过 | 当日修复 |
| P2 (一般) | 界面问题,非核心功能 | 在封版前解决 |
| P3 (建议) | 体验优化建议 | 记录,后续迭代 |
### 5.2 缺陷生命周期
```
发现 → 记录 → 确认 → 分配 → 修复 → 验证 → 关闭
↻ 回归测试
```
### 5.3 缺陷记录格式
```
---
ID: BUG-001
模块: almanac-search
级别: P1
描述: 搜索条件为空时点击搜索,错误提示未显示
环境: H5 / Chrome 143
步骤: 1. 进入搜索页 2. 不添加条件 3. 点击搜索按钮
预期: 显示"请添加搜索条件"提示
实际: 无任何反应
状态: 待修复
---
```
---
## 六、当前测试基线 (2026-08-12 更新)
### 6.1 单元测试
| 指标 | 当前值 | 目标 | 状态 |
|------|--------|------|------|
| 测试文件数 | 23 | ≥ 19 | ✅ |
| 测试用例数 | 412 | ≥ 350 | ✅ |
| 通过率 | 100% | ≥ 90% | ✅ |
| 执行时间 | 4.24s | < 5s | ✅ |
### 6.2 覆盖率
| 模块 | 指令覆盖率 | 分支覆盖率 | 函数覆盖率 | 状态 |
|------|-----------|-----------|-----------|------|
| 整体 | 75.71% | 67.21% | 74.07% | ⚠️ |
| 算法层 | 91.07% | 79.96% | 96.22% | ✅ |
| 服务层 | 82.65% | 64.37% | 82.19% | ⚠️ |
| 工具层 | 41.73% | 45.59% | 33.33% | ❌ |
| 组件层 | 0% | 0% | 0% | ❌ |
### 6.3 E2E 测试
| 项目 | 当前值 | 目标 | 状态 |
|------|--------|------|------|
| 浏览器 | 4/5 (Chromium/WebKit/Mobile Chrome/Mobile Safari) | 已安装 | ✅ |
| 测试结果 | 156/156 通过 | 全部通过 | ✅ |
---
## 七、验收标准
### 7.1 必须达标项
| 标准 | 阈值 | 验证方式 |
|------|------|---------|
| 单元测试通过率 | ≥ 90% | `npm run test` |
| 覆盖率 (指令) | ≥ 70% | `npm run test:coverage` |
| 覆盖率 (函数) | ≥ 70% | `npm run test:coverage` |
| 覆盖率 (分支) | ≥ 60% | `npm run test:coverage` |
| E2E 核心流程通过率 | ≥ 80% | `npm run test:e2e` |
| 算法交叉验证 | 100% | 专项测试 |
| 无 P0 缺陷 | 0 | 缺陷清单 |
### 7.2 推荐达标项
| 标准 | 阈值 | 验证方式 |
|------|------|---------|
| 算法执行时间 | < 1s | 性能测试 |
| 页面加载时间 | < 3s | E2E 计时 |
| 国际化覆盖 | 9/9 语言 | 手动验证 |
| 兼容性覆盖 | 3+ 浏览器 | Playwright 矩阵 |
---
## 八、风险与缓解措施
| 风险 | 影响 | 概率 | 缓解措施 |
|------|------|------|---------|
| E2E 测试与当前 UI 不匹配 | 高 | 高 | 重写 E2E 测试以匹配当前 UI |
| 组件覆盖率严重不足 | 中 | 高 | 优先补充核心组件测试 |
| 国际化 key 缺失 | 中 | 中 | 扫描 i18n 使用情况,补充缺失 key |
| 纯客户端架构安全风险低 | 低 | 低 | 基础安全验证即可 |
| 性能瓶颈在算法层 | 低 | 低 | 算法已通过 114 项交叉验证测试 |
---
## 九、测试报告模板
### 9.1 最终测试报告结构
```
1. 测试概述
- 测试范围、时间、环境
- 总体通过率
2. 测试结果汇总
- 单元测试:通过/总数
- E2E 测试:通过/总数
- 覆盖率:指令/分支/函数
3. 缺陷清单
- 按严重级别分类
- 每个缺陷的状态
4. 专项测试结果
- 性能测试
- 兼容性测试
- 安全验证
- 国际化验证
5. 修复建议
- 封版前必须修复项
- 后续迭代建议项
6. 验收结论
- 是否达到交付标准
- 签署确认
```