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

Flutter中使用GoRouter如何编写单元测试实现行覆盖率

GoRouter配置单元测试编写及行覆盖率覆盖方案

前置准备

  • 确保项目dev_dependencies中已引入flutter_test(Flutter SDK默认内置,无需额外指定版本),go_router版本与项目生产依赖版本保持一致即可。
  • 测试文件统一存放于项目根目录的test/文件夹下,本次测试文件可命名为router_test.dart。

测试代码实现

以下测试用例会完整覆盖你提供的路由配置所有代码行,同时校验路由配置的正确性:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:go_router/go_router.dart';
import 'package:moxify_app/src/features/features.dart';
// 替换为你项目中路由配置文件的实际导包路径
import 'package:moxify_app/router.dart';

void main() {
  group('GoRouter路由配置测试', () {
    test('全局路由基础配置校验', () {
      // 覆盖debugLogDiagnostics配置行
      expect(router.debugLogDiagnostics, true);
      // 覆盖routes列表初始化逻辑
      expect(router.configuration.routes.length, 2);
    });

    testWidgets('根路径/ 正确映射登录页', (tester) async {
      await tester.pumpWidget(
        MaterialApp.router(
          routerConfig: router,
        ),
      );
      await tester.pumpAndSettle();

      // 校验初始路由加载的是LoginPage
      expect(find.byType(LoginPage), findsOneWidget);

      // 校验路由name、path配置匹配
      final loginRoute = router.configuration.routes
          .whereType<GoRoute>()
          .firstWhere((route) => route.path == '/');
      expect(loginRoute.name, 'login');

      // 覆盖login路由builder逻辑行
      final currentContext = tester.element(find.byType(LoginPage));
      expect(loginRoute.builder!(currentContext, router.state), isA<LoginPage>());
    });

    testWidgets('/home路径正确映射首页', (tester) async {
      // 主动跳转至/home路由
      router.go('/home');
      await tester.pumpAndSettle();

      // 校验跳转后加载的是HomePage
      expect(find.byType(HomePage), findsOneWidget);

      // 校验路由name、path配置匹配
      final homeRoute = router.configuration.routes
          .whereType<GoRoute>()
          .firstWhere((route) => route.path == '/home');
      expect(homeRoute.name, 'home');

      // 覆盖home路由builder逻辑行
      final currentContext = tester.element(find.byType(HomePage));
      expect(homeRoute.builder!(currentContext, router.state), isA<HomePage>());
    });
  });
}

覆盖率统计操作

  • 在项目根目录执行以下命令运行测试并生成覆盖率原始数据:
    flutter test --coverage
    
  • 生成可视化覆盖率报告:
    • macOS/Linux系统:先通过brew/apt安装lcov工具,执行genhtml coverage/lcov.info -o coverage/html,打开生成的coverage/html/index.html即可查看逐行覆盖情况
    • Windows系统:安装VS Code的Coverage Gutters插件,加载测试生成的coverage/lcov.info文件,即可在代码文件中直接看到已覆盖/未覆盖的行标记

注意事项

  • 如果HomePage、LoginPage存在依赖注入逻辑,需要在测试的pumpWidget执行前完成mock依赖的初始化,避免运行时报找不到注入对象的错误
  • 示例代码中的导包路径需要替换为你项目的实际路径,不要直接复制使用

内容的提问来源于stack exchange,提问作者Mosh Mobile Software Engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:51:22