runOneOrManyTests<T extends IntegrationTestRunnerArgs> function
Future<void>
runOneOrManyTests<
T extends IntegrationTestRunnerArgs>({ - required String testDirectoryPath,
- required T testRunnerArgs,
- required Future<void> runTest(
- T
),
- required T newArgsGenerator(
- List<String>
),
- bool testIsSupported(
- FileSystemEntity
)?,
- bool debugLogging = false,
})
Implementation
Future<void> runOneOrManyTests<T extends IntegrationTestRunnerArgs>({
required String testDirectoryPath,
required T testRunnerArgs,
required Future<void> Function(T) runTest,
required T Function(List<String>) newArgsGenerator,
bool Function(FileSystemEntity)? testIsSupported,
bool debugLogging = false,
}) async {
if (testRunnerArgs.help) {
testRunnerArgs.printHelp();
return;
}
void debugLog(String log) {
if (debugLogging) print(log);
}
final chromedriver = ChromeDriver();
try {
// Start chrome driver before running the flutter integration test.
await chromedriver.start(debugLogging: debugLogging);
if (testRunnerArgs.testTarget != null) {
// TODO(kenz): add support for specifying a directory as the target instead
// of a single file.
debugLog('Attempting to run a single test: ${testRunnerArgs.testTarget}');
await runTest(testRunnerArgs);
} else {
// Run all supported tests since a specific target test was not provided.
final testDirectory = Directory(testDirectoryPath);
var testFiles = testDirectory
.listSync(recursive: true)
.where(
(testFile) =>
testFile.path.endsWith(_testSuffix) &&
(testIsSupported?.call(testFile) ?? true),
)
.toList();
final shard = testRunnerArgs.shard;
if (shard != null) {
final shardSize = testFiles.length ~/ shard.totalShards;
// Subtract 1 since the [shard.shardNumber] index is 1-based.
final shardStart = (shard.shardNumber - 1) * shardSize;
final shardEnd = shard.shardNumber == shard.totalShards
? null
: shardStart + shardSize;
testFiles = testFiles.sublist(shardStart, shardEnd);
}
debugLog(
'Attempting to run all tests: '
'${testFiles.map((file) => file.path).toList().toString()}',
);
for (final testFile in testFiles) {
final testTarget = testFile.path;
final newArgsWithTarget = newArgsGenerator([
...testRunnerArgs.rawArgs,
'--${IntegrationTestRunnerArgs.testTargetArg}=$testTarget',
]);
debugLog('Attempting to run: $testTarget');
await runTest(newArgsWithTarget);
}
}
} finally {
await chromedriver.stop(debugLogging: debugLogging);
}
}