跳至主要内容

测试

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 的全面介绍。