mobile-eda/docs/PHASE4_E2E_TEST_PLAN.md

14 KiB
Raw Permalink Blame History

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 分钟

集成步骤:

# 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