You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中对flutter_local_notifications通知进行端到端测试?

用Integration Test测试Flutter本地通知场景

完全可以用integration_test包实现你提到的这些端到端测试场景,下面是具体的实现思路和关键代码示例:

场景1:调度通知后关闭应用,点击通知验证跳转

  • 核心步骤:
    1. 初始化flutter_local_notifications,调度10秒后触发的通知并携带跳转标识payload。
    2. 模拟关闭应用(需结合原生平台API实现)。
    3. 等待通知触发后,借助原生测试工具模拟点击通知。
    4. 验证应用重启后导航到预期页面。

关键代码片段:

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:应用前台时点击通知验证跳转

  • 核心步骤:
    1. 初始化通知插件并调度10秒后的通知。
    2. 保持应用前台状态,等待通知触发。
    3. 监听通知点击回调或用原生工具模拟点击。
    4. 验证导航到预期页面。

关键代码片段:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:03:20