44 votes

Comment connaître le temps passé sur chaque test en utilisant unittest ?

Unittest ne présente que le temps total passé à exécuter tous les tests mais ne présente pas le temps passé sur chaque test séparément.

Comment ajouter le timing de chaque test en utilisant unittest ?

46voto

horejsek Points 1200

Je suppose que ce n'est pas possible pour le moment : http://bugs.python.org/issue4080 .

Mais vous pouvez faire quelque chose comme ça :

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)

Résultat :

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

OK

8voto

Michel Samia Points 775

Vous pouvez utiliser pytest con --durations=0 et il vous donnera le temps d'exécution pour chaque test

7voto

mjtamlyn Points 824

Nez les tests avec le extension pinnochio a un chronomètre qui vous donnera cette possibilité, si le nez est une option pour vous.

Il dispose également d'une tonne d'autres fonctionnalités utiles et de plugins pour rendre l'utilisation d'unittest plus agréable.

6voto

user920391 Points 141

Voici une variation de script de la réponse de horejsek. Il va singer les TestCase de django de sorte que chaque TestCase donne son temps d'exécution total.

Vous pouvez placer ce script dans le __init__.py du paquet Root, où se trouve votre settings.py. Après cela, vous pouvez exécuter des tests avec ./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

5voto

Francois Points 846

Solution avec la ligne de commande uniquement :

1/ installer nose (test-runner alternatif populaire) et l'extension pinocchio

$ pip install nose pinocchio

2/ exécuter des tests avec enregistrement des temps (les temps sont enregistrés dans le fichier .nose-stopwatch-times )

$ nosetests --with-stopwatch

3/ afficher les noms des tests triés par temps décroissant :

$ 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X