test: 补充 Phase 3 专项测试并更新测试报告

新增性能基准测试、安全验证、国际化完整性验证等专项测试;
修复 E2E 测试选择器与当前 UI 不匹配问题;
补充多语言 locale 缺失的 key;
更新 Playwright 配置支持跨浏览器测试;
同步更新测试报告与 README 进度章节。

单元测试 408/408 通过,E2E 测试 39/39 通过(4 种浏览器),
专项测试 47/47 通过,整体覆盖率 77.5%。
This commit is contained in:
2026-08-12 20:10:39 +08:00
parent 0f8b29874f
commit 3a428d8977
28 changed files with 1542 additions and 1045 deletions
@@ -0,0 +1,340 @@
# 万事宜 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 单元测试
| 指标 | 当前值 | 目标 | 状态 |
|------|--------|------|------|
| 测试文件数 | 19 | ≥ 19 | ✅ |
| 测试用例数 | 361 | ≥ 350 | ✅ |
| 通过率 | 100% | ≥ 90% | ✅ |
| 执行时间 | 2.98s | < 5s | ✅ |
### 6.2 覆盖率
| 模块 | 指令覆盖率 | 分支覆盖率 | 函数覆盖率 | 状态 |
|------|-----------|-----------|-----------|------|
| 整体 | 77.50% | 69.09% | 76.20% | ⚠️ |
| 算法层 | 93.73% | 80.66% | 98.07% | ✅ |
| 服务层 | 81.12% | 63.87% | 81.42% | ⚠️ |
| 工具层 | 41.58% | 45.59% | 33.33% | ❌ |
| 组件层 | 0% | 0% | 0% | ❌ |
### 6.3 E2E 测试
| 项目 | 当前值 | 目标 | 状态 |
|------|--------|------|------|
| 浏览器 | 未安装 | 已安装 | ⏳ 安装中 |
| 测试结果 | 待运行 | - | ⏳ |
---
## 七、验收标准
### 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. 验收结论
- 是否达到交付标准
- 签署确认
```