14 KiB
14 KiB
Phase 4 端到端 (E2E) 测试计划
阶段: Week 11-12 - 端到端测试
测试负责人: 测试工程师
更新日期: 2026-03-07
状态: 🟡 进行中
📋 E2E 测试概述
端到端测试验证完整用户流程,确保从用户注册到项目分享的整个链路正常工作。
测试范围
- 完整用户流程: 注册 → 登录 → 创建项目 → 编辑 → 保存 → 分享
- 边界条件: 弱网/断网/低电量/存储不足
- 崩溃率测试: Crashlytics 集成与监控
- 数据一致性: 本地存储与云同步一致性
🔄 完整用户流程测试
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 分钟
集成步骤:
# pubspec.yaml 添加依赖
dependencies:
firebase_core: ^2.24.0
firebase_crashlytics: ^3.4.0
// 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
// 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);
});
});
}
运行自动化测试
# 运行 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