# HG changeset patch # User Gregory Szorc # Date 1398037485 25200 # Node ID d19164a018a175cda640066a1f32651834e4f011 # Parent c908ff8875897765904a7a7ffcf5645821c1571f run-tests: execute tests via unittest Now that unittest mode is functionally equivalent to the default mode, we switch the default execution mode to unittest and remove the choice of different execution modes. diff -r c908ff887589 -r d19164a018a1 tests/run-tests.py --- a/tests/run-tests.py Tue Apr 22 13:37:27 2014 -0700 +++ b/tests/run-tests.py Sun Apr 20 16:44:45 2014 -0700 @@ -188,9 +188,6 @@ parser.add_option("--tmpdir", type="string", help="run tests in the given temporary directory" " (implies --keep-tmpdir)") - parser.add_option("--unittest", action="store_true", - help="run tests with Python's unittest package" - " (this is an experimental feature)") parser.add_option("-v", "--verbose", action="store_true", help="output verbose messages") parser.add_option("--view", type="string", @@ -340,7 +337,7 @@ # Status code reserved for skipped tests (used by hghave). SKIPPED_STATUS = 80 - def __init__(self, runner, test, count, refpath, unittest=False): + def __init__(self, runner, test, count, refpath): path = os.path.join(runner.testdir, test) errpath = os.path.join(runner.testdir, '%s.err' % test) @@ -354,7 +351,6 @@ self._daemonpids = [] self._refpath = refpath self._errpath = errpath - self._unittest = unittest self._finished = None self._ret = None @@ -412,9 +408,6 @@ This will return a tuple describing the result of the test. """ - if not self._unittest: - self.setUp() - if not os.path.exists(self._path): return self.skip("Doesn't exist") @@ -518,9 +511,6 @@ else: self._result = self.success() - if not self._unittest: - self.tearDown() - return self._result def tearDown(self): @@ -541,14 +531,6 @@ vlog("# Ret was:", self._ret) - # Don't print progress in unittest mode because that is handled - # by TestResult. - if not self._options.verbose and not self._unittest: - iolock.acquire() - sys.stdout.write(self._result[0]) - sys.stdout.flush() - iolock.release() - self._runner.times.append((self.name, self._duration)) def _run(self, replacements, env): @@ -649,30 +631,18 @@ return '.', self.name, '' - if self._unittest: - if warned: - raise WarnTest(msg) - else: - # unittest differentiates between errored and failed. - # Failed is denoted by AssertionError (by default at least). - raise AssertionError(msg) - - return warned and '~' or '!', self.name, msg + if warned: + raise WarnTest(msg) + else: + # unittest differentiates between errored and failed. + # Failed is denoted by AssertionError (by default at least). + raise AssertionError(msg) def skip(self, msg): - if self._unittest: - raise SkipTest(msg) - - if self._options.verbose: - log("\nSkipping %s: %s" % (self._path, msg)) - - return 's', self.name, msg + raise SkipTest(msg) def ignore(self, msg): - if self._unittest: - raise IgnoreTest(msg) - - return 'i', self.name, msg + raise IgnoreTest(msg) class PythonTest(Test): """A Python-based test.""" @@ -1372,43 +1342,17 @@ print "running all tests" tests = orig - tests = [self._gettest(t, i, asunit=self.options.unittest) - for i, t in enumerate(tests)] + tests = [self._gettest(t, i) for i, t in enumerate(tests)] failed = False warned = False - if self.options.unittest: - suite = TestSuite(self, tests=tests) - verbosity = 1 - if self.options.verbose: - verbosity = 2 - runner = TextTestRunner(self, verbosity=verbosity) - runner.run(suite) - else: - self._executetests(tests) - - failed = len(self.results['!']) - warned = len(self.results['~']) - tested = len(self.results['.']) + failed + warned - skipped = len(self.results['s']) - ignored = len(self.results['i']) - - print - if not self.options.noskips: - for s in self.results['s']: - print "Skipped %s: %s" % s - for s in self.results['~']: - print "Warned %s: %s" % s - for s in self.results['!']: - print "Failed %s: %s" % s - self._checkhglib("Tested") - print "# Ran %d tests, %d skipped, %d warned, %d failed." % ( - tested, skipped + ignored, warned, failed) - if self.results['!']: - print 'python hash seed:', os.environ['PYTHONHASHSEED'] - if self.options.time: - self._outputtimes() + suite = TestSuite(self, tests=tests) + verbosity = 1 + if self.options.verbose: + verbosity = 2 + runner = TextTestRunner(self, verbosity=verbosity) + runner.run(suite) if self.options.anycoverage: self._outputcoverage() @@ -1421,7 +1365,7 @@ if warned: return 80 - def _gettest(self, test, count, asunit=False): + def _gettest(self, test, count): """Obtain a Test by looking at its filename. Returns a Test instance. The Test may not be runnable if it doesn't @@ -1438,10 +1382,7 @@ refpath = os.path.join(self.testdir, test + out) break - t = testcls(self, test, count, refpath, unittest=asunit) - - if not asunit: - return t + t = testcls(self, test, count, refpath) class MercurialTest(unittest.TestCase): def __init__(self, name, *args, **kwargs): @@ -1500,11 +1441,7 @@ result.stopTest(self) def runTest(self): - code, tname, msg = t.run() - - # All non-success conditions should be exceptions and should - # be caught in run(). - assert code == '.' + t.run() # We need this proxy until tearDown() is implemented. def cleanup(self): @@ -1700,8 +1637,8 @@ os.mkdir(adir) covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit) - def _executetests(self, tests, result=None): - # We copy because we modify the list. + def _executetests(self, tests, result): + # We modify the list, so copy so callers aren't confused. tests = list(tests) jobs = self.options.jobs @@ -1710,15 +1647,8 @@ def job(test, result): try: - # If in unittest mode. - if result: - test(result) - # We need to put something here to make the logic happy. - # This will get cleaned up later. - done.put(('u', None, None)) - else: - done.put(test.run()) - test.cleanup() + test(result) + done.put(('u', None, None)) except KeyboardInterrupt: pass except: # re-raises