Как узнать время, потраченное на каждый тест при использовании unittest? - PullRequest
32 голосов
/ 29 февраля 2012

Unittest представляет только общее время, потраченное на выполнение всех тестов, но не представляет время, затраченное на каждый тест отдельно.

Как добавить время каждого теста при использовании unittest?

Ответы [ 6 ]

34 голосов
/ 29 февраля 2012

Полагаю, сейчас это невозможно: 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
6 голосов
/ 29 мая 2014

Вот вариант сценария из ответа хорейсека.Это будет обезьяна-патч django TestCase, так что каждый TestCase будет указывать общее время выполнения.

Вы можете поместить этот скрипт в корневой пакет в __init__.py, где живет ваш settings.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 голосов
/ 29 февраля 2012

Нос тесты с расширением pinnochio имеет параметр секундомер , который даст вам это, если для вас есть вариант с носом.

Он также имеет множество других полезных функций и плагинов, чтобы сделать использование unittest лучше.

4 голосов
/ 07 ноября 2017

Решение только с командной строкой:

1 / install 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
3 голосов
/ 27 июня 2018

Вы можете использовать pytest с --durations=0, и это даст вам время выполнения для каждого теста

3 голосов
/ 16 января 2018

Вы можете использовать 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 , вы также можете адаптировать эту технику самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...