测试
Flutter 新闻工具包应用程序开箱即带有 100% 的测试覆盖率。测试位于与您的源代码相关的并行文件结构中,驻留在镜像源代码 lib
目录的 test
目录中。测试使用 Very Good Workflows 在您的应用程序上自动运行。
对您的源代码所做的更改,例如删除广告,可能会降低测试覆盖率或导致现有测试失败。我们建议在您的应用程序中保持 100% 的测试覆盖率,以支持稳定性和可扩展性,但是如果您放弃 100% 的测试覆盖率,您的应用程序功能不会受到损害。
为了在您的应用程序中支持 100% 的测试覆盖率,请确保您的测试捕获您对应用程序行为所做的任何更改。例如,如果您实现了一个新的小部件 your_widget.dart
,请创建一个相应的 your_widget_test.dart
文件,正确测试新小部件的行为。
您的 Flutter 应用程序的测试套件包含 bloc、单元和小部件测试。
Flutter 社区提供了 优秀的测试资源,指导您为应用程序开发有效的测试。
单元测试
单元测试评估您的代码库中的单个方法、函数或类。您应该测试您的单元在它可能执行的所有条件下是否行为正确。
例如,news_repository_test.dart
测试 NewsRepository
类是否可以被实例化、正确处理错误情况,以及在成功和错误条件下是否正确执行其行为。
Flutter 的 单元测试简介 配方提供了有关单元测试的更多信息。
小部件测试
小部件测试使用支持 UI 交互和行为的测试环境,验证单个小部件在 Flutter 框架内是否行为正确。
例如,以下来自 bottom_nav_bar_test.dart
的测试检查用户与 BottomNavBar
小部件交互时是否执行了正确的行为
testWidgets('calls onTap when navigation bar item is tapped', (tester) async {
final completer = Completer<void>();
await tester.pumpApp(
Scaffold(
body: Container(),
bottomNavigationBar: BottomNavBar(
currentIndex: 0,
onTap: (value) => completer.complete(),
),
),
);
await tester.ensureVisible(find.byType(BottomNavigationBar));
await tester.tap(find.byIcon(Icons.home_outlined));
expect(completer.isCompleted, isTrue);
});
Flutter 的 小部件测试简介 配方提供了有关小部件测试的更多信息。
Bloc 测试
Bloc 测试验证您的应用程序的 bloc 状态管理库 在各种条件下是否按预期运行。
Bloc 测试设置测试的初始条件,实例化 bloc,并测试 bloc 是否按预期运行。以下来自 analytics_bloc_test.dart
的测试检查 AnalyticsBloc
是否对用户身份验证做出适当的响应
blocTest<AnalyticsBloc, AnalyticsState>(
'calls AnalyticsRepository.setUserId '
'with user id when user is authenticated',
setUp: () => when(() => userRepository.user)
.thenAnswer((_) => Stream.value(user)),
build: () => AnalyticsBloc(
analyticsRepository: analyticsRepository,
userRepository: userRepository,
),
verify: (_) {
verify(() => analyticsRepository.setUserId(user.id)).called(1);
},
);
上面的测试验证了是否正确调用了模拟存储库。根据您正在测试的 bloc 行为,bloc 测试还可以验证是否抛出错误或 bloc 的状态是否正确。
bloc 库测试文档 提供了对测试 bloc 的全面介绍。