[Python-checkins] bpo-33718: regrtest: use format_duration() to display failed tests (GH-7686)
Victor Stinner
webhook-mailer at python.org
Thu Jun 14 08:58:24 EDT 2018
https://github.com/python/cpython/commit/4ffe9c2b251f6e027b26250b7a2618e78d4edd22
commit: 4ffe9c2b251f6e027b26250b7a2618e78d4edd22
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-06-14T14:58:13+02:00
summary:
bpo-33718: regrtest: use format_duration() to display failed tests (GH-7686)
* Enhance also format_duration(): work on integers and rounds towards
+infinity (math.ceil).
* Write unit tests on format_duration()
files:
M Lib/test/libregrtest/runtest_mp.py
M Lib/test/libregrtest/utils.py
M Lib/test/test_regrtest.py
diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py
index f7fa10cf551a..907451cf6311 100644
--- a/Lib/test/libregrtest/runtest_mp.py
+++ b/Lib/test/libregrtest/runtest_mp.py
@@ -200,7 +200,7 @@ def get_running(workers):
if (ok not in (CHILD_ERROR, INTERRUPTED)
and test_time >= PROGRESS_MIN_TIME
and not regrtest.ns.pgo):
- text += ' (%.0f sec)' % test_time
+ text += ' (%s)' % format_duration(test_time)
elif ok == CHILD_ERROR:
text = '%s (%s)' % (text, test_time)
running = get_running(workers)
diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py
index 85049cb06b36..d36bf9196626 100644
--- a/Lib/test/libregrtest/utils.py
+++ b/Lib/test/libregrtest/utils.py
@@ -1,19 +1,28 @@
import os.path
+import math
import textwrap
def format_duration(seconds):
- if seconds < 1.0:
- return '%.0f ms' % (seconds * 1e3)
- if seconds < 60.0:
- return '%.0f sec' % seconds
+ ms = math.ceil(seconds * 1e3)
+ seconds, ms = divmod(ms, 1000)
+ minutes, seconds = divmod(seconds, 60)
+ hours, minutes = divmod(minutes, 60)
- minutes, seconds = divmod(seconds, 60.0)
- hours, minutes = divmod(minutes, 60.0)
+ parts = []
if hours:
- return '%.0f hour %.0f min' % (hours, minutes)
- else:
- return '%.0f min %.0f sec' % (minutes, seconds)
+ parts.append('%s hour' % hours)
+ if minutes:
+ parts.append('%s min' % minutes)
+ if seconds:
+ parts.append('%s sec' % seconds)
+ if ms:
+ parts.append('%s ms' % ms)
+ if not parts:
+ return '0 ms'
+
+ parts = parts[:2]
+ return ' '.join(parts)
def removepy(names):
diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
index 10411522dffb..af332ad15d92 100644
--- a/Lib/test/test_regrtest.py
+++ b/Lib/test/test_regrtest.py
@@ -19,6 +19,7 @@
import unittest
from test import libregrtest
from test import support
+from test.libregrtest import utils
Py_DEBUG = hasattr(sys, 'getobjects')
@@ -980,5 +981,29 @@ def test_bug(self):
failed=testname, rerun=testname)
+class TestUtils(unittest.TestCase):
+ def test_format_duration(self):
+ self.assertEqual(utils.format_duration(0),
+ '0 ms')
+ self.assertEqual(utils.format_duration(1e-9),
+ '1 ms')
+ self.assertEqual(utils.format_duration(10e-3),
+ '10 ms')
+ self.assertEqual(utils.format_duration(1.5),
+ '1 sec 500 ms')
+ self.assertEqual(utils.format_duration(1),
+ '1 sec')
+ self.assertEqual(utils.format_duration(2 * 60),
+ '2 min')
+ self.assertEqual(utils.format_duration(2 * 60 + 1),
+ '2 min 1 sec')
+ self.assertEqual(utils.format_duration(3 * 3600),
+ '3 hour')
+ self.assertEqual(utils.format_duration(3 * 3600 + 2 * 60 + 1),
+ '3 hour 2 min')
+ self.assertEqual(utils.format_duration(3 * 3600 + 1),
+ '3 hour 1 sec')
+
+
if __name__ == '__main__':
unittest.main()
More information about the Python-checkins
mailing list