How to know time spent on each test when using unittest?
Solution 1:
I suppose, that it's not possible for now: http://bugs.python.org/issue4080.
But you can do something like this:
import unittest
import time
class SomeTest(unittest.TestCase):
def setUp(self):
self.startTime = time.time()
def tearDown(self):
t = time.time() - self.startTime
print('%s: %.3f' % (self.id(), t))
def testOne(self):
time.sleep(1)
self.assertEqual(int('42'), 42)
def testTwo(self):
time.sleep(2)
self.assertEqual(str(42), '42')
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(SomeTest)
unittest.TextTestRunner(verbosity=0).run(suite)
Result:
__main__.SomeTest.testOne: 1.001
__main__.SomeTest.testTwo: 2.002
----------------------------------------------------------------------
Ran 2 tests in 3.003s
OK
Solution 2:
You can use pytest with --durations=0
and it will give you execution time for each test
Solution 3:
Nose tests with the pinnochio extension has a stopwatch option which will give you this, if nose is an option for you.
It also has a ton of other useful features and plugins to make using unittest nicer.
Solution 4:
Here is variation of script from horejsek's answer. It will monkey-patch django TestCase so that every TestCase will give its total running time.
You can place this sript in the root package's __init__.py, where your settings.py lives. After that you can run tests with ./mange.py test -s
from django import test
import time
@classmethod
def setUpClass(cls):
cls.startTime = time.time()
@classmethod
def tearDownClass(cls):
print "\n%s.%s: %.3f" % (cls.__module__, cls.__name__, time.time() - cls.startTime)
test.TestCase.setUpClass = setUpClass
test.TestCase.tearDownClass = tearDownClass