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

Unified Diff: install_test/install_test.py

Issue 11234068: Unittest filtering (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/test/
Patch Set: Created 8 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: install_test/install_test.py
===================================================================
--- install_test/install_test.py (revision 163625)
+++ install_test/install_test.py (working copy)
@@ -11,6 +11,7 @@
"""
import atexit
+import fnmatch
import logging
import optparse
import os
@@ -250,6 +251,9 @@
parser.add_option(
'--install-type', type='string', default='user', dest='install_type',
help='Type of installation (i.e., user, system, or both)')
+ parser.add_option(
+ '-f', '--filter', type='string', default=None, dest='filter',
+ help='Filter that specifies the test or testsuite to run.')
self._opts, self._args = parser.parse_args()
self._ValidateArgs()
if(self._opts.install_type == 'system' or
@@ -262,10 +266,11 @@
update_builds = (self._opts.update_builds.split(',') if
self._opts.update_builds else [])
options = self._opts.options.split(',') if self._opts.options else []
- InstallTest.InitTestFixture(self._opts.install_build,
- update_builds,
- self._opts.url,
- options)
+ InstallTest.InitTestFixture(self._opts.install_build, update_builds,
+ self._opts.url, options)
+ self._mod_name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
+ if os.path.dirname(sys.argv[0]) not in sys.path:
kkania 2012/10/24 15:19:54 I think this is unnecessary. sys.argv[0] was just
nkang 2012/10/24 23:35:14 I agree. I was thinking the same thing that it sho
+ sys.path.append(os.path.dirname(sys.argv[0]))
def _ValidateArgs(self):
"""Verifies the sanity of the command arguments.
@@ -290,16 +295,99 @@
log_format = '%(asctime)s %(levelname)-8s %(message)s'
logging.basicConfig(level=logging.INFO, format=log_format)
- def _GetTests(self):
- """Returns a list of unittests from the calling script."""
- mod_name = [os.path.splitext(os.path.basename(sys.argv[0]))[0]]
- if os.path.dirname(sys.argv[0]) not in sys.path:
- sys.path.append(os.path.dirname(sys.argv[0]))
- return unittest.defaultTestLoader.loadTestsFromNames(mod_name)
+ def _GetFilteredTests(self):
kkania 2012/10/24 15:19:54 move this whole Main class out to a new file, call
nkang 2012/10/24 23:35:14 Moved Main to a new file called run_install_tests.
+ """Returns a list of filtered unittests from the calling script."""
+ all_tests = unittest.defaultTestLoader.loadTestsFromName(self._mod_name)
+ return self._FilterTestSuite(all_tests, self._opts.filter)
+ def _GetTestsFromSuite(self, suite):
+ """Returns all the tests from a given test suite.
+
+ Args:
+ suite: A unittest.TestSuite object.
+
+ Returns:
+ A list that contains all the tests found in the suite.
+ """
+ tests = []
+ for test in suite:
+ if isinstance(test, unittest.TestSuite):
+ tests += self._GetTestsFromSuite(test)
+ else:
+ tests += [test]
+ return tests
+
+ def _GetTestName(self, test):
+ """Gets the test name of the given unittest test.
+
+ Args:
+ test: A unittest test.
+
+ Returns:
+ A string representing the full test name.
+ """
+ return '.'.join([test.__module__, test.__class__.__name__,
+ test._testMethodName])
+
+ def _FilterTestSuite(self, suite, gtest_filter):
+ """Returns a new filtered test suite based on the given gtest filter.
+
+ See http://code.google.com/p/googletest/wiki/AdvancedGuide for
+ gtest_filter specification.
+
+ Args:
+ suite: A unittest.TestSuite object, which can be obtained by calling
+ |unittest.defaultTestLoader.loadTestsFromName|.
+ gtest_filter: The gtest filter to use. Filter can be passed as follows:
+ --filter=*className* or --filter=*testcaseName.
+
+ Returns:
+ A unittest.TestSuite object that contains tests that match the gtest
+ filter.
+ """
+ return unittest.TestSuite(
+ self._FilterTests(self._GetTestsFromSuite(suite), gtest_filter))
+
+ def _FilterTests(self, all_tests, gtest_filter):
+ """Returns a filtered list of tests based on the given gtest filter.
+
+ Args:
+ all_tests: A list that contains all unittests in a given suite. This
+ list must be obtained by calling |_GetTestsFromSuite|.
+ gtest_filter: The gtest filter to use. Filter can be passed as follows:
+ *className* or *testcaseName.
+
+ Returns:
+ A list that contains all tests that match the given gtest filter.
+ """
+ pattern_groups = gtest_filter.split('-')
+ positive_patterns = pattern_groups[0].split(':')
+ negative_patterns = None
+ if len(pattern_groups) > 1:
+ negative_patterns = pattern_groups[1].split(':')
+ tests = []
+ for test in all_tests:
+ test_name = self._GetTestName(test)
+ # Test name must by matched by one positive pattern.
+ for pattern in positive_patterns:
+ if fnmatch.fnmatch(test_name, pattern):
+ break
+ else:
+ continue
+ # Test name must not be matched by any negative patterns.
+ for pattern in negative_patterns or []:
+ if fnmatch.fnmatch(test_name, pattern):
+ break
+ else:
+ tests += [test]
+ return tests
+
def _Run(self):
"""Runs the unit tests."""
- tests = self._GetTests()
+ if self._opts.filter:
+ tests = self._GetFilteredTests()
+ else:
+ tests = unittest.defaultTestLoader.loadTestsFromName(self._mod_name)
result = pyauto_utils.GTestTextTestRunner(verbosity=1).run(tests)
del(tests)
if not result.wasSuccessful():
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698