如何解决新的 integration_test 包只显示“测试开始...”[Android]
我尝试将旧的 Flutter 驱动程序测试迁移到新的 integration_test package。 我几乎复制了 example project 中的所有内容,并在本地执行了示例项目的集成测试。这按预期工作,我能够看到应用程序 UI。 但我自己的应用程序在显示启动画面后仅以紫色显示“测试开始...”。
example_test.dart:
void main() {
group('My-App',() {
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding;
testWidgets('Tap on SkipAuthentication',(tester) async {
app.main();
await binding.traceAction(() async {
await tester.pumpAndSettle();
await Future.delayed(Duration(seconds: 5));
final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
await tester.tap(fab);
await tester.pumpAndSettle();
});
});
integration_driver.dart:
Future<void> main() async {
integrationDriver();
}
我发现,如果我不启动 tester.pumpWidget() 会显示我传递给方法的 Widget,但那是 WidgetTest 而不是集成测试。
我的猜测是,这是因为我的 main 函数是一个异步函数。 我在旧的 flutter 驱动程序测试中还需要 this workaround 来等待第一帧。 但我不知道如何使用新的 integration_test 包来实现它。
希望你能帮助我。
解决方法
嗯。我在假期开始转换我的 flutter_driver
测试并遇到了同样的问题。
我的解决方法是在启动测试后添加一个固定的睡眠,以使其能够正确初始化。所以一个测试用例看起来像这样:
testWidgets("Main screen loads",(WidgetTester widgetTester) async {
app.main();
await sleep(Duration(seconds: 10));
await widgetTester.pumpAndSettle();
expect(find.text("What are you looking for?"),findsOneWidget);
});
,
我也遇到了这个问题,sleep
/ Future.delayed
不起作用。有时会运行集成测试,但大多数情况下不会。
最终为我解决问题的是将 framePolicy
的 IntegrationTestWidgetsFlutterBinding
更改为 LiveTestWidgetsFlutterBindingFramePolicy.fullyLive
。这是一个完整的例子:
void main() {
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized()
as IntegrationTestWidgetsFlutterBinding;
binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;
testWidgets("failing test example",(WidgetTester tester) async {
app.main();
await tester.pumpAndSettle();
// Start testing here...
});
}
从 Google Codelabs 找到解决方案。
,我也为此苦苦挣扎了几个小时,终于找到了答案。
您的问题是不使用 await tester.pumpWidget(MyApp())
您的测试如下:
void main() {
testWidgets('Tap on SkipAuthentication',(tester) async {
app.main(); // <--- You call app.main() - This Flutter Driver style,but not integration test style
await binding.traceAction(() async {
await tester.pumpAndSettle();
await Future.delayed(Duration(seconds: 5));
final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
await tester.tap(fab);
await tester.pumpAndSettle();
});
});
你需要像这样改变你的测试:
void main() {
testWidgets('Tap on SkipAuthentication',(tester) async {
await tester.pumpWidget(MyApp()); // You need to call await tester.pumpWidget();
await tester.pump(const Duration(seconds: 1));
final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
await tester.tap(fab);
await tester.pump();
});
}
,
我不得不使用来自该线程的命令组合来使我的测试工作。起初,它对我来说也卡在“测试开始...”上,然后卡在启动屏幕上。在这两种情况下,它都无法移动到应用程序的第一页,所以我找不到任何小部件。
我从所有尝试中学到的一些东西:
- 显然,使用带有
pumpAndSettle()
参数的Duration
与没有持续时间的sleep(Duration)
加上pumpAndSettle()
给出的结果不同。第一个对我来说“获取”应用程序的第一页,但不是后者 - 调用
tester.pumpWidget(MyApp())
而不是app.main()
实际上会导致我出现错误屏幕,我绝对需要使用app.main()
- 就我而言,
framePolicy
设置也是必要的 - 我认为在
ValueKey
中使用Key
或find.byKey
是一样的:对我来说,它们都在工作(给它们一个字符串作为参数)
最后,对我有用的代码是:
void main() {
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized()
as IntegrationTestWidgetsFlutterBinding;
binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;
testWidgets('Tap on SkipAuthentication',(tester) async {
app.main();
await tester.pumpAndSettle(Duration(seconds: 3));
final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
await tester.tap(fab);
await tester.pumpAndSettle();
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。