测试策略 - 图片OCR与智能文档管理系统
项目信息
- 项目名称: 图片OCR与智能文档管理系统
- 测试策略版本: 1.0
- 创建日期: 2026-02-21
- 测试方法论: TDD (测试驱动开发)
1. 测试金字塔
测试分布
| 测试类型 |
占比 |
数量(预估) |
运行时间 |
覆盖目标 |
| 单元测试 |
60% |
~200+ |
<30秒 |
80%+ |
| 集成测试 |
30% |
~80+ |
<2分钟 |
70%+ |
| E2E测试 |
10% |
~15+ |
<5分钟 |
关键路径 |
2. E2E 测试清单
2.1 用户认证流程
E2E-AUTH-001: 用户注册登录
- 优先级: P0
- 描述: 新用户注册并登录系统
- 步骤:
- 打开注册页面
/auth
- 输入有效信息并提交
- 验证跳转到工作台
/
- 刷新页面
E2E-AUTH-002: 登录失败处理
- 优先级: P0
- 描述: 输入错误凭证时显示错误信息
- 步骤:
- 打开登录页面
- 输入错误的用户名/密码
- 点击登录
- 预期: 显示"用户名或密码错误"提示
- 预期: 不跳转页面
E2E-AUTH-003: 登出功能
- 优先级: P0
- 描述: 用户登出后无法访问受保护页面
- 步骤:
- 登录后点击登出
- 尝试访问
/documents
2.2 图片上传与OCR流程
E2E-OCR-001: 成功OCR识别
- 优先级: P0
- 描述: 上传清晰图片并成功识别
- 步骤:
- 登录系统
- 点击"上传图片"按钮
- 选择测试图片(清晰文字图片)
- 等待OCR处理
- OCR完成后显示结果
- 预期: 显示识别的文字
- 预期: 置信度 > 80%
- 保存为文档
E2E-OCR-002: OCR失败处理
- 优先级: P0
- 描述: 模糊图片OCR失败时进入待处理列表
- 步骤:
- 上传模糊测试图片
- 等待OCR处理
- 处理完成但置信度 < 30%
- 预期: 不自动创建文档
- 预期: 显示"识别失败,请手动处理"提示
- 进入待处理图片页
/pending-images
- 点击"手动创建文档"
- 输入文字并保存
E2E-OCR-003: 图片增强重试
- 优先级: P1
- 描述: 对模糊图片增强后重新OCR
- 步骤:
- 在待处理列表选择图片
- 点击"图片增强"(旋转、裁剪)
- 点击"重新OCR"
- 等待处理
2.3 文档管理与AI分析流程
E2E-DOC-001: AI智能分析
- 优先级: P0
- 描述: 对文档进行AI分析,自动打标签和分类
- 步骤:
- 创建文档后点击"AI分析"按钮
- 等待AI处理
- AI完成后显示结果
- 预期: 显示3-5个推荐标签
- 预期: 显示推荐分类
- 预期: 标签和分类可手动修改
- 确认应用
E2E-DOC-002: AI创建新分类
- 优先级: P1
- 描述: AI识别新内容类型并创建新分类
- 步骤:
- 上传发票图片并OCR
- 点击AI分析
- AI识别为发票类型
- 预期: 推荐新分类"发票"
- 预期: 显示推荐图标 🧾
- 确认创建
2.4 待办事项管理流程
E2E-TODO-001: 创建待办事项
- 优先级: P0
- 描述: 从文档创建待办事项
- 步骤:
- 在文档详情页点击"转为待办"
- 设置优先级为"高"
- 设置截止日期为明天
- 保存
- 预期: 待办出现在"未完成"列表
- 预期: 显示高优先级标签
- 预期: 显示截止日期
E2E-TODO-002: 三状态流转
- 优先级: P0
- 描述: 待办从未完成→已完成→已确认
- 步骤:
- 在"未完成"列表点击"完成"
- 在"已完成"列表查看
- 点击"确认"
- 在"已确认"列表查看
E2E-TODO-003: 批量操作
- 优先级: P1
- 描述: 批量完成和确认待办
- 步骤:
- 在"未完成"列表选择3个待办
- 点击"批量完成"
- 在"已完成"列表全选
- 点击"批量确认"
2.5 完整用户旅程
E2E-JOURNEY-001: 截图→待办完整流程
- 优先级: P0
- 描述: 从截图到创建待办的完整流程
- 步骤:
- 用户登录
- 点击"系统截图"
- 截取包含待办事项的图片
- OCR识别成功
- 编辑OCR结果
- 保存为文档
- AI分析生成标签和分类
- 转为待办事项
- 设置优先级和截止日期
- 保存到未完成列表
- 预期: 全流程不超过5个主要操作
- 预期: 总耗时 < 2分钟
3. 集成测试清单
3.1 后端API集成
INT-API-001: 用户认证API
- 测试: 完整的注册登录流程
- 涉及组件: AuthController, UserService, JWTMiddleware, Database
- Mock: 密码加密、邮件服务
- 断言:
- 注册成功返回JWT token
- 密码使用bcrypt加密存储
- token验证中间件正确拦截
- 过期token被拒绝
INT-API-002: OCR处理API
- 测试: 图片上传到OCR完成的异步流程
- 涉及组件: OCRController, OCRService, OCRProvider, ImageStorage
- Mock: OCR provider响应
- 断言:
- 图片正确存储
- OCR任务异步处理
- 轮询接口返回正确状态
- 置信度低于阈值时不创建文档
INT-API-003: AI分析API
- 测试: AI分析调用的完整流程
- 涉及组件: AIController, AIService, AIProviders (GLM/MiniMax/DeepSeek)
- Mock: AI provider API响应
- 断言:
- 正确调用配置的AI provider
- 返回的标签和分类格式正确
- 新标签/新分类正确创建
- API失败时降级处理
INT-API-004: 待办状态流转API
- 测试: 待办状态变更的API调用
- 涉及组件: TodoController, TodoService, Database
- 断言:
- pending → completed 正确更新completed_at
- completed → confirmed 正确更新confirmed_at
- confirmed 不能回到其他状态
- 批量操作事务性正确
3.2 数据库集成
INT-DB-001: 数据模型关系
- 测试: 验证实体关系正确性
- 涉及组件: Prisma ORM, Database
- 断言:
- 用户级联删除正确
- Image.document_id 可为NULL
- Tag/Category usage_count 自动更新
- 事务回滚正确
INT-DB-002: 查询性能
- 测试: 验证查询效率
- 涉及组件: Database, Indexes
- 断言:
- 待处理图片查询 < 100ms
- 带筛选的文档查询 < 200ms
- 全文搜索 < 500ms
3.3 前端组件集成
INT-FE-001: 图片上传组件
- 测试: 拖拽上传、文件选择、预览
- 涉及组件: ImageUpload, OCRService, Toast
- Mock: OCR API
- 断言:
- 拖拽正确触发上传
- 文件类型验证
- 进度条正确显示
- 错误正确提示
INT-FE-002: 三状态待办列表
- 测试: Tab切换和状态流转
- 涉及组件: TodoList, TodoCard, TodoAPI
- Mock: Todo API
- 断言:
- Tab切换正确筛选数据
- 状态变更后列表正确更新
- 批量操作正确选中
- 撤销操作正确恢复状态
INT-FE-003: AI分析UI
- 测试: AI分析按钮和结果显示
- 涉及组件: AIAnalysisButton, TagSelector, CategorySelector
- Mock: AI API
- 断言:
- 加载状态正确显示
- 新标签/新分类高亮显示
- 确认后正确应用
- 取消后不应用
4. 单元测试清单
4.1 后端单元测试
UNIT-AUTH-001: 密码加密
- 测试:
UserService.hashPassword()
- 输入: "plaintext123"
- 预期输出: bcrypt hash (60字符)
- 边界: 空字符串、超长密码、特殊字符
UNIT-AUTH-002: JWT生成和验证
- 测试:
AuthService.generateToken(), verifyToken()
- 输入: user_id = "uuid-123"
- 预期输出: 有效JWT token
- 边界: 过期token、伪造token
UNIT-OCR-001: 置信度阈值判断
- 测试:
OCRService.shouldCreateDocument()
- 输入: confidence = 0.31, 阈值 = 0.3
- 预期输出: true
- 边界: 0.3, 0.29, 1.0, 0.0
UNIT-OCR-002: 图片质量检测
- 测试:
ImageQualityAnalyzer.assess()
- 输入: 模糊图片base64
- 预期输出: { quality: 'poor', score: < 0.5 }
- 边界: 清晰图片、全黑图片、超大图片
UNIT-AI-001: 标签提取
- 测试:
AIService.extractTags()
- 输入: "会议记录:讨论项目进度..."
- 预期输出: ["会议", "项目", "进度"]
- 边界: 空文本、纯数字、混合语言
UNIT-AI-002: 分类推荐
- 测试:
AIService.suggestCategory()
- 输入: 文本内容 + 现有分类列表
- 预期输出: 匹配的分类 或 新分类建议
- 边界: 无现有分类、完全匹配、部分匹配
UNIT-TODO-001: 待办状态验证
- 测试:
TodoService.validateStatusTransition()
- 输入: "pending" → "completed"
- 预期输出: true
- 边界: "confirmed" → "pending" (应返回false)
UNIT-TODO-002: 待办排序
- 测试:
TodoService.sortTodos()
- 输入: 待办列表 + 排序规则
- 预期输出: 按优先级和截止日期排序
- 边界: 空列表、相同优先级、无截止日期
4.2 前端单元测试
UNIT-FE-001: 图片预览组件
- 测试:
ImagePreview
- 输入: imageUrl = "http://..."
- 预期: 渲染img标签
- 边界: 加载失败、超大图片
UNIT-FE-002: 标签选择器
- 测试:
TagSelector
- 输入: tags = [], 新标签输入
- 预期: 调用onTagsChange
- 边界: 重复标签、空标签
UNIT-FE-003: 待办卡片
- 测试:
TodoCard
- 输入: todo对象
- 预期: 正确显示优先级颜色
- 边界: 无截止日期、已完成状态
UNIT-FE-004: OCR结果编辑器
- 测试:
OCResultEditor
- 输入: initialText, onChangeText
- 预期: 文本变更触发回调
- 边界: 超长文本、特殊字符
4.3 工具函数测试
UNIT-UTIL-001: 文件大小格式化
- 测试:
formatFileSize()
- 输入: 1024 → "1 KB"
- 输入: 1048576 → "1 MB"
- 边界: 0, 负数
UNIT-UTIL-002: 日期格式化
- 测试:
formatDate()
- 输入: "2024-01-15" → "1月15日"
- 边界: 无效日期、未来日期
UNIT-UTIL-003: 搜索高亮
- 测试:
highlightSearch()
- 输入: "hello world", "world"
- 预期: "hello world"
- 边界: 空搜索词、多个匹配
5. 测试矩阵
| 功能模块 |
单元测试 |
集成测试 |
E2E测试 |
覆盖率目标 |
关键测试 |
| 用户认证 |
15 |
4 |
3 |
85% |
登录/权限/数据隔离 |
| 图片上传 |
12 |
3 |
2 |
80% |
拖拽/格式验证/大小限制 |
| OCR处理 |
20 |
5 |
3 |
80% |
置信度/失败处理/重试 |
| 文档管理 |
18 |
4 |
2 |
80% |
CRUD/搜索/关联 |
| AI分析 |
25 |
6 |
2 |
75% |
标签/分类/新分类创建 |
| 待办管理 |
30 |
6 |
4 |
85% |
三状态/批量/流转 |
| 标签分类 |
15 |
3 |
1 |
75% |
创建/关联/统计 |
| 待处理图片 |
12 |
3 |
2 |
80% |
手动创建/增强/删除 |
| 配置管理 |
10 |
2 |
0 |
70% |
CRUD/测试配置 |
| 总计 |
157 |
36 |
19 |
80% |
- |
6. 测试数据管理
6.1 测试图片
| 类型 |
文件名 |
用途 |
预期结果 |
| 清晰中文 |
clear-zh.png |
基础OCR测试 |
置信度 > 90% |
| 清晰英文 |
clear-en.png |
英文OCR测试 |
置信度 > 90% |
| 模糊图片 |
blur.png |
失败处理测试 |
置信度 < 30% |
| 混合语言 |
mixed.png |
多语言测试 |
正确识别 |
| 手写文字 |
handwriting.png |
手写测试 |
置信度 50-70% |
| 发票样本 |
invoice.png |
类型识别测试 |
识别为发票 |
| 会议记录 |
meeting.png |
类型识别测试 |
识别为会议 |
| 超大图片 |
large.png |
大小限制测试 |
拒绝 (>10MB) |
6.2 测试用户
| 用户名 |
角色 |
用途 |
| test_user |
普通用户 |
常规测试 |
| admin_user |
管理员 |
管理功能测试 |
| new_user |
新用户 |
注册流程测试 |
6.3 Mock数据
- AI响应: 预设的标签和分类推荐
- OCR响应: 不同置信度的识别结果
- API响应: 成功/失败/超时场景
7. 性能测试
7.1 响应时间
| 操作 |
目标 |
测试方法 |
| 页面加载 |
<2s |
Lighthouse |
| API响应 |
<500ms |
k6 |
| OCR处理 |
<5s |
计时测试 |
| AI分析 |
<10s |
计时测试 |
7.2 并发测试
- 5个用户同时上传图片
- 10个并发API请求
- 数据库连接池压力测试
8. 测试环境
8.1 本地开发
8.2 CI/CD
9. 测试工具
9.1 后端
- 框架: Jest
- Mock: jest.mock
- 覆盖率: istanbul
- API测试: supertest
9.2 前端
- 框架: Vitest
- 组件测试: Testing Library
- Mock: vi.mock
- E2E: Playwright
9.3 工具
- 覆盖率: c8 / istanbul
- 性能: Lighthouse, k6
- Mock服务器: MSW (Mock Service Worker)
10. 测试质量标准
10.1 代码覆盖率
- 整体覆盖率: ≥ 80%
- 核心模块: ≥ 85%
- 工具函数: ≥ 90%
10.2 测试质量
- 所有测试独立且可重复
- 测试命名清晰描述意图
- 每个测试只有一个断言原因
- 边界条件都有测试覆盖
10.3 CI/CD门禁
- 所有测试必须通过
- 覆盖率不能下降
- Lint必须通过
- 构建时间 < 5分钟
11. 风险和缓解
| 风险 |
影响 |
缓解措施 |
| AI API不稳定 |
测试失败 |
使用Mock,减少真实调用 |
| OCR耗时 |
测试慢 |
使用预设结果,跳过真实OCR |
| 测试数据污染 |
测试失败 |
每次测试前清理数据库 |
| E2E测试不稳定 |
CI失败 |
增加重试机制,优化选择器 |
12. 下一步
测试策略已制定完成。下一步:
- 生成TDD开发计划 - 详细的Sprint计划
- 创建测试骨架 - 生成测试文件模板
- 开始TDD开发 - 红-绿-重构循环