web-dev-qa-db-ja.com

unittestを使用するときに各テストに費やされた時間を知る方法は?

Unittestは、すべてのテストの実行に費やされた合計時間のみを表示し、各テストに個別に費やされた時間を表示しません。

Unittestを使用するときに各テストのタイミングを追加するにはどうすればよいですか?

39
Piotr Dobrogost

今のところ不可能だと思います: http://bugs.python.org/issue408

しかし、あなたはこのようなことをすることができます:

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)

結果:

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

OK
41
horejsek

Nosepinnochio extension を使用したテストには stopwatch オプションがあり、noseがオプションの場合、これが提供されます。

また、unittestの使用を改善するためのその他の便利な機能やプラグインも多数あります。

7
mjtamlyn

これがhorejsekの答えからのスクリプトのバリエーションです。すべてのTestCaseが合計実行時間を提供するように、Django 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
6
user920391

コマンドラインのみの解決策:

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
5
Francois

pytest with --durations=0を使用すると、各テストの実行時間がわかります。

5
Michel Samia

Django-slowtests を使用できます。これにより、次のような出力が提供されます。

$ python manage.py test
Creating test database for alias 'default'...
..........
----------------------------------------------------------------------
Ran 10 tests in 0.413s

OK
Destroying test database for alias 'default'...

Ten slowest tests:
0.3597s test_detail_view_with_a_future_poll (polls.tests.PollIndexDetailTests)
0.0284s test_detail_view_with_a_past_poll (polls.tests.PollIndexDetailTests)
0.0068s test_index_view_with_a_future_poll (polls.tests.PollViewTests)
0.0047s test_index_view_with_a_past_poll (polls.tests.PollViewTests)
0.0045s test_index_view_with_two_past_polls (polls.tests.PollViewTests)
0.0041s test_index_view_with_future_poll_and_past_poll (polls.tests.PollViewTests)
0.0036s test_index_view_with_no_polls (polls.tests.PollViewTests)
0.0003s test_was_published_recently_with_future_poll (polls.tests.PollMethodTests)
0.0002s test_was_published_recently_with_recent_poll (polls.tests.PollMethodTests)
0.0002s test_was_published_recently_with_old_poll (polls.tests.PollMethodTests)

Django_slowtests/test_runner.py を見ると、自分でテクニックを適応させることもできます。

3
Beau

PyCharm CE( free )は、unittest期間のクリーンなビューを提供します。また、ディレクトリ構造とファイルごとに集計し、期間ごとに並べ替えることもできます。

enter image description here

そして@horejsekが述べたように、unittestがオープンPRで継続時間測定を追加するための問題があります: https://github.com/python/cpython/pull/12271