# 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