「unittest.TextTestRunner().run()」が特定の単体テストを実行するのにかかった合計時間を取得する方法はありますか?
for ループを使用して、特定のシナリオ (使用する必要があるものと使用しないものがあるため、数回実行する必要があるため) に対してモジュールをテストしています。すべてのテストを実行するのにかかった合計時間を出力したいと思います。
どんな助けでも大歓迎です。
「unittest.TextTestRunner().run()」が特定の単体テストを実行するのにかかった合計時間を取得する方法はありますか?
for ループを使用して、特定のシナリオ (使用する必要があるものと使用しないものがあるため、数回実行する必要があるため) に対してモジュールをテストしています。すべてのテストを実行するのにかかった合計時間を出力したいと思います。
どんな助けでも大歓迎です。
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())
setup 関数で開始時間を記録してから、クリーンアップで経過時間を出力できます。
私はエリックが仮定したとおりにこれを行います-これは私がテストに使用するデコレーターです(多くの場合、厳密な単体テストよりも機能テスト的です)...
# -*- 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
は、単体テスト フレームワークがときどき頼るダーク マジックのいずれにも干渉しません。