Add ability to shard customer tests (#53433)

This commit is contained in:
Casey Hillers 2020-03-31 14:01:01 -07:00 committed by GitHub
parent 730a440fd5
commit 025f7ae642
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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.',
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(
'skip-on-fetch-failure',
defaultsTo: false,
@ -70,6 +82,8 @@ Future<bool> run(List<String> arguments) async {
final bool skipTemplate = parsedArguments['skip-template'] as bool;
final bool verbose = parsedArguments['verbose'] 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
.rest
.expand((String path) => Glob(path).listSync())
@ -94,16 +108,38 @@ Future<bool> run(List<String> arguments) async {
if (verbose)
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 failures = 0;
if (verbose) {
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('');
}
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)
print('Processing ${file.path}...');
TestFile instructions;