comparison tests/run-tests.py @ 24329:e7ca4d4b10e1

run-tests: add --runs-per-test flag This is useful when you're working with a flaky test and want to run it (for example) 500 times to see if it'll false-fail. This currently breaks if you use it with more than one thread, but I'm looking into that now.
author Augie Fackler <augie@google.com>
date Fri, 13 Mar 2015 11:21:53 -0400
parents 6ddc86eedc3b
children 799bc18e14d1
comparison
equal deleted inserted replaced
24328:603a8d09e12d 24329:e7ca4d4b10e1
168 help="run tests matching keywords") 168 help="run tests matching keywords")
169 parser.add_option("-l", "--local", action="store_true", 169 parser.add_option("-l", "--local", action="store_true",
170 help="shortcut for --with-hg=<testdir>/../hg") 170 help="shortcut for --with-hg=<testdir>/../hg")
171 parser.add_option("--loop", action="store_true", 171 parser.add_option("--loop", action="store_true",
172 help="loop tests repeatedly") 172 help="loop tests repeatedly")
173 parser.add_option("--runs-per-test", type="int", dest="runs_per_test",
174 help="run each test N times (default=1)", default=1)
173 parser.add_option("-n", "--nodiff", action="store_true", 175 parser.add_option("-n", "--nodiff", action="store_true",
174 help="skip showing test changes") 176 help="skip showing test changes")
175 parser.add_option("-p", "--port", type="int", 177 parser.add_option("-p", "--port", type="int",
176 help="port on which servers should listen" 178 help="port on which servers should listen"
177 " (default: $%s or %d)" % defaults['port']) 179 " (default: $%s or %d)" % defaults['port'])
1286 1288
1287 class TestSuite(unittest.TestSuite): 1289 class TestSuite(unittest.TestSuite):
1288 """Custom unittest TestSuite that knows how to execute Mercurial tests.""" 1290 """Custom unittest TestSuite that knows how to execute Mercurial tests."""
1289 1291
1290 def __init__(self, testdir, jobs=1, whitelist=None, blacklist=None, 1292 def __init__(self, testdir, jobs=1, whitelist=None, blacklist=None,
1291 retest=False, keywords=None, loop=False, 1293 retest=False, keywords=None, loop=False, runs_per_test=1,
1292 *args, **kwargs): 1294 *args, **kwargs):
1293 """Create a new instance that can run tests with a configuration. 1295 """Create a new instance that can run tests with a configuration.
1294 1296
1295 testdir specifies the directory where tests are executed from. This 1297 testdir specifies the directory where tests are executed from. This
1296 is typically the ``tests`` directory from Mercurial's source 1298 is typically the ``tests`` directory from Mercurial's source
1321 self._whitelist = whitelist 1323 self._whitelist = whitelist
1322 self._blacklist = blacklist 1324 self._blacklist = blacklist
1323 self._retest = retest 1325 self._retest = retest
1324 self._keywords = keywords 1326 self._keywords = keywords
1325 self._loop = loop 1327 self._loop = loop
1328 self._runs_per_test = runs_per_test
1326 1329
1327 def run(self, result): 1330 def run(self, result):
1328 # We have a number of filters that need to be applied. We do this 1331 # We have a number of filters that need to be applied. We do this
1329 # here instead of inside Test because it makes the running logic for 1332 # here instead of inside Test because it makes the running logic for
1330 # Test simpler. 1333 # Test simpler.
1354 ignored = True 1357 ignored = True
1355 break 1358 break
1356 1359
1357 if ignored: 1360 if ignored:
1358 continue 1361 continue
1359 1362 for _ in xrange(self._runs_per_test):
1360 tests.append(test) 1363 tests.append(test)
1361 1364
1362 runtests = list(tests) 1365 runtests = list(tests)
1363 done = queue.Queue() 1366 done = queue.Queue()
1364 running = 0 1367 running = 0
1365 1368
1727 whitelist=self.options.whitelisted, 1730 whitelist=self.options.whitelisted,
1728 blacklist=self.options.blacklist, 1731 blacklist=self.options.blacklist,
1729 retest=self.options.retest, 1732 retest=self.options.retest,
1730 keywords=self.options.keywords, 1733 keywords=self.options.keywords,
1731 loop=self.options.loop, 1734 loop=self.options.loop,
1735 runs_per_test=self.options.runs_per_test,
1732 tests=tests) 1736 tests=tests)
1733 verbosity = 1 1737 verbosity = 1
1734 if self.options.verbose: 1738 if self.options.verbose:
1735 verbosity = 2 1739 verbosity = 2
1736 runner = TextTestRunner(self, verbosity=verbosity) 1740 runner = TextTestRunner(self, verbosity=verbosity)