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

Side by Side Diff: telemetry/telemetry/testing/browser_test_runner_unittest.py

Issue 2700563004: [Telemetry] Migrate browser_test_runner to use typ as the test runner (Closed)
Patch Set: Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import os 5 import os
6 import string 6 import string
7 import sys 7 import sys
8 import tempfile 8 import tempfile
9 import unittest 9 import unittest
10 import json 10 import json
11 11
12 import mock
13
14 from telemetry import decorators
15 from telemetry import project_config 12 from telemetry import project_config
16 from telemetry.core import util 13 from telemetry.core import util
14 from telemetry.testing import browser_test_context
17 from telemetry.testing import browser_test_runner 15 from telemetry.testing import browser_test_runner
16 from telemetry.testing import options_for_unittests
17 from telemetry.testing import run_browser_tests
18 from telemetry.testing import serially_executed_browser_test_case 18 from telemetry.testing import serially_executed_browser_test_case
19 19
20 20
21 class BrowserTestRunnerTest(unittest.TestCase): 21 class BrowserTestRunnerTest(unittest.TestCase):
22 22
23 def baseTest(self, mockInitDependencyManager, test_filter, 23 def _ExtractTestResults(self, test_result):
24 delimiter = test_result['path_delimiter']
25 failures = []
26 successes = []
27 def _IsLeafNode(node):
28 test_dict = node[1]
29 return ('expected' in test_dict and
30 isinstance(test_dict['expected'], basestring))
31 node_queues = []
32 for t in test_result['tests']:
33 node_queues.append((t, test_result['tests'][t]))
34 while node_queues:
35 node = node_queues.pop()
36 full_test_name, test_dict = node
37 if _IsLeafNode(node):
38 if all(res not in test_dict['expected'].split() for res in
39 test_dict['actual'].split()):
40 failures.append(full_test_name)
41 else:
42 successes.append(full_test_name)
43 else:
44 for k in test_dict:
45 node_queues.append(
46 ('%s%s%s' % (full_test_name, delimiter, k),
47 test_dict[k]))
48 return successes, failures
49
50 def baseTest(self, test_filter,
24 failures, successes, test_name='SimpleTest'): 51 failures, successes, test_name='SimpleTest'):
25 options = browser_test_runner.TestRunOptions()
26 options.verbosity = 0
27 config = project_config.ProjectConfig( 52 config = project_config.ProjectConfig(
28 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), 53 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'),
29 client_configs=['a', 'b', 'c'], 54 client_configs=[],
30 benchmark_dirs=[ 55 benchmark_dirs=[
31 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] 56 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')]
32 ) 57 )
33 temp_file = tempfile.NamedTemporaryFile(delete=False) 58 temp_file = tempfile.NamedTemporaryFile(delete=False)
34 temp_file.close() 59 temp_file.close()
35 temp_file_name = temp_file.name 60 temp_file_name = temp_file.name
36 try: 61 try:
37 browser_test_runner.Run( 62 browser_test_runner.Run(
38 config, options, 63 config,
39 [test_name, 64 [test_name,
40 '--write-abbreviated-json-results-to=%s' % temp_file_name, 65 '--write-full-results-to=%s' % temp_file_name,
41 '--test-filter=%s' % test_filter]) 66 '--test-filter=%s' % test_filter])
42 mockInitDependencyManager.assert_called_with(['a', 'b', 'c'])
43 with open(temp_file_name) as f: 67 with open(temp_file_name) as f:
44 test_result = json.load(f) 68 test_result = json.load(f)
45 self.assertEquals(test_result['failures'], failures) 69
46 self.assertEquals(test_result['successes'], successes) 70 actual_successes, actual_failures = self._ExtractTestResults(test_result)
47 self.assertEquals(test_result['valid'], True) 71 self.assertEquals(set(actual_failures), set(failures))
72 self.assertEquals(set(actual_successes), set(successes))
48 finally: 73 finally:
49 os.remove(temp_file_name) 74 os.remove(temp_file_name)
50 75
51 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 76 def testJsonOutputFormatNegativeFilter(self):
52 def testJsonOutputFormatNegativeFilter(self, mockInitDependencyManager):
53 self.baseTest( 77 self.baseTest(
54 mockInitDependencyManager, '^(add|multiplier).*', 78 '^(add|multiplier).*',
55 ['add_1_and_2', 79 ['browser_tests.simple_numeric_test.SimpleTest.add_1_and_2',
56 'add_7_and_3', 80 'browser_tests.simple_numeric_test.SimpleTest.add_7_and_3',
57 'multiplier_simple_2'], 81 'browser_tests.simple_numeric_test.SimpleTest.multiplier_simple_2'],
58 ['add_2_and_3', 82 ['browser_tests.simple_numeric_test.SimpleTest.add_2_and_3',
59 'multiplier_simple', 83 'browser_tests.simple_numeric_test.SimpleTest.multiplier_simple',
60 'multiplier_simple_3']) 84 'browser_tests.simple_numeric_test.SimpleTest.multiplier_simple_3'])
61 85
62 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 86 def testJsonOutputWhenSetupClassFailed(self):
63 def testJsonOutputWhenSetupClassFailed(self, mockInitDependencyManager):
64 self.baseTest( 87 self.baseTest(
65 mockInitDependencyManager, '.*', 88 '.*',
66 ['setUpClass (browser_tests.failed_tests.SetUpClassFailedTest)'], 89 ['browser_tests.failed_tests.SetUpClassFailedTest.dummy_test_0',
90 'browser_tests.failed_tests.SetUpClassFailedTest.dummy_test_1',
91 'browser_tests.failed_tests.SetUpClassFailedTest.dummy_test_2'],
67 [], test_name='SetUpClassFailedTest') 92 [], test_name='SetUpClassFailedTest')
68 93
69 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 94 def testJsonOutputWhenTearDownClassFailed(self):
70 def testJsonOutputWhenTearDownClassFailed(self, mockInitDependencyManager):
71 self.baseTest( 95 self.baseTest(
72 mockInitDependencyManager, '.*', 96 '.*',
73 ['tearDownClass (browser_tests.failed_tests.TearDownClassFailedTest)'], 97 ['browser_tests.failed_tests.TearDownClassFailedTest.dummy_test_0',
74 sorted(['dummy_test_%i' %i for i in xrange(0, 100)]), 98 'browser_tests.failed_tests.TearDownClassFailedTest.dummy_test_1',
75 test_name='TearDownClassFailedTest') 99 'browser_tests.failed_tests.TearDownClassFailedTest.dummy_test_2'],
100 [], test_name='TearDownClassFailedTest')
76 101
77 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 102 def testSetUpProcessCalledOnce(self):
78 def testJsonOutputFormatPositiveFilter(self, mockInitDependencyManager):
79 self.baseTest( 103 self.baseTest(
80 mockInitDependencyManager, '(TestSimple|TestException).*', 104 '.*',
81 ['TestException', 'TestSimple'], []) 105 [],
106 ['browser_tests.process_tests.FailIfSetUpProcessCalledTwice.Dummy_0',
107 'browser_tests.process_tests.FailIfSetUpProcessCalledTwice.Dummy_1',
108 'browser_tests.process_tests.FailIfSetUpProcessCalledTwice.Dummy_2'],
109 test_name='FailIfSetUpProcessCalledTwice')
82 110
83 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 111 def testTearDownProcessCalledOnce(self):
84 def testExecutingTestsInSortedOrder(self, mockInitDependencyManager): 112 self.baseTest(
113 '.*',
114 [],
115 ['browser_tests.process_tests.FailIfTearDownProcessCalledTwice.Dummy_0',
116 'browser_tests.process_tests.FailIfTearDownProcessCalledTwice.Dummy_1',
117 'browser_tests.process_tests.FailIfTearDownProcessCalledTwice.Dummy_2'],
118 test_name='FailIfTearDownProcessCalledTwice')
119
120 def testJsonOutputFormatPositiveFilter(self):
121 self.baseTest(
122 '(TestSimple|TestException).*',
123 ['browser_tests.simple_numeric_test.SimpleTest.TestException',
124 'browser_tests.simple_numeric_test.SimpleTest.TestSimple'], [])
125
126 def testExecutingTestsInSortedOrder(self):
85 alphabetical_tests = [] 127 alphabetical_tests = []
86 prefix = 'Alphabetical_' 128 prefix = 'browser_tests.simple_numeric_test.SimpleTest.Alphabetical_'
87 for i in xrange(20): 129 for i in xrange(20):
88 alphabetical_tests.append(prefix + str(i)) 130 alphabetical_tests.append(prefix + str(i))
89 for c in string.uppercase[:26]: 131 for c in string.uppercase[:26]:
90 alphabetical_tests.append(prefix + c) 132 alphabetical_tests.append(prefix + c)
91 for c in string.lowercase[:26]: 133 for c in string.lowercase[:26]:
92 alphabetical_tests.append(prefix + c) 134 alphabetical_tests.append(prefix + c)
93 alphabetical_tests.sort() 135 alphabetical_tests.sort()
94 self.baseTest( 136 self.baseTest(
95 mockInitDependencyManager, 'Alphabetical', [], alphabetical_tests) 137 'Alphabetical', [], alphabetical_tests)
96 138
97 def shardingRangeTestHelper(self, total_shards, num_tests): 139 def shardingRangeTestHelper(self, total_shards, num_tests):
98 shard_ranges = [] 140 shard_ranges = []
99 for shard_index in xrange(0, total_shards): 141 for shard_index in xrange(0, total_shards):
100 shard_ranges.append(browser_test_runner._TestRangeForShard( 142 shard_ranges.append(run_browser_tests._TestRangeForShard(
101 total_shards, shard_index, num_tests)) 143 total_shards, shard_index, num_tests))
102 # Make assertions about ranges 144 # Make assertions about ranges
103 num_tests_run = 0 145 num_tests_run = 0
104 for i in xrange(0, len(shard_ranges)): 146 for i in xrange(0, len(shard_ranges)):
105 cur_range = shard_ranges[i] 147 cur_range = shard_ranges[i]
106 if i < num_tests: 148 if i < num_tests:
107 self.assertGreater(cur_range[1], cur_range[0]) 149 self.assertGreater(cur_range[1], cur_range[0])
108 num_tests_run += (cur_range[1] - cur_range[0]) 150 num_tests_run += (cur_range[1] - cur_range[0])
109 else: 151 else:
110 # Not enough tests to go around all of the shards. 152 # Not enough tests to go around all of the shards.
111 self.assertEquals(cur_range[0], cur_range[1]) 153 self.assertEquals(cur_range[0], cur_range[1])
112 # Make assertions about non-overlapping ranges 154 # Make assertions about non-overlapping ranges
113 for i in xrange(1, len(shard_ranges)): 155 for i in xrange(1, len(shard_ranges)):
114 prev_range = shard_ranges[i - 1] 156 prev_range = shard_ranges[i - 1]
115 cur_range = shard_ranges[i] 157 cur_range = shard_ranges[i]
116 self.assertEquals(prev_range[1], cur_range[0]) 158 self.assertEquals(prev_range[1], cur_range[0])
117 # Assert that we run all of the tests (very important) 159 # Assert that we run all of the tests (very important)
118 self.assertEquals(num_tests_run, num_tests) 160 self.assertEquals(num_tests_run, num_tests)
119 161
120 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 162 def testShardsWithPrimeNumTests(self):
121 def testShardsWithPrimeNumTests(self, _):
122 for total_shards in xrange(1, 20): 163 for total_shards in xrange(1, 20):
123 # Nice non-prime number 164 # Nice non-prime number
124 self.shardingRangeTestHelper(total_shards, 101) 165 self.shardingRangeTestHelper(total_shards, 101)
125 166
126 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 167 def testShardsWithDivisibleNumTests(self):
127 def testShardsWithDivisibleNumTests(self, _):
128 for total_shards in xrange(1, 6): 168 for total_shards in xrange(1, 6):
129 self.shardingRangeTestHelper(total_shards, 8) 169 self.shardingRangeTestHelper(total_shards, 8)
130 170
131 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 171 def testShardBoundaryConditions(self):
132 def testShardBoundaryConditions(self, _):
133 self.shardingRangeTestHelper(1, 0) 172 self.shardingRangeTestHelper(1, 0)
134 self.shardingRangeTestHelper(1, 1) 173 self.shardingRangeTestHelper(1, 1)
135 self.shardingRangeTestHelper(2, 1) 174 self.shardingRangeTestHelper(2, 1)
136 175
137 def baseShardingTest(self, total_shards, shard_index, failures, successes, 176 def baseShardingTest(self, total_shards, shard_index, failures, successes,
138 opt_abbr_input_json_file=None, 177 opt_abbr_input_json_file=None,
139 opt_test_filter='', 178 opt_test_filter='',
140 opt_filter_tests_after_sharding=False): 179 opt_filter_tests_after_sharding=False):
141 options = browser_test_runner.TestRunOptions()
142 options.verbosity = 0
143 config = project_config.ProjectConfig( 180 config = project_config.ProjectConfig(
144 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), 181 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'),
145 client_configs=['a', 'b', 'c'], 182 client_configs=[],
146 benchmark_dirs=[ 183 benchmark_dirs=[
147 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] 184 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')]
148 ) 185 )
149 temp_file = tempfile.NamedTemporaryFile(delete=False) 186 temp_file = tempfile.NamedTemporaryFile(delete=False)
150 temp_file.close() 187 temp_file.close()
151 temp_file_name = temp_file.name 188 temp_file_name = temp_file.name
152 opt_args = [] 189 opt_args = []
153 if opt_abbr_input_json_file: 190 if opt_abbr_input_json_file:
154 opt_args += [ 191 opt_args += [
155 '--read-abbreviated-json-results-from=%s' % opt_abbr_input_json_file] 192 '--read-abbreviated-json-results-from=%s' % opt_abbr_input_json_file]
156 if opt_test_filter: 193 if opt_test_filter:
157 opt_args += [ 194 opt_args += [
158 '--test-filter=%s' % opt_test_filter] 195 '--test-filter=%s' % opt_test_filter]
159 if opt_filter_tests_after_sharding: 196 if opt_filter_tests_after_sharding:
160 opt_args += ['--filter-tests-after-sharding'] 197 opt_args += ['--filter-tests-after-sharding']
161 try: 198 try:
162 browser_test_runner.Run( 199 browser_test_runner.Run(
163 config, options, 200 config,
164 ['SimpleShardingTest', 201 ['SimpleShardingTest',
165 '--write-abbreviated-json-results-to=%s' % temp_file_name, 202 '--write-full-results-to=%s' % temp_file_name,
166 '--total-shards=%d' % total_shards, 203 '--total-shards=%d' % total_shards,
167 '--shard-index=%d' % shard_index] + opt_args) 204 '--shard-index=%d' % shard_index] + opt_args)
168 with open(temp_file_name) as f: 205 with open(temp_file_name) as f:
169 test_result = json.load(f) 206 test_result = json.load(f)
170 self.assertEquals(test_result['failures'], failures) 207 actual_successes, actual_failures = self._ExtractTestResults(test_result)
171 self.assertEquals(test_result['successes'], successes) 208 self.assertEquals(set(actual_failures), set(failures))
172 self.assertEquals(test_result['valid'], True) 209 self.assertEquals(set(actual_successes), set(successes))
173 finally: 210 finally:
174 os.remove(temp_file_name) 211 os.remove(temp_file_name)
175 212
176 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 213 def testShardedTestRun(self):
177 def testShardedTestRun(self, _):
178 self.baseShardingTest(3, 0, [], [ 214 self.baseShardingTest(3, 0, [], [
179 'Test1', 215 'browser_tests.simple_sharding_test.SimpleShardingTest.Test1',
180 'Test2', 216 'browser_tests.simple_sharding_test.SimpleShardingTest.Test2',
181 'Test3', 217 'browser_tests.simple_sharding_test.SimpleShardingTest.Test3',
182 'passing_test_0', 218 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_0',
183 'passing_test_1', 219 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_1',
184 ]) 220 ])
185 self.baseShardingTest(3, 1, [], [ 221 self.baseShardingTest(3, 1, [], [
186 'passing_test_2', 222 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2',
187 'passing_test_3', 223 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_3',
188 'passing_test_4', 224 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_4',
189 'passing_test_5', 225 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_5',
190 ]) 226 ])
191 self.baseShardingTest(3, 2, [], [ 227 self.baseShardingTest(3, 2, [], [
192 'passing_test_6', 228 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6',
193 'passing_test_7', 229 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_7',
194 'passing_test_8', 230 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_8',
195 'passing_test_9', 231 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_9',
196 ]) 232 ])
197 233
198 def writeMockTestResultsFile(self): 234 def writeMockTestResultsFile(self):
199 mock_test_results = { 235 mock_test_results = {
200 'passes': [ 236 'passes': [
201 'Test1', 237 'Test1',
202 'Test2', 238 'Test2',
203 'Test3', 239 'Test3',
204 'passing_test_0', 240 'passing_test_0',
205 'passing_test_1', 241 'passing_test_1',
(...skipping 24 matching lines...) Expand all
230 'passing_test_9': 0.5, 266 'passing_test_9': 0.5,
231 } 267 }
232 } 268 }
233 temp_file = tempfile.NamedTemporaryFile(delete=False) 269 temp_file = tempfile.NamedTemporaryFile(delete=False)
234 temp_file.close() 270 temp_file.close()
235 temp_file_name = temp_file.name 271 temp_file_name = temp_file.name
236 with open(temp_file_name, 'w') as f: 272 with open(temp_file_name, 'w') as f:
237 json.dump(mock_test_results, f) 273 json.dump(mock_test_results, f)
238 return temp_file_name 274 return temp_file_name
239 275
240 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 276 def testSplittingShardsByTimes(self):
241 def testSplittingShardsByTimes(self, _):
242 temp_file_name = self.writeMockTestResultsFile() 277 temp_file_name = self.writeMockTestResultsFile()
243 # It seems that the sorting order of the first four tests above is: 278 # It seems that the sorting order of the first four tests above is:
244 # passing_test_0, Test1, Test2, Test3 279 # passing_test_0, Test1, Test2, Test3
245 # This is probably because the relative order of the "fixed" tests 280 # This is probably because the relative order of the "fixed" tests
246 # (starting with "Test") and the generated ones ("passing_") is 281 # (starting with "Test") and the generated ones ("passing_") is
247 # not well defined, and the sorting is stable afterward. The 282 # not well defined, and the sorting is stable afterward. The
248 # expectations have been adjusted for this fact. 283 # expectations have been adjusted for this fact.
249 try: 284 try:
250 self.baseShardingTest( 285 self.baseShardingTest(
251 4, 0, [], 286 4, 0, [],
252 ['passing_test_0', 'passing_test_1', 287 ['browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_0',
253 'passing_test_5', 'passing_test_9'], 288 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_1',
254 temp_file_name) 289 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_5',
290 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_9'
291 ], temp_file_name)
255 self.baseShardingTest( 292 self.baseShardingTest(
256 4, 1, [], 293 4, 1, [],
257 ['Test1', 'passing_test_2', 'passing_test_6'], 294 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test1',
258 temp_file_name) 295 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2',
296 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6'
297 ], temp_file_name)
259 self.baseShardingTest( 298 self.baseShardingTest(
260 4, 2, [], 299 4, 2, [],
261 ['Test2', 'passing_test_3', 'passing_test_7'], 300 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test2',
262 temp_file_name) 301 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_3',
302 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_7'
303 ], temp_file_name)
263 self.baseShardingTest( 304 self.baseShardingTest(
264 4, 3, [], 305 4, 3, [],
265 ['Test3', 'passing_test_4', 'passing_test_8'], 306 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test3',
266 temp_file_name) 307 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_4',
308 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_8'
309 ], temp_file_name)
267 finally: 310 finally:
268 os.remove(temp_file_name) 311 os.remove(temp_file_name)
269 312
270 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 313 def testFilteringAfterSharding(self):
271 def testFilteringAfterSharding(self, _):
272 temp_file_name = self.writeMockTestResultsFile() 314 temp_file_name = self.writeMockTestResultsFile()
273 try: 315 try:
274 self.baseShardingTest( 316 self.baseShardingTest(
275 4, 1, [], 317 4, 1, [],
276 ['Test1', 'passing_test_2', 'passing_test_6'], 318 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test1',
277 temp_file_name, 319 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2',
320 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6'
321 ], temp_file_name,
278 opt_test_filter='(Test1|passing_test_2|passing_test_6)', 322 opt_test_filter='(Test1|passing_test_2|passing_test_6)',
279 opt_filter_tests_after_sharding=True) 323 opt_filter_tests_after_sharding=True)
280 finally: 324 finally:
281 os.remove(temp_file_name) 325 os.remove(temp_file_name)
282 326
283 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') 327 def testMedianComputation(self):
284 def testMedianComputation(self, _): 328 self.assertEquals(2.0, run_browser_tests._MedianTestTime(
285 self.assertEquals(2.0, browser_test_runner._MedianTestTime(
286 {'test1': 2.0, 'test2': 7.0, 'test3': 1.0})) 329 {'test1': 2.0, 'test2': 7.0, 'test3': 1.0}))
287 self.assertEquals(2.0, browser_test_runner._MedianTestTime( 330 self.assertEquals(2.0, run_browser_tests._MedianTestTime(
288 {'test1': 2.0})) 331 {'test1': 2.0}))
289 self.assertEquals(0.0, browser_test_runner._MedianTestTime({})) 332 self.assertEquals(0.0, run_browser_tests._MedianTestTime({}))
290 self.assertEqual(4.0, browser_test_runner._MedianTestTime( 333 self.assertEqual(4.0, run_browser_tests._MedianTestTime(
291 {'test1': 2.0, 'test2': 6.0, 'test3': 1.0, 'test4': 8.0})) 334 {'test1': 2.0, 'test2': 6.0, 'test3': 1.0, 'test4': 8.0}))
292 335
293 336
294 class Algebra( 337 class Algebra(
295 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): 338 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase):
296 339
297 @classmethod 340 @classmethod
298 def GenerateTestCases_Simple(cls, options): 341 def GenerateTestCases_Simple(cls, options):
299 del options # Unused. 342 del options # Unused.
300 yield 'testOne', (1, 2) 343 yield 'testOne', (1, 2)
301 yield 'testTwo', (3, 3) 344 yield 'testTwo', (3, 3)
302 345
303 def Simple(self, x, y): 346 def Simple(self, x, y):
304 self.assertEquals(x, y) 347 self.assertEquals(x, y)
305 348
306 def TestNumber(self): 349 def TestNumber(self):
307 self.assertEquals(0, 1) 350 self.assertEquals(0, 1)
308 351
309 352
310 class Geometric( 353 class ErrorneousGeometric(
311 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): 354 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase):
312 355
313 @classmethod 356 @classmethod
314 def GenerateTestCases_Compare(cls, options): 357 def GenerateTestCases_Compare(cls, options):
315 del options # Unused. 358 del options # Unused.
359 assert False, 'I am a problematic generator'
316 yield 'testBasic', ('square', 'circle') 360 yield 'testBasic', ('square', 'circle')
317 361
318 def Compare(self, x, y): 362 def Compare(self, x, y):
319 self.assertEquals(x, y) 363 self.assertEquals(x, y)
320 364
321 def TestAngle(self): 365 def TestAngle(self):
322 self.assertEquals(90, 450) 366 self.assertEquals(90, 450)
323 367
324 class TestLoadAllTestModules(unittest.TestCase): 368 class TestLoadAllTestModules(unittest.TestCase):
325 # TODO(nedn): this need to be updated after
326 # https://codereview.chromium.org/2590623002/ is landed so that
327 # LoadAllTestsInModule actually return tests.
328 @decorators.Disabled('all')
329 def testLoadAllTestsInModule(self): 369 def testLoadAllTestsInModule(self):
330 tests = serially_executed_browser_test_case.LoadAllTestsInModule( 370 context = browser_test_context.TypTestContext()
331 sys.modules[__name__]) 371 context.finder_options = options_for_unittests.GetCopy()
332 self.assertEquals(sorted([t.id() for t in tests]), 372 context.test_class = Algebra
333 ['telemetry.testing.browser_test_runner_unittest.Algebra.TestNumber', 373 context.test_case_ids_to_run.add(
334 'telemetry.testing.browser_test_runner_unittest.Algebra.testOne', 374 'telemetry.testing.browser_test_runner_unittest.Algebra.TestNumber')
335 'telemetry.testing.browser_test_runner_unittest.Algebra.testTwo', 375 context.test_case_ids_to_run.add(
336 'telemetry.testing.browser_test_runner_unittest.Geometric.TestAngle', 376 'telemetry.testing.browser_test_runner_unittest.Algebra.testOne')
337 'telemetry.testing.browser_test_runner_unittest.Geometric.testBasic']) 377 context.Freeze()
378 browser_test_context._global_test_context = context
379 try:
380 # This should not invoke GenerateTestCases of ErrorneousGeometric class,
381 # otherwise that would throw Exception.
382 tests = serially_executed_browser_test_case.LoadAllTestsInModule(
383 sys.modules[__name__])
384 self.assertEquals(sorted([t.id() for t in tests]),
385 ['telemetry.testing.browser_test_runner_unittest.Algebra.TestNumber',
386 'telemetry.testing.browser_test_runner_unittest.Algebra.testOne'])
387 finally:
388 browser_test_context._global_test_context = None
OLDNEW
« no previous file with comments | « telemetry/telemetry/testing/browser_test_runner.py ('k') | telemetry/telemetry/testing/run_browser_tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698