From 3eb319d7bdbc08ddd4edc29884dc9613274c770a Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Thu, 2 Jul 2020 18:14:38 -0400 Subject: [PATCH 1/9] Add customizable `flutter_driver` adaptor --- packages/e2e/CHANGELOG.md | 4 ++ .../example/test_driver/example_e2e_test.dart | 2 +- packages/e2e/lib/e2e_driver.dart | 41 +++++++++++++++++-- packages/e2e/pubspec.yaml | 2 +- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index bc844ce72086..95805964da73 100644 --- a/packages/e2e/CHANGELOG.md +++ b/packages/e2e/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.3 + +* Add customizable `flutter_driver` adaptor. + ## 0.6.2+1 * Fix incorrect test results when one test passes then another fails diff --git a/packages/e2e/example/test_driver/example_e2e_test.dart b/packages/e2e/example/test_driver/example_e2e_test.dart index 983c3863dea5..cc3ea1572a52 100644 --- a/packages/e2e/example/test_driver/example_e2e_test.dart +++ b/packages/e2e/example/test_driver/example_e2e_test.dart @@ -2,4 +2,4 @@ import 'dart:async'; import 'package:e2e/e2e_driver.dart' as e2e; -Future main() async => e2e.main(); +Future main() async => e2e.e2eDriver(); diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index 2e43c5a36e55..1f092cf4d0cb 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -4,15 +4,50 @@ import 'dart:io'; import 'package:e2e/common.dart' as e2e; import 'package:flutter_driver/flutter_driver.dart'; -Future main() async { +Future main() async => e2eDriver(); + +/// Adaptor to run E2E test using `flutter drive`. +/// +/// For an E2E test `.dart`, put a file named `_test.dart` +/// in the app's `test_driver` directory: +/// +/// ```dart +/// import 'dart:async'; +/// +/// import 'package:e2e/e2e_driver.dart' as e2e; +/// +/// Future main() async => e2e.e2eDriver(); +/// +/// ``` +Future e2eDriver({ + Duration timeout = const Duration(minutes: 1), + String testName, + bool traceTimeline = false, +}) async { + + print(testName); final FlutterDriver driver = await FlutterDriver.connect(); - final String jsonResult = - await driver.requestData(null, timeout: const Duration(minutes: 1)); + String jsonResult; + Timeline timeline; + Future runner() async { + jsonResult = await driver.requestData(null, timeout: timeout); + } + if (traceTimeline) { + timeline = await driver.traceAction(runner); + } + else { + await runner(); + } final e2e.Response response = e2e.Response.fromJson(jsonResult); await driver.close(); if (response.allTestsPassed) { print('All tests passed.'); + if (traceTimeline) { + final TimelineSummary summary = TimelineSummary.summarize(timeline); + await summary.writeTimelineToFile(testName, pretty: true); + await summary.writeSummaryToFile(testName, pretty: true); + } exit(0); } else { print('Failure Details:\n${response.formattedFailureDetails}'); diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index e3f39c05334b..fbe71eeb1584 100644 --- a/packages/e2e/pubspec.yaml +++ b/packages/e2e/pubspec.yaml @@ -1,6 +1,6 @@ name: e2e description: Runs tests that use the flutter_test API as integration tests. -version: 0.6.2+1 +version: 0.6.3 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e environment: From 3b30d613168a38db8f9fdb642646ef86aac1f522 Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Thu, 2 Jul 2020 18:39:32 -0400 Subject: [PATCH 2/9] formatting --- packages/e2e/lib/e2e_driver.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index 1f092cf4d0cb..8b89ef93128a 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -24,7 +24,6 @@ Future e2eDriver({ String testName, bool traceTimeline = false, }) async { - print(testName); final FlutterDriver driver = await FlutterDriver.connect(); String jsonResult; @@ -32,10 +31,10 @@ Future e2eDriver({ Future runner() async { jsonResult = await driver.requestData(null, timeout: timeout); } + if (traceTimeline) { timeline = await driver.traceAction(runner); - } - else { + } else { await runner(); } final e2e.Response response = e2e.Response.fromJson(jsonResult); From 75af033685d5a3d8f9bde4027995bccfb0bad25b Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Mon, 6 Jul 2020 11:42:19 -0400 Subject: [PATCH 3/9] Modify according to dnfield@ --- packages/e2e/lib/e2e_driver.dart | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index 8b89ef93128a..c6018c3904d3 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -19,12 +19,20 @@ Future main() async => e2eDriver(); /// Future main() async => e2e.e2eDriver(); /// /// ``` +/// +/// `timeout` controls the longest time waited before the test ends, not +/// necessarily the execution time for the test app. +/// +/// `traceTimeline` flag controls if timeline and timeline summary should be +/// collected. +/// +/// `testName` is used as the file name for the output timeline files. Future e2eDriver({ Duration timeout = const Duration(minutes: 1), - String testName, bool traceTimeline = false, + String testName, }) async { - print(testName); + assert(!traceTimeline || testName != null); final FlutterDriver driver = await FlutterDriver.connect(); String jsonResult; Timeline timeline; From 7017fb87be5f4f9bc08feae0c08d2195663f4b43 Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Mon, 6 Jul 2020 11:58:55 -0400 Subject: [PATCH 4/9] update dartdoc --- packages/e2e/lib/e2e_driver.dart | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index c6018c3904d3..f94f6ef77f95 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -8,8 +8,16 @@ Future main() async => e2eDriver(); /// Adaptor to run E2E test using `flutter drive`. /// -/// For an E2E test `.dart`, put a file named `_test.dart` -/// in the app's `test_driver` directory: +/// `timeout` controls the longest time waited before the test ends, not +/// necessarily the execution time for the test app. +/// +/// `traceTimeline` flag controls if timeline and timeline summary should be +/// collected. +/// +/// `testName` is used as the file name for the output timeline files. +/// +/// To an E2E test `.dart` using `flutter drive`, put a file named +/// `_test.dart` in the app's `test_driver` directory: /// /// ```dart /// import 'dart:async'; @@ -19,14 +27,6 @@ Future main() async => e2eDriver(); /// Future main() async => e2e.e2eDriver(); /// /// ``` -/// -/// `timeout` controls the longest time waited before the test ends, not -/// necessarily the execution time for the test app. -/// -/// `traceTimeline` flag controls if timeline and timeline summary should be -/// collected. -/// -/// `testName` is used as the file name for the output timeline files. Future e2eDriver({ Duration timeout = const Duration(minutes: 1), bool traceTimeline = false, From db7d81e4680fd5a820fa1a8871427d6108829fe3 Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Mon, 6 Jul 2020 12:12:35 -0400 Subject: [PATCH 5/9] add comment about traceAction --- packages/e2e/lib/e2e_driver.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index f94f6ef77f95..e725ec95ef19 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -42,6 +42,7 @@ Future e2eDriver({ if (traceTimeline) { timeline = await driver.traceAction(runner); + // In the traceAction call runner is awaited. } else { await runner(); } From 62930072030f47f836d49f64696356ca6562d80e Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Mon, 6 Jul 2020 12:13:06 -0400 Subject: [PATCH 6/9] update e2e readme --- packages/e2e/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/e2e/README.md b/packages/e2e/README.md index a9ebed1130a4..25017f73ed49 100644 --- a/packages/e2e/README.md +++ b/packages/e2e/README.md @@ -10,7 +10,7 @@ iOS support is not available yet, but is planned in the future. Add a dependency on the `e2e` package in the `dev_dependencies` section of pubspec.yaml. For plugins, do this in the -pubspec.yaml of the example app. +`pubspec.yaml` of the example app. Invoke `E2EWidgetsFlutterBinding.ensureInitialized()` at the start of a test file, e.g. @@ -45,7 +45,7 @@ import 'dart:async'; import 'package:e2e/e2e_driver.dart' as e2e; -Future main() async => e2e.main(); +Future main() async => e2e.e2eDriver(); ``` From d0792ddce0fa5fad585e804d919de5c91ca53c17 Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Mon, 6 Jul 2020 13:24:25 -0400 Subject: [PATCH 7/9] rephrase comments --- packages/e2e/lib/e2e_driver.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index e725ec95ef19..f7a0cdabaefd 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -8,8 +8,9 @@ Future main() async => e2eDriver(); /// Adaptor to run E2E test using `flutter drive`. /// -/// `timeout` controls the longest time waited before the test ends, not -/// necessarily the execution time for the test app. +/// `timeout` controls the longest time waited before the test ends. +/// It is not necessarily the execution time for the test app. +/// The test can and usually runs for shorter time if the test ends early. /// /// `traceTimeline` flag controls if timeline and timeline summary should be /// collected. From 367312488f5bbd809b284c18130e7ee5d8cd3a32 Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Wed, 8 Jul 2020 20:16:20 -0400 Subject: [PATCH 8/9] modify according to liyuqian@ --- packages/e2e/lib/e2e_driver.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index f7a0cdabaefd..994fb6658b8a 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:e2e/common.dart' as e2e; import 'package:flutter_driver/flutter_driver.dart'; -Future main() async => e2eDriver(); +Future main() => e2eDriver(); /// Adaptor to run E2E test using `flutter drive`. /// From af57e0acd19628fef3dd415e27d9a4064a58b1db Mon Sep 17 00:00:00 2001 From: "Ming Lyu (CareF)" Date: Wed, 8 Jul 2020 20:26:39 -0400 Subject: [PATCH 9/9] update comments from dnfield@ --- packages/e2e/lib/e2e_driver.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/e2e/lib/e2e_driver.dart b/packages/e2e/lib/e2e_driver.dart index 994fb6658b8a..4a5047e9bd47 100644 --- a/packages/e2e/lib/e2e_driver.dart +++ b/packages/e2e/lib/e2e_driver.dart @@ -9,8 +9,8 @@ Future main() => e2eDriver(); /// Adaptor to run E2E test using `flutter drive`. /// /// `timeout` controls the longest time waited before the test ends. -/// It is not necessarily the execution time for the test app. -/// The test can and usually runs for shorter time if the test ends early. +/// It is not necessarily the execution time for the test app: the test may +/// finish sooner than the `timeout`. /// /// `traceTimeline` flag controls if timeline and timeline summary should be /// collected. @@ -33,6 +33,7 @@ Future e2eDriver({ bool traceTimeline = false, String testName, }) async { + assert(timeout != null); assert(!traceTimeline || testName != null); final FlutterDriver driver = await FlutterDriver.connect(); String jsonResult;