Index: tools/telemetry/telemetry/unittest/run_tests.py |
diff --git a/tools/telemetry/telemetry/unittest/run_tests.py b/tools/telemetry/telemetry/unittest/run_tests.py |
index bc36e2b0653b524d89c4cfddd0663963123ef92f..570aa359added1b938b437b5c1204d973df98faf 100644 |
--- a/tools/telemetry/telemetry/unittest/run_tests.py |
+++ b/tools/telemetry/telemetry/unittest/run_tests.py |
@@ -126,6 +126,9 @@ class RunTestsCommand(command_line.OptparseCommand): |
dest='run_disabled_tests', |
action='store_true', default=False, |
help='Ignore @Disabled and @Enabled restrictions.') |
+ parser.add_option('--retry-limit', type='int', default=0, |
+ help='Retry each failure up to N times (default %default)' |
+ ' to de-flake things.') |
json_results.AddOptions(parser) |
@classmethod |
@@ -147,16 +150,36 @@ class RunTestsCommand(command_line.OptparseCommand): |
def Run(self, args): |
possible_browser = browser_finder.FindBrowser(args) |
- test_suite = DiscoverTests( |
- config.test_dirs, config.top_level_dir, possible_browser, |
- args.positional_args, args.run_disabled_tests) |
- runner = output_formatter.TestRunner() |
- result = runner.run( |
- test_suite, config.output_formatters, args.repeat_count, args) |
- json_results.WriteandUploadResultsIfNecessary(args, test_suite, result) |
+ test_suite, result = self.RunOneSuite(possible_browser, args) |
+ |
+ results = [result] |
+ |
+ failed_tests = json_results.FailedTestNames(result) |
+ retry_limit = args.retry_limit |
+ |
+ while retry_limit and failed_tests: |
+ args.positional_args = failed_tests |
+ |
+ _, result = self.RunOneSuite(possible_browser, args) |
+ results.append(result) |
- return len(result.failures_and_errors) |
+ failed_tests = json_results.FailedTestNames(result) |
+ retry_limit -= 1 |
+ |
+ full_results = json_results.FullResults(args, test_suite, results) |
+ json_results.WriteFullResultsIfNecessary(args, full_results) |
+ |
+ return json_results.ExitCodeFromFullResults(full_results) |
+ |
+ def RunOneSuite(self, possible_browser, args): |
+ test_suite = DiscoverTests(config.test_dirs, config.top_level_dir, |
+ possible_browser, args.positional_args, |
+ args.run_disabled_tests) |
+ runner = output_formatter.TestRunner() |
+ result = runner.run(test_suite, config.output_formatters, |
+ args.repeat_count, args) |
+ return test_suite, result |
@classmethod |
@RestoreLoggingLevel |