¿Cómo saber el tiempo dedicado a cada prueba cuando se usa unittest?

Unittest presenta solo el tiempo total empleado en la ejecución de todas las pruebas, pero no presenta el tiempo dedicado a cada prueba por separado.

¿Cómo agregar el tiempo de cada prueba al usar unittest?

Supongo que por ahora no es posible: http://bugs.python.org/issue4080 .

Pero puedes hacer algo como esto:

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) 

Resultado:

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

Las pruebas de nariz con la extensión pinnochio tienen una opción de cronómetro que le dará esto, si la nariz es una opción para usted.

También tiene un montón de otras características útiles y complementos para hacer que el uso de unittest sea más agradable.

Aquí está la variación del guión de la respuesta de horejsek. Django Monkey parcheará TestCase de Django para que cada TestCase dé su tiempo total de ejecución.

Puede colocar esta descripción en el paquete raíz __init__.py, donde vive su configuración.py. Después de eso puedes ejecutar pruebas con ./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 

Puedes usar django-slowtests , que proporciona una salida como esta:

 $ 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) 

Si observa django_slowtests / test_runner.py , también podría adaptar la técnica usted mismo.

Solución con línea de comandos solamente:

1 / install nose (popular corrector de pruebas alternativo) y pinnochio extensión

 $ pip install nose pinnochio 

2 / ejecutar pruebas con registro de tiempo (los tiempos se guardan en el archivo .nose-stopwatch-times )

 $ nosetests --with-stopwatch 

3 / mostrar los nombres de las pruebas ordenadas por tiempo decreciente:

 $ 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 

Puede usar pytest con --durations=0 y le dará tiempo de ejecución para cada prueba