如何知道使用unittest时每次测试花费的时间?

时间:2012-02-29 16:05:54

标签: python performance unit-testing

Unittest仅显示运行所有测试所花费的总时间,但不会分别显示每个测试所花费的时间。

使用unittest时如何添加每个测试的时间?

7 个答案:

答案 0 :(得分:33)

我想,现在不可能:http://bugs.python.org/issue4080

但你可以这样做:

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.assertEquals(int('42'), 42)

    def testTwo(self):
        time.sleep(2)
        self.assertEquals(str(42), '42')

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(SomeTest)
    unittest.TextTestRunner(verbosity=0).run(suite)

结果:

__main__.SomeTest.testOne: 1.001
__main__.SomeTest.testTwo: 2.002
----------------------------------------------------------------------
Ran 2 tests in 3.003s

OK

答案 1 :(得分:6)

使用Nose进行的{p> pinnochio extension测试有一个stopwatch选项可以为您提供此选项,如果鼻子是您的选项。

它还有许多其他有用的功能和插件,可以使用unittest更好。

答案 2 :(得分:6)

这是horejsek答案的脚本变体。 它将修补django TestCase,以便每个TestCase都能给出它的总运行时间。

您可以将此sript放在您的settings.py所在的根包__init__.py中。 之后,您可以使用 ./ 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

答案 3 :(得分:3)

仅限命令行解决方案:

1 /安装nose(热门替代测试运行器)和分机pinnochio

$ pip install nose pinnochio

2 /运行时间记录测试(时间保存在文件.nose-stopwatch-times

$ nosetests --with-stopwatch

3 /显示按减少时间排序的测试名称:

$ python -c "import pickle,operator,signal; signal.signal(signal.SIGPIPE, signal.SIG_DFL); print '\n'.join(['%.03fs: %s'%(v[1],v[0]) for v in sorted(pickle.load(open('.nose-stopwatch-times','r')).items(), key=operator.itemgetter(1), reverse=True)])" | less

答案 4 :(得分:3)

您可以使用django-slowtests,它提供如下输出:

select id, RecordDate, CreateDate, DATEDIFF(DAY,CreateDate,RecordDate) as TimeDifference from items


id    RecordDate                 CreateDate                 TimeDifference 
 0    2014-03-28 17:29:35.557   2014-03-28 17:29:35.557          0
 1    2014-04-11 12:13:17.320   2014-04-11 12:13:17.320          0
 2    2014-05-08 10:15:42.670   2014-05-08 10:15:42.670          0
 3    2014-03-17 18:58:28.480   2018-01-10 13:22:33.827         1395
 4    2014-03-17 18:58:30.207   2018-01-02 20:11:49.327         1387

如果你看django_slowtests/test_runner.py,你也可以自己调整技术。

答案 5 :(得分:3)

您可以将pytest--durations=0一起使用,它将为您提供每次测试的执行时间

答案 6 :(得分:1)

PyCharm CE(free)提供unittest持续时间的清晰视图。它还有助于按目录结构和文件进行聚合,并允许您按持续时间进行排序:

enter image description here

正如@horejsek所提到的,unittest存在一个在开放PR中添加持续时间测量的问题:https://github.com/python/cpython/pull/12271