如何在Flutter中对flutter_local_notifications通知进行端到端测试?
用Integration Test测试Flutter本地通知场景
完全可以用integration_test包实现你提到的这些端到端测试场景,下面是具体的实现思路和关键代码示例:
场景1:调度通知后关闭应用,点击通知验证跳转
- 核心步骤:
- 初始化
flutter_local_notifications,调度10秒后触发的通知并携带跳转标识payload。 - 模拟关闭应用(需结合原生平台API实现)。
- 等待通知触发后,借助原生测试工具模拟点击通知。
- 验证应用重启后导航到预期页面。
- 初始化
关键代码片段:
testWidgets('关闭应用后点击通知跳转至目标页面', (tester) async { final notificationsPlugin = FlutterLocalNotificationsPlugin(); await notificationsPlugin.initialize( InitializationSettings( android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: DarwinInitializationSettings(), ), onDidReceiveNotificationResponse: (response) { if (response.payload == 'target_page') { Navigator.of(tester.element(find.byType(MaterialApp))).pushNamed('/target'); } }, ); // 调度10秒后的通知 await notificationsPlugin.zonedSchedule( 0, '测试通知', '点击打开目标页面', tz.TZDateTime.now(tz.local).add(Duration(seconds: 10)), NotificationDetails( android: AndroidNotificationDetails( 'test_channel', 'Test Channel', importance: Importance.max, ), iOS: DarwinNotificationDetails(), ), payload: 'target_page', androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, ); // 模拟关闭应用(Android示例,需通过MethodChannel调用原生方法) await tester.runAsync(() async { await MethodChannel('com.example/app_control').invokeMethod('closeApp'); }); // 等待通知触发并完成点击模拟 await Future.delayed(Duration(seconds: 12)); // 验证页面跳转结果 expect(find.text('目标页面'), findsOneWidget); });
场景2:应用前台时点击通知验证跳转
- 核心步骤:
- 初始化通知插件并调度10秒后的通知。
- 保持应用前台状态,等待通知触发。
- 监听通知点击回调或用原生工具模拟点击。
- 验证导航到预期页面。
关键代码片段:
testWidgets('前台时点击通知跳转至目标页面', (tester) async { final notificationsPlugin = FlutterLocalNotificationsPlugin(); String? receivedPayload; await notificationsPlugin.initialize( InitializationSettings( android: AndroidInitializationSettings('@mipmap/ic_launcher'), iOS: DarwinInitializationSettings(), ), onDidReceiveNotificationResponse: (response) { receivedPayload = response.payload; Navigator.of(tester.element(find.byType(MaterialApp))).pushNamed('/target'); }, ); // 调度通知 await notificationsPlugin.zonedSchedule( 1, '前台测试通知', '点击打开目标页面', tz.TZDateTime.now(tz.local).add(Duration(seconds: 10)), NotificationDetails( android: AndroidNotificationDetails( 'test_channel', 'Test Channel', importance: Importance.max, ), iOS: DarwinNotificationDetails(), ), payload: 'target_page', androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, ); // 等待通知触发并处理点击 await Future.delayed(Duration(seconds: 11)); // 验证payload和页面跳转结果 expect(receivedPayload, 'target_page'); expect(find.text('目标页面'), findsOneWidget); });
其他可测试场景
- 重复通知测试:调度重复触发的通知,验证多次点击后的跳转行为一致性。
- 权限流程测试:模拟用户允许/拒绝通知权限,验证通知调度是否正常。
- 锁屏通知测试:验证高优先级通知在锁屏状态下的展示和点击跳转逻辑。
注意事项
- 原生平台依赖:Android需配合
UiAutomator,iOS需配合XCTest实现通知点击、应用关闭等操作。 - 时间等待:测试中需预留足够时间让通知触发,避免设备性能差异导致测试失败。
- 渠道配置:Android 8.0+需提前创建通知渠道,否则通知无法正常展示。
内容的提问来源于stack exchange,提问作者Maciej Pszczolinski
相关产品推荐
相关产品推荐

