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 ?
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 ?
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
Vous pouvez utiliser pytest con --durations=0
et il vous donnera le temps d'exécution pour chaque test
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.
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
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 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.