Last active
April 6, 2016 16:36
-
-
Save mahmoudimus/848183 to your computer and use it in GitHub Desktop.
Nose plugin to time tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""This plugin provides test timings to identify which tests might be | |
taking the most. From this information, it might be useful to couple | |
individual tests nose's `--with-profile` option to profile problematic | |
tests. | |
This plugin is heavily influenced by nose's `xunit` plugin. | |
Add this command to the way you execute nose:: | |
--with-test-timer | |
After all tests are executed, they will be sorted in ascending order. | |
(c) 2011 - Mahmoud Abdelkader (http://github.com/mahmoudimus) | |
""" | |
import operator | |
from time import time | |
import nose | |
from nose.plugins.base import Plugin | |
class TestTimer(Plugin): | |
"""This plugin provides test timings | |
""" | |
name = 'test-timer' | |
score = 1 | |
def _timeTaken(self): | |
if hasattr(self, '_timer'): | |
taken = time() - self._timer | |
else: | |
# test died before it ran (probably error in setup()) | |
# or success/failure added before test started probably | |
# due to custom TestResult munging | |
taken = 0.0 | |
return taken | |
def options(self, parser, env): | |
"""Sets additional command line options.""" | |
super(TestTimer, self).options(parser, env) | |
def configure(self, options, config): | |
"""Configures the test timer plugin.""" | |
super(TestTimer, self).configure(options, config) | |
self.config = config | |
self._timed_tests = {} | |
def startTest(self, test): | |
"""Initializes a timer before starting a test.""" | |
self._timer = time() | |
def report(self, stream): | |
"""Report the test times""" | |
if not self.enabled: | |
return | |
d = sorted(self._timed_tests.iteritems(), key=operator.itemgetter(1)) | |
for test, time_taken in d: | |
stream.writeln("%s: %0.4f" % (test, time_taken)) | |
def _register_time(self, test): | |
self._timed_tests[test.id()] = self._timeTaken() | |
def addError(self, test, err, capt=None): | |
self._register_time(test) | |
def addFailure(self, test, err, capt=None, tb_info=None): | |
self._register_time(test) | |
def addSuccess(self, test, capt=None): | |
self._register_time(test) | |
if __name__ == '__main__': | |
nose.main(addplugins=[TestTimer()]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@mikewaters, check out http://github.com/mahmoudimus/nose-timer