Flutter集成测试:如何在每个testWidgets间重装应用?
Flutter集成测试:为每个testWidgets用例重装应用
当然可以实现每个testWidgets用例运行时自动杀死并重装应用,以此保证每个测试都从完全干净的应用状态开始,避免用例间的状态污染。
现有代码的局限
你当前在每个用例里调用app.main(),只是重启了Flutter引擎内的应用实例,并没有真正终止并重装整个应用进程,可能残留之前测试的缓存、本地存储等状态,无法做到彻底隔离。
实现彻底重装的方法
通过IntegrationTestWidgetsFlutterBinding的配置,就能实现测试间的应用进程级重置:
方法一:全局开启自动重启
在测试入口处开启restartAppBetweenTests属性,框架会自动在每个testWidgets用例执行前杀死当前应用并重装:
void main() { final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding; // 开启测试间自动重启应用 binding.restartAppBetweenTests = true; testWidgets('TC_01 Home page validation', (tester) async { app.main(); await tester.pumpAndSettle(const Duration(seconds: 5)); await tester.tap(find.byKey(const ValueKey('startButton'))); await tester.pumpAndSettle(); }); testWidgets('TC_02 Home page text validation ', (tester) async { app.main(); await tester.pumpAndSettle(const Duration(seconds: 5)); expect(find.text('Home Screen'), findsOneWidget); expect(find.text('Transactions'), findsOneWidget); }); }
方法二:单个用例手动重启
如果需要针对特定用例执行重启,或者自定义重启时机,可以在目标用例内手动调用restartApp()方法:
void main() { final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding; testWidgets('TC_01 Home page validation', (tester) async { await binding.restartApp(); // 手动重启应用 app.main(); await tester.pumpAndSettle(const Duration(seconds: 5)); await tester.tap(find.byKey(const ValueKey('startButton'))); await tester.pumpAndSettle(); }); testWidgets('TC_02 Home page text validation ', (tester) async { await binding.restartApp(); app.main(); await tester.pumpAndSettle(const Duration(seconds: 5)); expect(find.text('Home Screen'), findsOneWidget); expect(find.text('Transactions'), findsOneWidget); }); }
注意事项
- 该功能仅在集成测试环境生效,Widget测试或单元测试无需使用。
- 应用重启会增加单条用例的执行时间,需要根据测试需求平衡隔离性与执行效率。
内容的提问来源于stack exchange,提问作者Jagadeesh
相关产品推荐
相关产品推荐

