Flutter 如何在颤振综合试验中看到失效线的线号?
编辑:在颤振问题列表中找到问题: 当颤振驱动-集成测试出现故障时,我在哪里查找-故障发生时的线号?我似乎在颤振驱动输出中找不到它 如有任何帮助/建议,将不胜感激。 提前谢谢 使用的命令:颤振驱动-目标=测试驱动程序/app.dart 输出:Flutter 如何在颤振综合试验中看到失效线的线号?,flutter,integration-testing,flutterdriver,Flutter,Integration Testing,Flutterdriver,编辑:在颤振问题列表中找到问题: 当颤振驱动-集成测试出现故障时,我在哪里查找-故障发生时的线号?我似乎在颤振驱动输出中找不到它 如有任何帮助/建议,将不胜感激。 提前谢谢 使用的命令:颤振驱动-目标=测试驱动程序/app.dart 输出: Warning: You are using these overridden dependencies: ! pedantic 1.10.0-nullsafety
Warning: You are using these overridden dependencies:
! pedantic 1.10.0-nullsafety
Running "flutter pub get" in aip_app... 865ms
Running Xcode build...
└─Compiling, linking and signing... 3.4s
Xcode build done. 10.1s
00:00 +0: Integration tests (setUpAll)
VMServiceFlutterDriver: Connecting to Flutter application at http://127.0.0.1:60646/0zFtd5Zu3Rs=/
VMServiceFlutterDriver: Isolate found with number: 3931090751816747
VMServiceFlutterDriver: Isolate is paused at start.
VMServiceFlutterDriver: Attempting to resume isolate
flutter: ===== STARTING APP =====
flutter: 2020-12-19 16:02:02.193821: MainApp INFO: ===== STARTING APP =====
VMServiceFlutterDriver: Connected to Flutter application.
flutter: 2020-12-19 16:02:02.384157: Utils INFO: Supported Biometrics: []
flutter: 2020-12-19 16:02:02.394761: MainApp INFO: Build tag calculated: v1.0.1+5
flutter: 2020-12-19 16:02:02.469009: AppSettingsBloc INFO: Building App Data with brightness Brightness.dark, buildTag: v1.0.1+5
flutter: 2020-12-19 16:02:02.799421: MainApp INFO: AppNavigationObserver didPush from null to CupertinoPageRoute<dynamic>(RouteSettings("/", null),
animation: AnimationController#66eb9(⏭ 1.000; paused; for CupertinoPageRoute<dynamic>(/)))
flutter: 2020-12-19 16:02:03.075460: BackendProvider INFO: ====>>>> StateChange to: UserInfo: Anon: false, TCtmVckk7dMFqbCco6h9NhGBiA42, null, null,
null, Instance of 'UserData'
flutter: 2020-12-19 16:02:03.089937: SimpleBlocDelegate INFO: onTransition Transition { currentState: BackendInitialized, event: SignInAtStartupEvent,
nextState: BackendActionInProgress }
flutter: 2020-12-19 16:02:03.093207: BackendProvider INFO: Hello Anon. Loading...
00:02 +1 ~1: Integration tests cash games flow
flutter: Handling request from Flutter driver: navigate_to_root
flutter: 2020-12-19 16:02:04.279687: SimpleBlocDelegate INFO: onTransition Transition { currentState: BackendActionInProgress, event:
SignInAtStartupEvent, nextState: BackendDataLoaded }
flutter: 2020-12-19 16:02:04.492851: MainApp INFO: AppNavigationObserver didPush from CupertinoPageRoute<dynamic>(RouteSettings("/", null), animation:
AnimationController#66eb9(⏭ 1.000; paused; for CupertinoPageRoute<dynamic>(/))) to ===||MainMenuScreen||===
[PageTransition<dynamic>(RouteSettings("/main-menu", null), animation: AnimationController#ff2aa(▶ 0.000; for PageTransition<dynamic>))]
flutter: 2020-12-19 16:02:04.973825: MainApp INFO: AppNavigationObserver didPush from ===||MainMenuScreen||===
[PageTransition<dynamic>(RouteSettings("/main-menu", null), animation: AnimationController#ff2aa(⏭ 1.000; paused; for PageTransition<dynamic>))] to
===||CashGamesWelcomeScreen||=== [PageTransition<dynamic>(RouteSettings("CashGamesWelcomeScreen", null), animation: AnimationController#ed347(▶ 0.000;
for PageTransition<dynamic>))]
flutter: 2020-12-19 16:02:05.418700: MainApp INFO: AppNavigationObserver didPush from ===||CashGamesWelcomeScreen||===
[PageTransition<dynamic>(RouteSettings("CashGamesWelcomeScreen", null), animation: AnimationController#ed347(⏭ 1.000; paused; for
PageTransition<dynamic>))] to ===||CashGamesNewGameScreen||=== [PageTransition<dynamic>(RouteSettings("CashGamesNewGameScreen", null), animation:
AnimationController#4c19b(▶ 0.000; for PageTransition<dynamic>))]
flutter: 2020-12-19 16:02:06.560730: SimpleBlocDelegate INFO: onTransition Transition { currentState: BackendDataLoaded, event: UpdateCashGame,
nextState: BackendActionInProgressWithData }
flutter: 2020-12-19 16:02:06.878949: SimpleBlocDelegate INFO: onTransition Transition { currentState: BackendActionInProgressWithData, event:
UpdateCashGame, nextState: UserDataUpdateCompleted }
flutter: 2020-12-19 16:02:06.901741: MainApp INFO: AppNavigationObserver didPush from ===||CashGamesNewGameScreen||===
[PageTransition<dynamic>(RouteSettings("CashGamesNewGameScreen", null), animation: AnimationController#4c19b(⏭ 1.000; paused; for
PageTransition<dynamic>))] to ===||CashGamesGameDetailsScreen||=== [PageTransition<dynamic>(RouteSettings("CashGamesGameDetailsScreen", null),
animation: AnimationController#e1937(▶ 0.000; for PageTransition<dynamic>))]
flutter: 2020-12-19 16:02:06.912362: SimpleBlocDelegate INFO: onTransition Transition { currentState: UserDataUpdateCompleted, event: UpdateCashGame,
nextState: BackendDataLoaded }
VMServiceFlutterDriver: waitFor message is taking a long time to complete...
00:32 +1 ~1 -1: Integration tests cash games flow [E]
TimeoutException after 0:00:30.000000: Test timed out after 30 seconds. See https://pub.dev/packages/test#timeouts
package:test_api/src/backend/invoker.dart 318:28 Invoker._handleError.<fn>
dart:async/zone.dart 1178:47 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
package:test_api/src/backend/invoker.dart 316:10 Invoker._handleError
package:test_api/src/backend/invoker.dart 272:9 Invoker.heartbeat.<fn>.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
package:test_api/src/backend/invoker.dart 271:38 Invoker.heartbeat.<fn>
dart:async-patch/timer_patch.dart 18:15 Timer._createTimer.<fn>
dart:isolate-patch/timer_impl.dart 395:19 _Timer._runTimers
dart:isolate-patch/timer_impl.dart 426:5 _Timer._handleMessage
dart:isolate-patch/isolate_patch.dart 184:12 _RawReceivePortImpl._handleMessage
00:32 +1 ~2 -1: Integration tests (tearDownAll)
flutter: Handling request from Flutter driver: quit_app
00:32 +1 ~2 -1: Integration tests cash games flow [E]
DriverError: Failed to fulfill WaitFor due to remote error
Original error: ext.flutter.driver: (-32000) Service connection disposed
Original stack trace:
dart:async/future_impl.dart 23:44 _Completer.completeError
package:vm_service/src/vm_service.dart 1972:16 VmService.dispose.<fn>
dart:collection-patch/compact_hash.dart 387:8 _LinkedHashMapMixin.forEach
package:vm_service/src/vm_service.dart 1970:17 VmService.dispose
package:flutter_driver/src/driver/vmservice_driver.dart 528:20 VMServiceFlutterDriver.close
test_driver/app_test.dart 32:21 main.<fn>.<fn>
===== asynchronous gap ===========================
dart:async/zone.dart 1118:19 _CustomZone.registerUnaryCallback
dart:async-patch/async_patch.dart 40:23 _asyncThenWrapperHelper
test_driver/app_test.dart main.<fn>.<fn>
dart:async/future.dart 226:31 new Future.sync
package:test_api/src/util/test.dart 21:12 errorsDontStopTest.<fn>
package:test_api/src/backend/invoker.dart 231:15 Invoker.waitForOutstandingCallbacks.<fn>
package:test_api/src/backend/invoker.dart 228:14 Invoker.waitForOutstandingCallbacks.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/invoker.dart 228:5 Invoker.waitForOutstandingCallbacks
package:test_api/src/util/test.dart 20:20 errorsDontStopTest
package:test_api/src/backend/declarer.dart 358:19 Declarer._tearDownAll.<fn>.<fn>.<fn>
package:test_api/src/backend/declarer.dart 356:44 Declarer._tearDownAll.<fn>.<fn>.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/invoker.dart 248:12 Invoker.unclosable
package:test_api/src/backend/declarer.dart 356:33 Declarer._tearDownAll.<fn>.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/declarer.dart 355:14 Declarer._tearDownAll.<fn>
package:test_api/src/backend/invoker.dart 231:15 Invoker.waitForOutstandingCallbacks.<fn>
package:test_api/src/backend/invoker.dart 228:14 Invoker.waitForOutstandingCallbacks.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/invoker.dart 228:5 Invoker.waitForOutstandingCallbacks
package:test_api/src/backend/invoker.dart 383:17 Invoker._onRun.<fn>.<fn>.<fn>
===== asynchronous gap ===========================
dart:async/zone.dart 1118:19 _CustomZone.registerUnaryCallback
dart:async-patch/async_patch.dart 40:23 _asyncThenWrapperHelper
package:test_api/src/backend/invoker.dart Invoker._onRun.<fn>.<fn>.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/invoker.dart 370:9 Invoker._onRun.<fn>.<fn>
package:test_api/src/backend/invoker.dart 415:15 Invoker._guardIfGuarded
package:test_api/src/backend/invoker.dart 369:7 Invoker._onRun.<fn>
package:stack_trace/src/chain.dart 94:24 Chain.capture.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:stack_trace/src/chain.dart 92:12 Chain.capture
package:test_api/src/backend/invoker.dart 368:11 Invoker._onRun
package:test_api/src/backend/live_test_controller.dart 153:11 LiveTestController.run
dart:async/future.dart 204:37 new Future.microtask.<fn>
dart:async/zone.dart 1178:47 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 994:7 _CustomZone.runGuarded
dart:async/zone.dart 1034:23 _CustomZone.bindCallbackGuarded.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 994:7 _CustomZone.runGuarded
dart:async/zone.dart 1034:23 _CustomZone.bindCallbackGuarded.<fn>
dart:async/schedule_microtask.dart 41:21 _microtaskLoop
dart:async/schedule_microtask.dart 50:5 _startMicrotaskLoop
dart:isolate-patch/isolate_patch.dart 120:13 _runPendingImmediateCallback
dart:isolate-patch/timer_impl.dart 402:11 _Timer._runTimers
dart:isolate-patch/timer_impl.dart 426:5 _Timer._handleMessage
dart:isolate-patch/isolate_patch.dart 184:12 _RawReceivePortImpl._handleMessage
package:flutter_driver/src/driver/vmservice_driver.dart 322:7 VMServiceFlutterDriver.sendCommand
===== asynchronous gap ===========================
dart:async/zone.dart 1126:19 _CustomZone.registerBinaryCallback
dart:async-patch/async_patch.dart 51:8 _asyncErrorWrapperHelper
package:test_api/src/backend/invoker.dart Invoker.waitForOutstandingCallbacks.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/invoker.dart 228:5 Invoker.waitForOutstandingCallbacks
package:test_api/src/backend/invoker.dart 383:17 Invoker._onRun.<fn>.<fn>.<fn>
===== asynchronous gap ===========================
dart:async/zone.dart 1118:19 _CustomZone.registerUnaryCallback
dart:async-patch/async_patch.dart 40:23 _asyncThenWrapperHelper
package:test_api/src/backend/invoker.dart Invoker._onRun.<fn>.<fn>.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:test_api/src/backend/invoker.dart 370:9 Invoker._onRun.<fn>.<fn>
package:test_api/src/backend/invoker.dart 415:15 Invoker._guardIfGuarded
package:test_api/src/backend/invoker.dart 369:7 Invoker._onRun.<fn>
package:stack_trace/src/chain.dart 94:24 Chain.capture.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 1626:10 _runZoned
dart:async/zone.dart 1546:10 runZoned
package:stack_trace/src/chain.dart 92:12 Chain.capture
package:test_api/src/backend/invoker.dart 368:11 Invoker._onRun
package:test_api/src/backend/live_test_controller.dart 153:11 LiveTestController.run
dart:async/future.dart 204:37 new Future.microtask.<fn>
dart:async/zone.dart 1178:47 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 994:7 _CustomZone.runGuarded
dart:async/zone.dart 1034:23 _CustomZone.bindCallbackGuarded.<fn>
dart:async/zone.dart 1186:13 _rootRun
dart:async/zone.dart 1090:19 _CustomZone.run
dart:async/zone.dart 994:7 _CustomZone.runGuarded
dart:async/zone.dart 1034:23 _CustomZone.bindCallbackGuarded.<fn>
dart:async/schedule_microtask.dart 41:21 _microtaskLoop
dart:async/schedule_microtask.dart 50:5 _startMicrotaskLoop
dart:isolate-patch/isolate_patch.dart 120:13 _runPendingImmediateCallback
dart:isolate-patch/timer_impl.dart 402:11 _Timer._runTimers
dart:isolate-patch/timer_impl.dart 426:5 _Timer._handleMessage
dart:isolate-patch/isolate_patch.dart 184:12 _RawReceivePortImpl._handleMessage
00:32 +1 ~2 -1: Some tests failed.
Unhandled exception:
Dummy exception to set exit code.
Failed to stop app
测试代码:
import 'dart:io';
import 'package:flutter_driver/flutter_driver.dart';
import 'package:intl/intl.dart';
import 'package:test/test.dart';
const String appDateFormatFullMonth = "MMMM dd, yyyy";
final DateFormat appDateFormatterFullMonth = DateFormat(appDateFormatFullMonth);
void main() {
group('Integration tests', () {
FlutterDriver driver;
setUpAll(() async {
driver = await FlutterDriver.connect();
// Wait for the first frame to be rasterized during the app launch.
await driver.waitUntilFirstFrameRasterized();
});
tearDownAll(() async {
await driver.requestData("quit_app");
await driver?.close();
});
Future<bool> isPresent(SerializableFinder byValueKey, {Duration timeout = const Duration(seconds: 1)}) async {
try {
await driver.waitFor(byValueKey, timeout: timeout);
return true;
} catch (exception) {
return false;
}
}
setUp(() async => await driver.requestData("navigate_to_root"));
tearDown(() async {}); // TODO - cleanup user data?
test('cash games flow', () async {
final welcomeButtonUseAnon = find.byValueKey('welcome-useAnon');
expect(await isPresent(welcomeButtonUseAnon), true, reason: "Unable to find welcome useAnon");
await driver.tap(welcomeButtonUseAnon);
final mainMenuButtonCashGames = find.byValueKey('mainMenu-cashGames');
expect(await isPresent(mainMenuButtonCashGames), true, reason: "Unable to find Cash Games on main menu button");
await driver.tap(mainMenuButtonCashGames);
// cash games welcome screen
final cashGamesButtonAddSession = find.byValueKey('cashGames-addSession');
final cashGamesButtonUpdateSession = find.byValueKey('cashGames-updateSession');
expect(await isPresent(cashGamesButtonAddSession), true, reason: "Unable to find Cash Games add session button");
expect(await isPresent(cashGamesButtonUpdateSession), true,
reason: "Unable to find Cash Games Update Session button");
// Next screen - new game
await driver.tap(cashGamesButtonAddSession);
expect(await isPresent(find.text("New game")), true, reason: "Unable to locate new cash game title");
final venueTextField = find.byValueKey('cashGames-new-venue');
final dateTextField = find.byValueKey('cashGames-new-date');
var cancelButton = find.byValueKey('cashGames-new-cancelBtn');
var nextButton = find.byValueKey('cashGames-new-nextBtn');
expect(await isPresent(cancelButton), true);
// Fill out new game info
var testVenueName = 'Restaurant at End of the world';
expect(await isPresent(venueTextField), true);
await driver.tap(venueTextField);
await driver.enterText(testVenueName);
await driver.waitFor(find.text(testVenueName));
expect(await isPresent(dateTextField), true);
await driver.tap(dateTextField);
await driver.enterText(appDateFormatterFullMonth.format(DateTime.now()));
expect(await isPresent(nextButton), true);
await driver.tap(nextButton);
// Next screen - Game details
await driver.waitFor(find.text(testVenueName));
await driver.waitFor(find.text("Game type:"));
await driver.waitFor(find.byValueKey("cashGames-details-cancelBtn"));
nextButton = find.byValueKey("cashGames-details-startSessionBtn");
await driver.waitFor(nextButton);
await driver.tap(nextButton);
// Next screen - ...
await driver.waitFor(find.text('Coming soon')); // on the next screen
});
});
}
颤振医生-v
[✓] Flutter (Channel beta, 1.25.0-8.1.pre, on macOS 11.1 20C69 darwin-arm, locale en-US)
• Flutter version 1.25.0-8.1.pre at /Users/agautam/tools/flutter
• Framework revision 8f89f6505b (4 days ago), 2020-12-15 15:07:52 -0800
• Engine revision 92ae191c17
• Dart version 2.12.0 (build 2.12.0-133.2.beta)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
• Android SDK at /Users/agautam/Library/Android/sdk
• Platform android-30, build-tools 30.0.3
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 12.3)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 12.3, Build version 12C33
• CocoaPods version 1.10.0
[✓] Android Studio
• Android Studio at /Applications/Android Studio 4.2 Preview.app/Contents
• Flutter plugin can be installed from:
There is no way you can find an error line from Console Output, the best way to debug your code for error is to add a print statement before every driver
action, this is what I have found when I tried to find any solutions regarding this issue, test will look like this just added snippet of one of my tests:
test('sign up test, log in button on sign up is working', () async {
print('Sign-up test started');
print('Waiting for join now button');
await driver.waitFor(loginpage.joinNowButtonFinder);
print('Tap for join now button');
await driver.tap(loginpage.joinNowButtonFinder);
print('Waiting for join now screen');
await driver.waitFor(joinpage.nameFieldFinder);
print('Tap on login button in join now screen');
await driver.scrollIntoView(joinpage.loginButtonFinder);
await driver.tap(joinpage.loginButtonFinder);
print('Tap on signup again');
await driver.waitFor(loginpage.signupButtonInLoginFinder);
await driver.tap(loginpage.signupButtonInLoginFinder);
}, timeout: Timeout(Duration(minutes: 2)));
[✓] 颤振通道测试版,1.25.0-8.1.pre,在macOS 11.1 20C69达尔文手臂上,美国本土
•颤振版本1.25.0-8.1.at/Users/agautam/tools/颤振
•框架修订版8f89f6505b 4天前,2020-12-15 15:07:52-0800
•发动机版本92ae191c17
•Dart版本2.12.0版本2.12.0-133.2.beta
[✓] Android工具链-为Android设备开发Android SDK版本30.0.3
•Android SDK位于/Users/agautam/Library/Android/SDK
•平台android-30,构建工具30.0.3
•Java二进制地址:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/Java
•Java版本OpenJDK运行时环境构建1.8.0_242-release-1644-b3-6915495
•接受所有Android许可证。
[✓] Xcode-为iOS和macOS开发Xcode 12.3
•Xcode at/Applications/Xcode.app/Contents/Developer
•Xcode 12.3,构建版本12C33
•CocoaPods 1.10.0版
[✓] 安卓工作室
•Android Studio at/Applications/Android Studio 4.2 Preview.app/Contents
•颤振插件可从以下位置安装:
您无法从控制台输出中找到错误行,调试错误代码的最佳方法是在每个驱动程序操作之前添加一个print语句,这是我在尝试找到有关此问题的任何解决方案时发现的,测试将类似于刚刚添加的一个测试片段:
$env:VM_SERVICE_URL = adb logcat -d | `
Select-String -Pattern "Observatory listening on (.*)" | `
select-object -Last 1 | foreach-object { $_.Matches.Groups[1].Value }
$port = $env:VM_SERVICE_URL | `
Select-String -Pattern ".*\d:(\d*)/" | `
select-object -Last 1 | `
foreach-object { $_.Matches.Groups[1].Value }
adb forward tcp:$port tcp:$port
flutter packages pub run test $args
您可以将测试附加到正在运行的Flatter应用程序。您需要设置VM_SERVICE_URL环境变量,然后使用其他命令运行测试
在Windows中,您可以使用此内容创建ps1文件,并在设备或虚拟机上启动应用程序后运行该文件:
export VM_SERVICE_URL=$(adb logcat -d | grep -o -E "Observatory listening on (.*)" | tail -1 | cut -d" " -f 4)
port=$(echo $VM_SERVICE_URL | cut -d: -f3 | cut -d/ -f1)
adb forward tcp:$port tcp:$port
flutter packages pub run test $1 --tags $2
在*nix中,我使用:
以这种方式运行测试可以让您在调试器中启动应用程序,并设置所有必要的断点,然后对该应用程序运行测试,这样您就可以检查正在运行的应用程序中的所有故障了是的……这就是我最后要做的。不过这很难看: