485 lines
14 KiB
Markdown
485 lines
14 KiB
Markdown
# Phase 4 端到端 (E2E) 测试计划
|
||
|
||
**阶段**: Week 11-12 - 端到端测试
|
||
**测试负责人**: 测试工程师
|
||
**更新日期**: 2026-03-07
|
||
**状态**: 🟡 进行中
|
||
|
||
---
|
||
|
||
## 📋 E2E 测试概述
|
||
|
||
端到端测试验证完整用户流程,确保从用户注册到项目分享的整个链路正常工作。
|
||
|
||
### 测试范围
|
||
|
||
1. **完整用户流程**: 注册 → 登录 → 创建项目 → 编辑 → 保存 → 分享
|
||
2. **边界条件**: 弱网/断网/低电量/存储不足
|
||
3. **崩溃率测试**: Crashlytics 集成与监控
|
||
4. **数据一致性**: 本地存储与云同步一致性
|
||
|
||
---
|
||
|
||
## 🔄 完整用户流程测试
|
||
|
||
### E2E-001: 新用户完整流程
|
||
|
||
**优先级**: P0
|
||
**预计耗时**: 15 分钟
|
||
|
||
**前置条件**:
|
||
- 未注册的新设备
|
||
- 网络连接正常
|
||
|
||
**测试步骤**:
|
||
|
||
| 步骤 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 打开应用 | 显示欢迎页面 | ⏳ |
|
||
| 2 | 点击"注册"按钮 | 进入注册页面 | ⏳ |
|
||
| 3 | 输入邮箱、密码、昵称 | 表单验证通过 | ⏳ |
|
||
| 4 | 点击"注册" | 注册成功,自动登录 | ⏳ |
|
||
| 5 | 进入首页 | 显示项目列表(空) | ⏳ |
|
||
| 6 | 点击"新建项目" | 弹出创建对话框 | ⏳ |
|
||
| 7 | 输入项目名称"我的第一个电路" | 名称验证通过 | ⏳ |
|
||
| 8 | 选择模板(空白/示例) | 模板预览显示 | ⏳ |
|
||
| 9 | 点击"创建" | 项目创建成功,进入编辑器 | ⏳ |
|
||
| 10 | 从元件库选择电阻 | 元件库展开,显示电阻 | ⏳ |
|
||
| 11 | 点击电阻,放置到画布 | 电阻出现在画布上 | ⏳ |
|
||
| 12 | 修改电阻属性(位号 R1, 值 10k) | 属性面板更新 | ⏳ |
|
||
| 13 | 添加第二个元件(电容) | 电容放置成功 | ⏳ |
|
||
| 14 | 切换到走线模式 | 工具栏状态更新 | ⏳ |
|
||
| 15 | 连接两个元件引脚 | 连线绘制成功 | ⏳ |
|
||
| 16 | 点击"保存" | 保存成功提示 | ⏳ |
|
||
| 17 | 返回项目列表 | 项目显示在列表中 | ⏳ |
|
||
| 18 | 删除项目 | 确认删除,项目消失 | ⏳ |
|
||
| 19 | 点击"分享" | 分享菜单弹出 | ⏳ |
|
||
| 20 | 选择"导出为 JSON" | 文件导出成功 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 所有步骤顺利完成
|
||
- [ ] 无崩溃、无异常
|
||
- [ ] 数据持久化正确
|
||
- [ ] UI 响应流畅
|
||
|
||
---
|
||
|
||
### E2E-002: 老用户登录流程
|
||
|
||
**优先级**: P0
|
||
**预计耗时**: 10 分钟
|
||
|
||
**前置条件**:
|
||
- 已有注册账号
|
||
- 设备已卸载重装
|
||
|
||
**测试步骤**:
|
||
|
||
| 步骤 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 打开应用 | 显示登录页面 | ⏳ |
|
||
| 2 | 输入已注册邮箱 | 邮箱格式验证 | ⏳ |
|
||
| 3 | 输入密码 | 密码可见性切换 | ⏳ |
|
||
| 4 | 点击"登录" | 登录成功,进入首页 | ⏳ |
|
||
| 5 | 查看项目列表 | 显示历史项目 | ⏳ |
|
||
| 6 | 打开之前创建的项目 | 项目内容完整加载 | ⏳ |
|
||
| 7 | 验证元件和连线 | 与保存时一致 | ⏳ |
|
||
| 8 | 退出登录 | 返回登录页面 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 登录成功
|
||
- [ ] 云同步数据完整
|
||
- [ ] 退出登录正常
|
||
|
||
---
|
||
|
||
### E2E-003: 项目编辑完整流程
|
||
|
||
**优先级**: P0
|
||
**预计耗时**: 20 分钟
|
||
|
||
**前置条件**:
|
||
- 已登录
|
||
- 已有测试项目
|
||
|
||
**测试步骤**:
|
||
|
||
| 步骤 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 打开项目 | 编辑器加载成功 | ⏳ |
|
||
| 2 | 添加 10 个电阻 | 所有电阻显示正常 | ⏳ |
|
||
| 3 | 添加 10 个电容 | 所有电容显示正常 | ⏳ |
|
||
| 4 | 添加 5 个 IC | IC 引脚显示正确 | ⏳ |
|
||
| 5 | 批量选择元件 | 多选框显示 | ⏳ |
|
||
| 6 | 批量移动元件 | 所有元件同步移动 | ⏳ |
|
||
| 7 | 撤销操作 (Ctrl+Z) | 回到上一步状态 | ⏳ |
|
||
| 8 | 重做操作 (Ctrl+Y) | 恢复撤销内容 | ⏳ |
|
||
| 9 | 删除部分元件 | 元件消失 | ⏳ |
|
||
| 10 | 撤销删除 | 元件恢复 | ⏳ |
|
||
| 11 | 添加连线 20 条 | 所有连线显示 | ⏳ |
|
||
| 12 | 修改连线属性 | 颜色/粗细更新 | ⏳ |
|
||
| 13 | 添加网络标签 | 标签显示正确 | ⏳ |
|
||
| 14 | 添加电源符号 | 电源符号显示 | ⏳ |
|
||
| 15 | 添加接地符号 | 接地符号显示 | ⏳ |
|
||
| 16 | 运行 DRC 检查 | 显示检查结果 | ⏳ |
|
||
| 17 | 修复 DRC 错误 | 错误消失 | ⏳ |
|
||
| 18 | 保存项目 | 保存成功 | ⏳ |
|
||
| 19 | 关闭项目 | 返回项目列表 | ⏳ |
|
||
| 20 | 重新打开项目 | 所有修改保留 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 所有编辑操作正常
|
||
- [ ] 撤销/重做功能正确
|
||
- [ ] 数据持久化完整
|
||
- [ ] DRC 检查准确
|
||
|
||
---
|
||
|
||
### E2E-004: 文件导入导出流程
|
||
|
||
**优先级**: P1
|
||
**预计耗时**: 15 分钟
|
||
|
||
**前置条件**:
|
||
- 已登录
|
||
- 有示例文件
|
||
|
||
**测试步骤**:
|
||
|
||
| 步骤 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 点击"导入" | 文件选择器打开 | ⏳ |
|
||
| 2 | 选择 JSON 文件 | 文件解析成功 | ⏳ |
|
||
| 3 | 验证导入内容 | 元件和连线正确 | ⏳ |
|
||
| 4 | 保存导入的项目 | 保存成功 | ⏳ |
|
||
| 5 | 导出为 JSON | 文件生成成功 | ⏳ |
|
||
| 6 | 导出为 Tile 格式 | 文件生成成功 | ⏳ |
|
||
| 7 | 导出为 PDF | PDF 生成成功 | ⏳ |
|
||
| 8 | 导出为图片 (PNG) | 图片生成成功 | ⏳ |
|
||
| 9 | 重新导入导出的 JSON | 内容一致 | ⏳ |
|
||
| 10 | 验证数据完整性 | 无数据丢失 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 所有格式导入成功
|
||
- [ ] 所有格式导出成功
|
||
- [ ] 数据完整性保证
|
||
- [ ] 文件格式正确
|
||
|
||
---
|
||
|
||
## 🔌 边界条件测试
|
||
|
||
### E2E-005: 弱网环境测试
|
||
|
||
**优先级**: P1
|
||
**预计耗时**: 30 分钟
|
||
|
||
**测试场景**:
|
||
|
||
| 场景 | 网络条件 | 操作 | 预期结果 | 状态 |
|
||
|------|---------|------|---------|------|
|
||
| 1 | 3G (慢速) | 登录 | 登录成功,时间可接受 | ⏳ |
|
||
| 2 | 3G (慢速) | 同步项目 | 同步成功,显示进度 | ⏳ |
|
||
| 3 | 2G (极慢) | 保存项目 | 保存成功或提示超时 | ⏳ |
|
||
| 4 | 网络波动 | 编辑中网络切换 | 不崩溃,数据不丢失 | ⏳ |
|
||
| 5 | 请求超时 | 云同步 | 显示超时提示,可重试 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 弱网下不崩溃
|
||
- [ ] 有明确的加载/超时提示
|
||
- [ ] 支持重试机制
|
||
- [ ] 数据不丢失
|
||
|
||
---
|
||
|
||
### E2E-006: 断网环境测试
|
||
|
||
**优先级**: P0
|
||
**预计耗时**: 30 分钟
|
||
|
||
**测试场景**:
|
||
|
||
| 场景 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 断网打开应用 | 应用正常启动 | ⏳ |
|
||
| 2 | 断网登录 | 提示网络不可用 | ⏳ |
|
||
| 3 | 断网创建项目 | 本地创建成功 | ⏳ |
|
||
| 4 | 断网编辑项目 | 编辑功能正常 | ⏳ |
|
||
| 5 | 断网保存项目 | 保存到本地成功 | ⏳ |
|
||
| 6 | 断网查看历史项目 | 显示已缓存项目 | ⏳ |
|
||
| 7 | 恢复网络 | 自动检测网络恢复 | ⏳ |
|
||
| 8 | 网络恢复后同步 | 提示有未同步数据 | ⏳ |
|
||
| 9 | 执行同步 | 数据同步到云端 | ⏳ |
|
||
| 10 | 验证同步结果 | 云端数据完整 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 断网不崩溃
|
||
- [ ] 本地功能完整可用
|
||
- [ ] 网络恢复自动同步
|
||
- [ ] 数据一致性保证
|
||
|
||
---
|
||
|
||
### E2E-007: 低电量模式测试
|
||
|
||
**优先级**: P2
|
||
**预计耗时**: 20 分钟
|
||
|
||
**测试场景**:
|
||
|
||
| 场景 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 开启低电量模式 | 应用正常启动 | ⏳ |
|
||
| 2 | 低电量下编辑 | 功能正常,动画可能减少 | ⏳ |
|
||
| 3 | 低电量下保存 | 保存成功 | ⏳ |
|
||
| 4 | 电量 <10% | 显示低电量提示 | ⏳ |
|
||
| 5 | 电量 <5% | 建议保存并退出 | ⏳ |
|
||
| 6 | 自动关机前 | 自动保存当前项目 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 低电量模式兼容
|
||
- [ ] 有电量提示
|
||
- [ ] 自动保存保护数据
|
||
|
||
---
|
||
|
||
### E2E-008: 存储空间不足测试
|
||
|
||
**优先级**: P1
|
||
**预计耗时**: 20 分钟
|
||
|
||
**测试场景**:
|
||
|
||
| 场景 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 存储空间 <100MB | 应用正常启动 | ⏳ |
|
||
| 2 | 尝试保存大项目 | 提示空间不足 | ⏳ |
|
||
| 3 | 清理空间后保存 | 保存成功 | ⏳ |
|
||
| 4 | 缓存清理功能 | 可清理缓存释放空间 | ⏳ |
|
||
| 5 | 云同步释放本地 | 可选择只保留云端 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 空间不足有明确提示
|
||
- [ ] 提供清理建议
|
||
- [ ] 不崩溃、不数据损坏
|
||
|
||
---
|
||
|
||
### E2E-009: 应用中断测试
|
||
|
||
**优先级**: P1
|
||
**预计耗时**: 30 分钟
|
||
|
||
**测试场景**:
|
||
|
||
| 场景 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 编辑中来电话 | 应用进入后台 | ⏳ |
|
||
| 2 | 接听电话后返回 | 应用恢复,数据完整 | ⏳ |
|
||
| 3 | 编辑中切换应用 | 应用进入后台 | ⏳ |
|
||
| 4 | 返回应用 | 恢复编辑状态 | ⏳ |
|
||
| 5 | 编辑中锁屏 | 应用进入后台 | ⏳ |
|
||
| 6 | 解锁返回 | 恢复编辑状态 | ⏳ |
|
||
| 7 | 编辑中系统通知 | 通知显示不干扰 | ⏳ |
|
||
| 8 | 后台时间过长 | 可能需要重新登录 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 中断不丢失数据
|
||
- [ ] 恢复状态正确
|
||
- [ ] 自动保存触发
|
||
|
||
---
|
||
|
||
## 💥 崩溃率测试
|
||
|
||
### E2E-010: Crashlytics 集成
|
||
|
||
**优先级**: P0
|
||
**预计耗时**: 60 分钟
|
||
|
||
**集成步骤**:
|
||
|
||
```yaml
|
||
# pubspec.yaml 添加依赖
|
||
dependencies:
|
||
firebase_core: ^2.24.0
|
||
firebase_crashlytics: ^3.4.0
|
||
```
|
||
|
||
```dart
|
||
// main.dart 初始化
|
||
import 'package:firebase_core/firebase_core.dart';
|
||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||
|
||
void main() async {
|
||
WidgetsFlutterBinding.ensureInitialized();
|
||
await Firebase.initializeApp();
|
||
|
||
// 配置 Crashlytics
|
||
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
|
||
|
||
// 捕获未捕获的异常
|
||
PlatformDispatcher.instance.onError = (error, stack) {
|
||
FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
|
||
return true;
|
||
};
|
||
|
||
runApp(MyApp());
|
||
}
|
||
```
|
||
|
||
**测试验证**:
|
||
|
||
| 测试项 | 操作 | 预期结果 | 状态 |
|
||
|-------|------|---------|------|
|
||
| 1 | 触发 Dart 异常 | Crashlytics 记录 | ⏳ |
|
||
| 2 | 触发原生崩溃 | Crashlytics 记录 | ⏳ |
|
||
| 3 | 查看 Firebase 控制台 | 崩溃报告显示 | ⏳ |
|
||
| 4 | 崩溃堆栈分析 | 堆栈信息完整 | ⏳ |
|
||
| 5 | 崩溃用户统计 | 用户 ID 关联 | ⏳ |
|
||
| 6 | 崩溃版本分布 | 版本信息正确 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] Crashlytics 集成成功
|
||
- [ ] 崩溃自动上报
|
||
- [ ] 堆栈信息完整
|
||
- [ ] 崩溃率 <0.1%
|
||
|
||
---
|
||
|
||
### E2E-011: 压力测试
|
||
|
||
**优先级**: P1
|
||
**预计耗时**: 60 分钟
|
||
|
||
**测试场景**:
|
||
|
||
| 场景 | 操作 | 预期结果 | 状态 |
|
||
|------|------|---------|------|
|
||
| 1 | 快速连续点击 | 不崩溃,有防抖 | ⏳ |
|
||
| 2 | 大量元件 (5000+) | 可加载,性能下降可接受 | ⏳ |
|
||
| 3 | 快速缩放拖拽 | 不崩溃,可能掉帧 | ⏳ |
|
||
| 4 | 长时间运行 (1h+) | 内存不泄漏 | ⏳ |
|
||
| 5 | 多次保存加载 | 数据一致 | ⏳ |
|
||
| 6 | 多任务切换 | 应用状态保持 | ⏳ |
|
||
|
||
**验收标准**:
|
||
- [ ] 压力下不崩溃
|
||
- [ ] 内存稳定
|
||
- [ ] 性能可接受
|
||
|
||
---
|
||
|
||
## 📊 测试结果汇总
|
||
|
||
### E2E 测试进度
|
||
|
||
| 测试用例 | 优先级 | 状态 | 通过率 | 备注 |
|
||
|---------|-------|------|-------|------|
|
||
| E2E-001 新用户流程 | P0 | ⏳ 待测 | - | - |
|
||
| E2E-002 老用户登录 | P0 | ⏳ 待测 | - | - |
|
||
| E2E-003 项目编辑 | P0 | ⏳ 待测 | - | - |
|
||
| E2E-004 导入导出 | P1 | ⏳ 待测 | - | - |
|
||
| E2E-005 弱网环境 | P1 | ⏳ 待测 | - | - |
|
||
| E2E-006 断网环境 | P0 | ⏳ 待测 | - | - |
|
||
| E2E-007 低电量 | P2 | ⏳ 待测 | - | - |
|
||
| E2E-008 存储不足 | P1 | ⏳ 待测 | - | - |
|
||
| E2E-009 应用中断 | P1 | ⏳ 待测 | - | - |
|
||
| E2E-010 Crashlytics | P0 | ⏳ 待测 | - | - |
|
||
| E2E-011 压力测试 | P1 | ⏳ 待测 | - | - |
|
||
|
||
### 总体统计
|
||
|
||
```
|
||
总测试用例:11
|
||
已完成:0 (0%)
|
||
进行中:0 (0%)
|
||
待测试:11 (100%)
|
||
|
||
P0 用例:5 - 完成 0 (0%)
|
||
P1 用例:5 - 完成 0 (0%)
|
||
P2 用例:1 - 完成 0 (0%)
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 自动化测试脚本
|
||
|
||
### Flutter Integration Test
|
||
|
||
```dart
|
||
// test/e2e/user_flow_test.dart
|
||
import 'package:flutter_test/flutter_test.dart';
|
||
import 'package:integration_test/integration_test.dart';
|
||
|
||
void main() {
|
||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||
|
||
group('E2E User Flow Tests', () {
|
||
testWidgets('Complete new user flow', (tester) async {
|
||
// 启动应用
|
||
await tester.pumpWidget(MyApp());
|
||
await tester.pumpAndSettle();
|
||
|
||
// 注册
|
||
await tester.tap(find.text('注册'));
|
||
await tester.pumpAndSettle();
|
||
|
||
await tester.enterText(
|
||
find.byType(TextFormField).at(0),
|
||
'test@example.com',
|
||
);
|
||
await tester.enterText(
|
||
find.byType(TextFormField).at(1),
|
||
'password123',
|
||
);
|
||
|
||
await tester.tap(find.text('注册'));
|
||
await tester.pumpAndSettle();
|
||
|
||
// 验证登录成功
|
||
expect(find.text('项目列表'), findsOneWidget);
|
||
});
|
||
});
|
||
}
|
||
```
|
||
|
||
### 运行自动化测试
|
||
|
||
```bash
|
||
# 运行 E2E 测试
|
||
flutter test integration_test/e2e/
|
||
|
||
# 生成测试报告
|
||
flutter test --coverage
|
||
```
|
||
|
||
---
|
||
|
||
## 📅 测试执行计划
|
||
|
||
### Week 11
|
||
|
||
| 日期 | 测试内容 | 负责人 |
|
||
|------|---------|-------|
|
||
| 周一 | E2E-001, E2E-002 (用户流程) | 测试工程师 |
|
||
| 周二 | E2E-003 (项目编辑) | 测试工程师 |
|
||
| 周三 | E2E-004, E2E-005 (导入导出/弱网) | 测试工程师 |
|
||
| 周四 | E2E-006, E2E-007 (断网/低电量) | 测试工程师 |
|
||
| 周五 | E2E-008, E2E-009 (存储/中断) | 测试工程师 |
|
||
|
||
### Week 12
|
||
|
||
| 日期 | 测试内容 | 负责人 |
|
||
|------|---------|-------|
|
||
| 周一 | E2E-010 (Crashlytics 集成) | 测试工程师 |
|
||
| 周二 | E2E-011 (压力测试) | 测试工程师 |
|
||
| 周三 | 问题修复验证 | 测试工程师 |
|
||
| 周四 | 回归测试 | 测试工程师 |
|
||
| 周五 | E2E 测试报告 | 测试工程师 |
|
||
|
||
---
|
||
|
||
**文档维护**: 测试工程师
|
||
**最后更新**: 2026-03-07
|