我想将测试环境作为命令行参数传递给我的 flutter 驱动程序集成测试。是否可以 ?
我确实在下面的帖子中读到我们可以在 Flutter 驱动程序测试中使用环境变量。但我对命令行参数更感兴趣。
我尝试将旧的 flutter 驱动程序测试迁移到新的integration_test 包。我复制了示例项目中的几乎所有内容,并在本地执行了示例项目的集成测试。这按预期工作,我能够看到应用程序 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();
}
Run Code Online (Sandbox Code Playgroud)
我想通了,如果我不启动 tester.pumpWidget() 显示 Widget,我会传递给方法,但那是 WidgetTest 而不是集成测试。
我的猜测是,这是因为我的 main 函数是一个异步函数。我在旧的 flutter 驱动程序测试中也需要这个解决方法来等待第一帧。但是我不知道如何使用新的 integration_test 包来实现它。
希望您能够帮助我。
我正在为我的颤振应用程序制作一些测试场景。其中一项功能是“关于我们”部分。当点击“关于我们”时,用户被重定向到网页并且应用程序被最小化。这是一个问题,因为测试场景在这一点上失败了。Flutter 无法找到任何组件,并且在此特定错误上失败
Unhandled exception:
DriverError: Failed to fulfill Tap due to remote error
Original error: Bad state: The client closed with pending request "ext.flutter.driver".
Original stack trace:
#0 new Client.withoutJson.<anonymous closure> (package:json_rpc_2/src/client.dart:70:24)
#1 _RootZone.run (dart:async/zone.dart:1445:54)
#2 _FutureListener.handleWhenComplete (dart:async/future_impl.dart:167:18)
#3 Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:666:39)
#4 Future._propagateToListeners (dart:async/future_impl.dart:722:37)
#5 Future._propagateToListeners (dart:async/future_impl.dart:621:9)
#6 Future._completeWithValue (dart:async/future_impl.dart:529:5)
#7 Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:567:7)
#8 _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#9 _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#10 _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:118:13)
#11 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:404:11)
#12 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
#13 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
#0 VMServiceFlutterDriver.sendCommand (package:flutter_driver/src/driver/vmservice_driver.dart:345:7)
<asynchronous suspension>
#1 FlutterDriver.tap (package:flutter_driver/src/driver/driver.dart:207:11) …Run Code Online (Sandbox Code Playgroud) 我是 Flutter Driver 测试的新手,我有一个问题,即在等待小部件出现时,测试总是超时(30 秒)。我的主课只检查 Firebase 用户是否为空。如果用户登录,则显示仪表板,否则显示登录屏幕。在运行检查时,它会显示一个 SplashScreen。测试“检查颤振驱动程序健康”正常完成。
我试过find.byValueKey("auth_screen")而不是find.byType("AuthScreen"),它给出了同样的问题。
错误日志:
VMServiceFlutterDriver: Connected to Flutter application.
00:01 +0: rendin app check flutter driver health
HealthStatus.ok
00:01 +1: rendin app Check login screen widgets
Splash screen
VMServiceFlutterDriver: waitFor message is taking a long time to complete...
VMServiceFlutterDriver: waitFor message is taking a long time to complete...
00:31 +1 -1: rendin app Check login screen widgets [E]
TimeoutException after 0:00:30.000000: Test timed out after 30 seconds.
Bad state: The …Run Code Online (Sandbox Code Playgroud) 我正在 Android 和 iOS 模拟器上为我的应用程序进行集成测试
android 的完成如预期所有测试都通过并且应用程序停止
但是 iOS 完成了测试并且所有测试都通过了,但最终出现错误“无法停止应用程序”
我的 app.dart 文件
import 'package:flutter_driver/driver_extension.dart';
import 'package:myapp/main.dart' as app;
void main(){
enableFlutterDriverExtension();
app.main();
}
Run Code Online (Sandbox Code Playgroud)
我的 app_test.dart 文件
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';
void main(){
group('Empty App',(){
FlutterDriver? driver;
setUpAll(() async {
driver = await FlutterDriver.connect();
});
tearDownAll(() async {
if (driver != null){
await driver!.close();
}
});
test('find widgets',() async{
final text1 = find.byValueKey('Today');
expect(await driver!.getText(text1),'Today');
});
});
}
Run Code Online (Sandbox Code Playgroud)
我在 MacBook Air M1 上使用 android studio
我该怎么做才能解决这个错误?
谢谢
integration-testing flutter flutter-test flutterdriver flutter-integration-test
通常我将 Key: ValueKey 放在一个 flutter 元素中,我想在测试用例中找到该元素进行测试,但是这个特定元素已经有一个 globalKey。那么,我应该使用什么来查找元素中使用的 globalkey 呢?
值键
key: ValueKey('nameField')
在测试用例中=>
final nameField = find.byValueKey('nameField')
全局键
final LabeledGlobalKey<FormFieldState<String>> _passwordField = LabeledGlobalKey<FormFieldState<String>>("passwordFieldKey")
key: _passwordField
在测试用例中=>
final passwordField = find.???('???')
使用 Flutter new integration_test 进行示例集成测试?
我正在为用Flutter. 我按照这本关于测试 Flutter 应用程序的 Flutter Cookbook学习了如何编写小部件和集成测试。
本教程完美运行,但我仍然坚持自己的集成测试。
为了简化,我们假设我有一个应用程序,仅包含TextField:
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MyAppp',
home: Scaffold(
body: Center(child: TextField()),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我想为这个应用程序编写一个测试。例如,我想测试以下场景:
TextField为空TextFieldTextField包含“hello, world!”我编写了以下Widget测试,效果很好:
void main() {
testWidgets('TextField behavior', (WidgetTester tester) async {
// Create app
await tester.pumpWidget(MyApp());
// Find TextField, check there …Run Code Online (Sandbox Code Playgroud) 我已经按照此处的定义在我的项目上设置了 Flutter 集成测试:https : //flutter.dev/docs/testing/integration-tests
我使用了以下 devDepencendies:
integration_test: ^1.0.0
flutter_test:
sdk: flutter
flutter_driver:
sdk: flutter
Run Code Online (Sandbox Code Playgroud)
测试驱动程序只是来自项目页面的 C&P:
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();
Run Code Online (Sandbox Code Playgroud)
最终测试:
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('CPCSA-TC-016: Vehicle Card with no alert',
(WidgetTester tester) async {
app.main();
// Execute test code.
});
}
Run Code Online (Sandbox Code Playgroud)
最后我运行我的测试
flutter drive --driver=test_driver/integration_test.dart --target=integration_test/test.dart
这基本上没问题,但它在每次执行时都会编译,这非常耗时。我是否有机会运行集成测试并拥有与常规开发相同的热重载功能?如何实现这一目标?
或者还有其他解决方法吗?我正在考虑首先将测试代码编写为单元/小部件测试,然后在执行正确后将其移植到集成测试中。
integration-testing flutter hot-reload flutterdriver flutter-integration-test