Unverified Commit 025f7ae6 authored by Casey Hillers's avatar Casey Hillers Committed by GitHub

Add ability to shard customer tests (#53433)

parent 730a440f
...@@ -25,6 +25,18 @@ Future<bool> run(List<String> arguments) async { ...@@ -25,6 +25,18 @@ Future<bool> run(List<String> arguments) async {
help: 'How many times to run each test. Set to a high value to look for flakes.', help: 'How many times to run each test. Set to a high value to look for flakes.',
valueHelp: 'count', valueHelp: 'count',
) )
..addOption(
'shards',
defaultsTo: '1',
help: 'How many shards to split the tests into. Used in continuous integration.',
valueHelp: 'count',
)
..addOption(
'shard-index',
defaultsTo: '0',
help: 'The current shard to run the tests with the range [0 .. shards - 1]. Used in continuous integration.',
valueHelp: 'count',
)
..addFlag( ..addFlag(
'skip-on-fetch-failure', 'skip-on-fetch-failure',
defaultsTo: false, defaultsTo: false,
...@@ -70,6 +82,8 @@ Future<bool> run(List<String> arguments) async { ...@@ -70,6 +82,8 @@ Future<bool> run(List<String> arguments) async {
final bool skipTemplate = parsedArguments['skip-template'] as bool; final bool skipTemplate = parsedArguments['skip-template'] as bool;
final bool verbose = parsedArguments['verbose'] as bool; final bool verbose = parsedArguments['verbose'] as bool;
final bool help = parsedArguments['help'] as bool; final bool help = parsedArguments['help'] as bool;
final int numberShards = int.tryParse(parsedArguments['shards'] as String);
final int shardIndex = int.tryParse(parsedArguments['shard-index'] as String);
final List<File> files = parsedArguments final List<File> files = parsedArguments
.rest .rest
.expand((String path) => Glob(path).listSync()) .expand((String path) => Glob(path).listSync())
...@@ -94,16 +108,38 @@ Future<bool> run(List<String> arguments) async { ...@@ -94,16 +108,38 @@ Future<bool> run(List<String> arguments) async {
if (verbose) if (verbose)
print('Starting run_tests.dart...'); print('Starting run_tests.dart...');
if (files.length < shardIndex)
print('Warning: There are more shards than tests. Some shards will not run any tests.');
if (numberShards <= shardIndex) {
print('Error: There are more shard indexes than shards.');
return help;
}
// Best attempt at evenly splitting tests among the shards
final List<File> shardedFiles = <File>[];
for (int i = shardIndex; i < files.length; i += numberShards) {
shardedFiles.add(files[i]);
}
int testCount = 0; int testCount = 0;
int failures = 0; int failures = 0;
if (verbose) { if (verbose) {
final String s = files.length == 1 ? '' : 's'; final String s = files.length == 1 ? '' : 's';
print('${files.length} file$s specified.'); final String ss = shardedFiles.length == 1 ? '' : 's';
print('${files.length} file$s specified. ${shardedFiles.length} test$ss in shard #$shardIndex.');
print(''); print('');
} }
for (final File file in files) { if (verbose) {
print('Tests in this shard:');
for (final File file in shardedFiles)
print(file.path);
}
print('');
for (final File file in shardedFiles) {
if (verbose) if (verbose)
print('Processing ${file.path}...'); print('Processing ${file.path}...');
TestFile instructions; TestFile instructions;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment