Skip to content

Commit 0287c22

Browse files
authored
Add 'fail-fast' argument to flutter test (flutter#149587)
This adds the 'fail-fast' argument to flutter test, since dart test already supports this feature. Tests can now be stopped after first failure. Fixes flutter#124406
1 parent a97a9b3 commit 0287c22

File tree

3 files changed

+35
-69
lines changed

3 files changed

+35
-69
lines changed

packages/flutter_tools/lib/src/commands/test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
111111
'Instructions for connecting with a debugger are printed to the '
112112
'console once the test has started.',
113113
)
114+
..addFlag('fail-fast',
115+
help: 'Stop running tests after the first failure.',
116+
)
114117
..addFlag('run-skipped',
115118
help: 'Run skipped tests instead of skipping them.',
116119
)
@@ -578,6 +581,7 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
578581
reporter: stringArg('reporter'),
579582
fileReporter: stringArg('file-reporter'),
580583
timeout: stringArg('timeout'),
584+
failFast: boolArg('fail-fast'),
581585
runSkipped: boolArg('run-skipped'),
582586
shardIndex: shardIndex,
583587
totalShards: totalShards,
@@ -605,6 +609,7 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts {
605609
reporter: stringArg('reporter'),
606610
fileReporter: stringArg('file-reporter'),
607611
timeout: stringArg('timeout'),
612+
failFast: boolArg('fail-fast'),
608613
runSkipped: boolArg('run-skipped'),
609614
shardIndex: shardIndex,
610615
totalShards: totalShards,

packages/flutter_tools/lib/src/test/runner.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ abstract class FlutterTestRunner {
5656
String? reporter,
5757
String? fileReporter,
5858
String? timeout,
59+
bool failFast = false,
5960
bool runSkipped = false,
6061
int? shardIndex,
6162
int? totalShards,
@@ -84,6 +85,7 @@ abstract class FlutterTestRunner {
8485
String? reporter,
8586
String? fileReporter,
8687
String? timeout,
88+
bool failFast = false,
8789
bool runSkipped = false,
8890
int? shardIndex,
8991
int? totalShards,
@@ -121,6 +123,7 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner {
121123
String? reporter,
122124
String? fileReporter,
123125
String? timeout,
126+
bool failFast = false,
124127
bool runSkipped = false,
125128
int? shardIndex,
126129
int? totalShards,
@@ -158,6 +161,8 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner {
158161
...<String>['--tags', tags],
159162
if (excludeTags != null)
160163
...<String>['--exclude-tags', excludeTags],
164+
if (failFast)
165+
'--fail-fast',
161166
if (runSkipped)
162167
'--run-skipped',
163168
if (totalShards != null)
@@ -665,6 +670,7 @@ class SpawnPlugin extends PlatformPlugin {
665670
String? reporter,
666671
String? fileReporter,
667672
String? timeout,
673+
bool failFast = false,
668674
bool runSkipped = false,
669675
int? shardIndex,
670676
int? totalShards,
@@ -734,6 +740,8 @@ class SpawnPlugin extends PlatformPlugin {
734740
...<String>['--tags', tags],
735741
if (excludeTags != null)
736742
...<String>['--exclude-tags', excludeTags],
743+
if (failFast)
744+
'--fail-fast',
737745
if (runSkipped)
738746
'--run-skipped',
739747
if (totalShards != null)

packages/flutter_tools/test/commands.shard/hermetic/test_test.dart

Lines changed: 22 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -189,29 +189,6 @@ dev_dependencies:
189189
ProcessManager: () => FakeProcessManager.any(),
190190
});
191191

192-
testUsingContext('Pipes test-randomize-ordering-seed to package:test',
193-
() async {
194-
final FakePackageTest fakePackageTest = FakePackageTest();
195-
196-
final TestCommand testCommand = TestCommand(testWrapper: fakePackageTest);
197-
final CommandRunner<void> commandRunner =
198-
createTestCommandRunner(testCommand);
199-
200-
await commandRunner.run(const <String>[
201-
'test',
202-
'--test-randomize-ordering-seed=random',
203-
'--no-pub',
204-
]);
205-
expect(
206-
fakePackageTest.lastArgs,
207-
contains('--test-randomize-ordering-seed=random'),
208-
);
209-
}, overrides: <Type, Generator>{
210-
FileSystem: () => fs,
211-
ProcessManager: () => FakeProcessManager.any(),
212-
Cache: () => Cache.test(processManager: FakeProcessManager.any()),
213-
});
214-
215192
testUsingContext(
216193
'Confirmation that the reporter, timeout, and concurrency args are not set by default',
217194
() async {
@@ -492,54 +469,26 @@ dev_dependencies:
492469
ProcessManager: () => FakeProcessManager.any(),
493470
});
494471

495-
testUsingContext('Pipes start-paused to package:test',
496-
() async {
497-
final FakePackageTest fakePackageTest = FakePackageTest();
498-
499-
final TestCommand testCommand = TestCommand(testWrapper: fakePackageTest);
500-
final CommandRunner<void> commandRunner =
501-
createTestCommandRunner(testCommand);
502-
503-
await commandRunner.run(const <String>[
504-
'test',
505-
'--no-pub',
506-
'--start-paused',
507-
'--',
508-
'test/fake_test.dart',
509-
]);
510-
expect(
511-
fakePackageTest.lastArgs,
512-
contains('--pause-after-load'),
513-
);
514-
}, overrides: <Type, Generator>{
515-
FileSystem: () => fs,
516-
ProcessManager: () => FakeProcessManager.any(),
517-
Cache: () => Cache.test(processManager: FakeProcessManager.any()),
518-
});
519-
520-
testUsingContext('Pipes run-skipped to package:test',
521-
() async {
522-
final FakePackageTest fakePackageTest = FakePackageTest();
472+
group('Pipes to package:test', () {
473+
Future<void> expectPassesArgument(String value, [String? passValue]) async {
474+
final FakePackageTest fakePackageTest = FakePackageTest();
475+
final TestCommand testCommand = TestCommand(testWrapper: fakePackageTest);
476+
final CommandRunner<void> commandRunner = createTestCommandRunner(testCommand);
523477

524-
final TestCommand testCommand = TestCommand(testWrapper: fakePackageTest);
525-
final CommandRunner<void> commandRunner =
526-
createTestCommandRunner(testCommand);
478+
await commandRunner.run(<String>['test', '--no-pub', value]);
479+
expect(fakePackageTest.lastArgs, contains(passValue ?? value));
480+
}
527481

528-
await commandRunner.run(const <String>[
529-
'test',
530-
'--no-pub',
531-
'--run-skipped',
532-
'--',
533-
'test/fake_test.dart',
534-
]);
535-
expect(
536-
fakePackageTest.lastArgs,
537-
contains('--run-skipped'),
538-
);
539-
}, overrides: <Type, Generator>{
540-
FileSystem: () => fs,
541-
ProcessManager: () => FakeProcessManager.any(),
542-
Cache: () => Cache.test(processManager: FakeProcessManager.any()),
482+
testUsingContext('passes various CLI options through to package:test', () async {
483+
await expectPassesArgument('--start-paused', '--pause-after-load');
484+
await expectPassesArgument('--fail-fast');
485+
await expectPassesArgument('--run-skipped');
486+
await expectPassesArgument('--test-randomize-ordering-seed=random');
487+
}, overrides: <Type, Generator>{
488+
FileSystem: () => fs,
489+
ProcessManager: () => FakeProcessManager.any(),
490+
Cache: () => Cache.test(processManager: FakeProcessManager.any()),
491+
});
543492
});
544493

545494
testUsingContext('Pipes enable-vmService', () async {
@@ -674,6 +623,7 @@ dev_dependencies:
674623
'--test-randomize-ordering-seed=random',
675624
'--tags=tag1',
676625
'--exclude-tags=tag2',
626+
'--fail-fast',
677627
'--run-skipped',
678628
'--total-shards=1',
679629
'--shard-index=1',
@@ -715,6 +665,7 @@ const List<String> packageTestArgs = <String>[
715665
'tag1',
716666
'--exclude-tags',
717667
'tag2',
668+
'--fail-fast',
718669
'--run-skipped',
719670
'--total-shards=1',
720671
'--shard-index=1',
@@ -1466,6 +1417,7 @@ class FakeFlutterTestRunner implements FlutterTestRunner {
14661417
String? reporter,
14671418
String? fileReporter,
14681419
String? timeout,
1420+
bool failFast = false,
14691421
bool runSkipped = false,
14701422
int? shardIndex,
14711423
int? totalShards,
@@ -1513,6 +1465,7 @@ class FakeFlutterTestRunner implements FlutterTestRunner {
15131465
String? reporter,
15141466
String? fileReporter,
15151467
String? timeout,
1468+
bool failFast = false,
15161469
bool runSkipped = false,
15171470
int? shardIndex,
15181471
int? totalShards,

0 commit comments

Comments
 (0)