run_tests.py revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
1# Copyright (c) 2012 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4import logging 5import unittest 6 7from telemetry.core import browser_options 8from telemetry.core import discover 9from telemetry.core import util 10from telemetry.unittest import gtest_testrunner 11from telemetry.unittest import options_for_unittests 12 13def Discover(start_dir, top_level_dir=None, pattern='test*.py'): 14 loader = unittest.defaultTestLoader 15 loader.suiteClass = gtest_testrunner.GTestTestSuite 16 subsuites = [] 17 18 modules = discover.DiscoverModules(start_dir, top_level_dir, pattern) 19 for module in modules: 20 if hasattr(module, 'suite'): 21 new_suite = module.suite() 22 else: 23 new_suite = loader.loadTestsFromModule(module) 24 if new_suite.countTestCases(): 25 subsuites.append(new_suite) 26 return gtest_testrunner.GTestTestSuite(subsuites) 27 28 29def FilterSuite(suite, predicate): 30 new_suite = suite.__class__() 31 for x in suite: 32 if isinstance(x, unittest.TestSuite): 33 subsuite = FilterSuite(x, predicate) 34 if subsuite.countTestCases() == 0: 35 continue 36 37 new_suite.addTest(subsuite) 38 continue 39 40 assert isinstance(x, unittest.TestCase) 41 if predicate(x): 42 new_suite.addTest(x) 43 44 return new_suite 45 46 47def DiscoverAndRunTests( 48 dir_name, args, top_level_dir, 49 runner=None, run_disabled_tests=False): 50 if not runner: 51 runner = gtest_testrunner.GTestTestRunner(inner=True) 52 53 suite = Discover(dir_name, top_level_dir, '*_unittest.py') 54 55 def IsTestSelected(test): 56 if len(args) != 0: 57 found = False 58 for name in args: 59 if name in test.id(): 60 found = True 61 if not found: 62 return False 63 64 if hasattr(test, '_testMethodName'): 65 method = getattr(test, test._testMethodName) # pylint: disable=W0212 66 if hasattr(method, '_requires_browser_types'): 67 types = method._requires_browser_types # pylint: disable=W0212 68 if options_for_unittests.GetBrowserType() not in types: 69 logging.debug('Skipping test %s because it requires %s' % 70 (test.id(), types)) 71 return False 72 if hasattr(method, '_disabled_test'): 73 if not run_disabled_tests: 74 return False 75 76 return True 77 78 filtered_suite = FilterSuite(suite, IsTestSelected) 79 test_result = runner.run(filtered_suite) 80 return test_result 81 82 83def Main(args, start_dir, top_level_dir, runner=None): 84 """Unit test suite that collects all test cases for telemetry.""" 85 # Add unittest_data to the path so we can import packages from it. 86 util.AddDirToPythonPath(util.GetUnittestDataDir()) 87 88 default_options = browser_options.BrowserFinderOptions() 89 default_options.browser_type = 'any' 90 91 parser = default_options.CreateParser('run_tests [options] [test names]') 92 parser.add_option('--repeat-count', dest='run_test_repeat_count', 93 type='int', default=1, 94 help='Repeats each a provided number of times.') 95 parser.add_option('-d', '--also-run-disabled-tests', 96 dest='run_disabled_tests', 97 action='store_true', default=False, 98 help='Also run tests decorated with @DisabledTest.') 99 100 _, args = parser.parse_args(args) 101 102 logging_level = logging.getLogger().getEffectiveLevel() 103 if default_options.verbosity == 0: 104 logging.getLogger().setLevel(logging.WARN) 105 106 from telemetry.core import browser_finder 107 try: 108 browser_to_create = browser_finder.FindBrowser(default_options) 109 except browser_finder.BrowserFinderException, ex: 110 logging.error(str(ex)) 111 return 1 112 113 if browser_to_create == None: 114 logging.error('No browser found of type %s. Cannot run tests.', 115 default_options.browser_type) 116 logging.error('Re-run with --browser=list to see available browser types.') 117 return 1 118 119 options_for_unittests.Set(default_options, 120 browser_to_create.browser_type) 121 try: 122 success = True 123 for _ in range( 124 default_options.run_test_repeat_count): # pylint: disable=E1101 125 success = success and DiscoverAndRunTests( 126 start_dir, args, top_level_dir, 127 runner, default_options.run_disabled_tests) 128 if success: 129 return 0 130 finally: 131 options_for_unittests.Set(None, None) 132 if default_options.verbosity == 0: 133 # Restore logging level. 134 logging.getLogger().setLevel(logging_level) 135 136 return 1 137