基于Patrol的Flutter三端外卖订单全流程端到端集成测试方案咨询
基于Patrol的三端外卖全流程端到端集成测试方案
一、环境与依赖配置
先确保三个Flutter应用都完成Patrol基础集成:
- 在每个App的
pubspec.yaml中添加依赖:dev_dependencies: patrol: ^3.0.0 flutter_test: sdk: flutter - 配置测试入口:
- Android:在
android/app/src/androidTest/java/com/your/package/下创建MainActivityTest.java,初始化Patrol测试环境。 - iOS:在
ios/RunnerTests/RunnerTests.m中配置Patrol测试入口。
- Android:在
- 确保测试设备(模拟器/真机)已开启开发者模式,且三个App已安装到测试设备(或测试时自动安装)。
二、测试架构设计
采用模块化流程拆分思路,把全流程拆为独立操作模块,便于复用和维护:
- 商品创建模块(先锋端)
- 订单下单模块(顾客端)
- 先锋端接单模块
- 司机端配送完成模块
- 多端状态校验模块
所有模块通过Patrol的PatrolTester统一控制,实现跨App流程串联。
三、全流程测试代码示例
创建integration_test/full_order_flow_test.dart文件,编写完整测试用例:
import 'package:patrol/patrol.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { patrolTest( '完整外卖订单交付全流程测试', ($) async { // -------------------------- 步骤1:先锋端创建商品 -------------------------- await $.launchApp(appId: 'com.your.pioneer.app'); // 点击创建商品入口 await $.tap(find.byKey(const Key('create_product_btn'))); // 输入商品信息 await $.enterText(find.byKey(const Key('product_name_input')), '测试汉堡'); await $.enterText(find.byKey(const Key('product_price_input')), '29.9'); await $.tap(find.byKey(const Key('save_product_btn'))); // 等待商品同步完成 await $.waitFor(find.text('商品创建成功')); // -------------------------- 步骤2:顾客端下单 -------------------------- await $.launchApp(appId: 'com.your.customer.app'); // 搜索目标商品并加入购物车 await $.enterText(find.byKey(const Key('search_input')), '测试汉堡'); await $.tap(find.byKey(const Key('add_to_cart_btn'))); // 提交订单并模拟支付成功 await $.tap(find.byKey(const Key('checkout_btn'))); await $.tap(find.byKey(const Key('test_pay_btn'))); await $.waitFor(find.text('订单提交成功')); // -------------------------- 步骤3:先锋端接单 -------------------------- await $.switchToApp(appId: 'com.your.pioneer.app'); // 刷新订单列表并接单 await $.tap(find.byKey(const Key('refresh_orders_btn'))); await $.tap(find.byKey(const Key('accept_order_btn'))); await $.waitFor(find.text('订单已确认')); // -------------------------- 步骤4:司机端配送完成 -------------------------- await $.launchApp(appId: 'com.your.driver.app'); // 刷新待接单列表并接单 await $.tap(find.byKey(const Key('refresh_orders_btn'))); await $.tap(find.byKey(const Key('accept_delivery_btn'))); // 模拟配送流程:到达商家 -> 取货 -> 送达 await $.tap(find.byKey(const Key('arrive_store_btn'))); await $.tap(find.byKey(const Key('pickup_order_btn'))); await $.tap(find.byKey(const Key('deliver_order_btn'))); await $.waitFor(find.text('订单已完成')); // -------------------------- 步骤5:多端状态校验 -------------------------- // 校验顾客端订单状态 await $.switchToApp(appId: 'com.your.customer.app'); await $.tap(find.byKey(const Key('my_orders_btn'))); expect(find.text('已完成'), findsOneWidget); // 校验先锋端订单状态 await $.switchToApp(appId: 'com.your.pioneer.app'); await $.tap(find.byKey(const Key('completed_orders_btn'))); expect(find.text('已完成'), findsOneWidget); // 校验司机端订单状态 await $.switchToApp(appId: 'com.your.driver.app'); await $.tap(find.byKey(const Key('completed_deliveries_btn'))); expect(find.text('已完成'), findsOneWidget); }, ); }
四、关键细节处理
- 多App管理:通过
$.launchApp(appId: 'xxx')启动指定App,$.switchToApp(appId: 'xxx')在已启动App间切换,需确保每个App的包名(Android)/Bundle ID(iOS)准确。 - 测试数据隔离:每次测试前调用后端测试接口重置数据(如清空商品、订单表),或使用本地数据库的测试实例,避免脏数据干扰。
- 异步操作处理:用
$.waitFor()等待页面加载、数据同步,针对耗时操作可设置超时时间(如timeout: const Duration(seconds: 10))。 - 第三方服务模拟:支付、定位等第三方服务用测试桩替代,比如在测试环境直接触发支付成功回调,或设置模拟坐标。
五、测试执行与CI集成
- 本地执行:在项目根目录运行命令:
patrol test --target integration_test/full_order_flow_test.dart --device <设备ID> - CI/CD集成:将测试脚本加入GitHub Actions/GitLab CI流程,配置模拟器/真机环境,自动执行测试并生成报告,可使用
leancodepl/patrol官方Action简化配置。
六、维护建议
- 将重复操作封装为工具函数(如
createProduct(PatrolTester $)、placeOrder(PatrolTester $)),减少代码冗余。 - 定期更新Patrol版本,适配Flutter新版本特性。
- 扩展异常流程测试用例(如下单后取消、配送超时等),覆盖更多场景。
内容的提问来源于stack exchange,提问作者Abd Alazeez
相关产品推荐
相关产品推荐

