mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
run-tests: '--time' option provide more details to Linux users
As our tests execute in child processes, this patch uses os.times() module in replace of time.time() module to provide additional info like user time and system time spent by child's processes along with real elapsed time taken by a process. There is one limitation of this patch. It can work only for Linux users and not for Windows. "os.times" module returns a 5-tuple of a floaing point numbers. 1) User time 2) System time 3) Child's user time 4) Child's system time 5) Ellapsed real time On Windows, only the first two items are filled, the others are zero. Therefore, below test cases does not break on Windows but instead gives the zero value.
This commit is contained in:
parent
2cf0973307
commit
0a9b451708
@ -1077,6 +1077,7 @@ class TestResult(unittest._TextTestResult):
|
||||
|
||||
self.times = []
|
||||
self._started = {}
|
||||
self._stopped = {}
|
||||
|
||||
def addFailure(self, test, reason):
|
||||
self.failures.append((test, reason))
|
||||
@ -1167,17 +1168,28 @@ class TestResult(unittest._TextTestResult):
|
||||
def startTest(self, test):
|
||||
super(TestResult, self).startTest(test)
|
||||
|
||||
self._started[test.name] = time.time()
|
||||
# os.times module computes the user time and system time spent by
|
||||
# child's processes along with real elapsed time taken by a process.
|
||||
# This module has one limitation. It can only work for Linux user
|
||||
# and not for Windows.
|
||||
self._started[test.name] = os.times()
|
||||
|
||||
def stopTest(self, test, interrupted=False):
|
||||
super(TestResult, self).stopTest(test)
|
||||
|
||||
self.times.append((test.name, time.time() - self._started[test.name]))
|
||||
self._stopped[test.name] = os.times()
|
||||
|
||||
starttime = self._started[test.name]
|
||||
endtime = self._stopped[test.name]
|
||||
self.times.append((test.name, endtime[2] - starttime[2],
|
||||
endtime[3] - starttime[3], endtime[4] - starttime[4]))
|
||||
|
||||
del self._started[test.name]
|
||||
del self._stopped[test.name]
|
||||
|
||||
if interrupted:
|
||||
self.stream.writeln('INTERRUPTED: %s (after %d seconds)' % (
|
||||
test.name, self.times[-1][1]))
|
||||
test.name, self.times[-1][3]))
|
||||
|
||||
class TestSuite(unittest.TestSuite):
|
||||
"""Custom unitest TestSuite that knows how to execute Mercurial tests."""
|
||||
@ -1348,11 +1360,12 @@ class TextTestRunner(unittest.TextTestRunner):
|
||||
|
||||
def printtimes(self, times):
|
||||
self.stream.writeln('# Producing time report')
|
||||
times.sort(key=lambda t: (t[1], t[0]), reverse=True)
|
||||
cols = '%7.3f %s'
|
||||
self.stream.writeln('%-7s %s' % ('Time', 'Test'))
|
||||
for test, timetaken in times:
|
||||
self.stream.writeln(cols % (timetaken, test))
|
||||
times.sort(key=lambda t: (t[3]))
|
||||
cols = '%7.3f %7.3f %7.3f %s'
|
||||
self.stream.writeln('%-7s %-7s %-7s %s' % ('cuser', 'csys', 'real',
|
||||
'Test'))
|
||||
for test, cuser, csys, real in times:
|
||||
self.stream.writeln(cols % (cuser, csys, real, test))
|
||||
|
||||
class TestRunner(object):
|
||||
"""Holds context for executing tests.
|
||||
|
@ -201,3 +201,23 @@ No Diff
|
||||
# Ran 2 tests, 0 skipped, 0 warned, 1 failed.
|
||||
python hash seed: * (glob)
|
||||
[1]
|
||||
|
||||
test for --time
|
||||
==================
|
||||
|
||||
$ $TESTDIR/run-tests.py --with-hg=`which hg` test-success.t --time
|
||||
.
|
||||
# Ran 1 tests, 0 skipped, 0 warned, 0 failed.
|
||||
# Producing time report
|
||||
cuser csys real Test
|
||||
\s*[\d\.]{5} \s*[\d\.]{5} \s*[\d\.]{5} test-success.t (re)
|
||||
|
||||
test for --time with --job enabled
|
||||
====================================
|
||||
|
||||
$ $TESTDIR/run-tests.py --with-hg=`which hg` test-success.t --time --jobs 2
|
||||
.
|
||||
# Ran 1 tests, 0 skipped, 0 warned, 0 failed.
|
||||
# Producing time report
|
||||
cuser csys real Test
|
||||
\s*[\d\.]{5} \s*[\d\.]{5} \s*[\d\.]{5} test-success.t (re)
|
||||
|
Loading…
Reference in New Issue
Block a user