11

「unittest.TextTestRunner().run()」が特定の単体テストを実行するのにかかった合計時間を取得する方法はありますか?

for ループを使用して、特定のシナリオ (使用する必要があるものと使用しないものがあるため、数回実行する必要があるため) に対してモジュールをテストしています。すべてのテストを実行するのにかかった合計時間を出力したいと思います。

どんな助けでも大歓迎です。

4

5 に答える 5

13

UPDATED、@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

setup 関数で開始時間を記録してから、クリーンアップで経過時間を出力できます。

于 2012-08-20T08:57:24.683 に答える
3

私はエリックが仮定したとおりにこれを行います-これは私がテストに使用するデコレーターです(多くの場合、厳密な単体テストよりも機能テスト的です)...

# -*- 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 に答える