Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Unified Diff: telemetry/telemetry/testing/browser_test_runner_unittest.py

Issue 2065853002: Add sharding support to browser_test_runner. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/catapult-project/catapult.git@master
Patch Set: Rebased. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: telemetry/telemetry/testing/browser_test_runner_unittest.py
diff --git a/telemetry/telemetry/testing/browser_test_runner_unittest.py b/telemetry/telemetry/testing/browser_test_runner_unittest.py
index a9e96cc50b924d9c41df9fdf78ba19b626bdc477..cdfbdc300bf7f6367be54c28a9faf736b82659f4 100644
--- a/telemetry/telemetry/testing/browser_test_runner_unittest.py
+++ b/telemetry/telemetry/testing/browser_test_runner_unittest.py
@@ -77,3 +77,92 @@ class BrowserTestRunnerTest(unittest.TestCase):
alphabetical_tests.sort()
self.baseTest(
mockInitDependencyManager, 'Alphabetical', [], alphabetical_tests)
+
+ def shardingRangeTestHelper(self, total_shards, num_tests):
+ shard_ranges = []
+ for shard_index in xrange(0, total_shards):
+ shard_ranges.append(browser_test_runner.TestRangeForShard(
+ total_shards, shard_index, num_tests))
+ # Make assertions about ranges
+ num_tests_run = 0
+ for i in xrange(0, len(shard_ranges)):
+ cur_range = shard_ranges[i]
+ if i < num_tests:
+ self.assertGreater(cur_range[1], cur_range[0])
+ num_tests_run += (cur_range[1] - cur_range[0])
+ else:
+ # Not enough tests to go around all of the shards.
+ self.assertEquals(cur_range[0], cur_range[1])
+ # Make assertions about non-overlapping ranges
+ for i in xrange(1, len(shard_ranges)):
+ prev_range = shard_ranges[i - 1]
+ cur_range = shard_ranges[i]
+ self.assertEquals(prev_range[1], cur_range[0])
+ # Assert that we run all of the tests (very important)
+ self.assertEquals(num_tests_run, num_tests)
+
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager')
+ def testShardsWithPrimeNumTests(self, _):
+ for total_shards in xrange(1, 20):
+ # Nice non-prime number
+ self.shardingRangeTestHelper(total_shards, 101)
+
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager')
+ def testShardsWithDivisibleNumTests(self, _):
+ for total_shards in xrange(1, 6):
+ self.shardingRangeTestHelper(total_shards, 8)
+
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager')
+ def testShardBoundaryConditions(self, _):
+ self.shardingRangeTestHelper(1, 0)
+ self.shardingRangeTestHelper(1, 1)
+ self.shardingRangeTestHelper(2, 1)
+
+ def baseShardingTest(self, total_shards, shard_index, failures, successes):
+ options = browser_test_runner.TestRunOptions()
+ options.verbosity = 0
+ config = project_config.ProjectConfig(
+ top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'),
+ client_configs=['a', 'b', 'c'],
+ benchmark_dirs=[
+ os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')]
+ )
+ temp_file = tempfile.NamedTemporaryFile(delete=False)
+ temp_file.close()
+ temp_file_name = temp_file.name
+ try:
+ browser_test_runner.Run(
+ config, options,
+ ['SimpleShardingTest',
+ '--write-abbreviated-json-results-to=%s' % temp_file_name,
+ '--total-shards=%d' % total_shards,
+ '--shard-index=%d' % shard_index])
+ with open(temp_file_name) as f:
+ test_result = json.load(f)
+ self.assertEquals(test_result['failures'], failures)
+ self.assertEquals(test_result['successes'], successes)
+ self.assertEquals(test_result['valid'], True)
+ finally:
+ os.remove(temp_file_name)
+
+ @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager')
+ def testShardedTestRun(self, _):
+ self.baseShardingTest(3, 0, [], [
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.Test1',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.Test2',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.Test3',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_0',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_1',
+ ])
+ self.baseShardingTest(3, 1, [], [
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_3',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_4',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_5',
+ ])
+ self.baseShardingTest(3, 2, [], [
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_7',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_8',
+ 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_9',
+ ])

Powered by Google App Engine
This is Rietveld 408576698