11

有什么方法可以获取“unittest.TextTestRunner().run()”运行特定单元测试所花费的总时间。

我正在使用 for 循环针对某些场景测试模块(有些必须使用,有些不需要,所以它们运行了几次),我想打印运行所有测试所花费的总时间。

任何帮助将不胜感激。

4

5 回答 5

13

已更新,感谢@Centralniak 的评论

怎么简单

from datetime import datetime

tick = datetime.now()

# run the tests here   

tock = datetime.now()   
diff = tock - tick    # the result is a datetime.timedelta object
print(diff.total_seconds())
于 2012-08-20T09:01:50.417 回答
4

您可以在设置功能中记录开始时间,然后在清理中打印经过的时间。

于 2012-08-20T08:57:24.683 回答
3

我完全按照 Eric 的假设做这件事——这是我用于测试的装饰器(通常比严格的单元测试更具功能性测试)......

# -*- coding: utf-8 -*-
from __future__ import print_function
from functools import wraps
from pprint import pprint

WIDTH = 60

print_separator = lambda fill='-', width=WIDTH: print(fill * width)

def timedtest(function):
    """
    Functions so decorated will print the time they took to execute.

    Usage:

        import unittest

        class MyTests(unittest.TestCase):

            @timedtest
            def test_something(self):
                assert something is something_else
                # … etc

                # An optional return value is pretty-printed,
                # along with the timing values:
                return another_thing

    """
    @wraps(function)
    def wrapper(*args, **kwargs):
        print()
        print("TESTING: %s(…)" % getattr(function, "__name__", "<unnamed>"))
        print_separator()

        print()
        t1 = time.time()
        out = function(*args, **kwargs)
        t2 = time.time()
        dt = str((t2 - t1) * 1.00)
        dtout = dt[:(dt.find(".") + 4)]
        print_separator()

        if out is not None:
            print('RESULTS:')
            pprint(out, indent=4)

        print('Test finished in %s seconds' % dtout)
        print_separator('=')

        return out

    return wrapper

这就是它的核心——从那里,如果你愿意,你可以将时间存储在数据库中进行分析,或者绘制图表等等。像这样的装饰器(@wraps(…)functools模块中使用)不会干扰单元测试框架偶尔使用的任何黑魔法。

于 2012-08-20T09:05:38.477 回答
3

Eric 的单行回答之后,我在这里使用了一个小片段:

from datetime import datetime

class SomeTests(unittest.TestCase):
    """
    ... write the rest yourself! ...
    """

    def setUp(self):
        self.tick = datetime.now()

    def tearDown(self):
        self.tock = datetime.now()
        diff = self.tock - self.tick
        print (diff.microseconds / 1000), "ms"

    # all the other tests below

这对我来说已经足够好了,目前,但我想修复一些小的格式问题。结果ok现在在下一行,并且FAIL具有优先级。这很丑陋。

于 2015-04-02T08:07:57.000 回答
1

除了使用datetime,你还可以使用time

from time import time

t0 = time()

# do your stuff here

print(time() - t0) # it will show in seconds
于 2018-08-24T19:05:01.350 回答