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文件,即可在代码文件中直接看到已覆盖/未覆盖的行标记
- macOS/Linux系统:先通过brew/apt安装lcov工具,执行
注意事项
- 如果HomePage、LoginPage存在依赖注入逻辑,需要在测试的
pumpWidget执行前完成mock依赖的初始化,避免运行时报找不到注入对象的错误 - 示例代码中的导包路径需要替换为你项目的实际路径,不要直接复制使用
内容的提问来源于stack exchange,提问作者Mosh Mobile Software Engineer
相关产品推荐
相关产品推荐

