Package mvpa :: Package tests :: Module runner

[hide private]
[frames] | no frames]

# Source Code for Module mvpa.tests.runner

     1  # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
     2  # vi: set ft=python sts=4 ts=4 sw=4 et:
     3  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ##
     4  #
     5  #   See COPYING file distributed along with the PyMVPA package for the
     6  #   copyright and license terms.
     7  #
     8  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ##
     9  """Helper module to enable profiling of the testcase
    10
    11   If environment variable PROFILELEVEL is set it uses hotshot profiler
    12   for unittest.main() call. Value of PROFILELEVEL defines number of top
    13   busy functions to report.
    14
    15   Environment variable PROFILELINES=1 makes hotshot store information
    16   per each line, so it could be easily inspected later on.
    17
    18   Output:
    19     Profiler stores its Stats into a file named after original script
    20     (sys.argv[0]) with suffix".prof" appended
    21
    22   Usage:
    23     Replace unittest.main() with import runner
    24
    25   Visualization:
    26     kcachegrind provides nice interactive GUI to inspect profiler
    27     results. If PROFILELINES was set to 1, it provides information per
    28     each line.
    29
    30     To convert .prof file into a file suitable for kcachegrind, use
    31     utility hotshot2calltree which comes in package
    32     kcachegrind-converters.
    33
    34   Example:
    35
    36   # profile and output 3 most expensive function calls
    37   PROFILELEVEL=3 PROFILELINES=1 PYTHONPATH=../ python test_searchlight.py
    38   # convert to kcachegrind format
    39   hotshot2calltree -o test_searchlight.py.kcache  test_searchlight.py.prof
    40   # inspect
    41   kcachegrind test_searchlight.py.kcache
    42
    43  """
    44
    45  import unittest
    46  import sys
    47
    48  from os import environ
    49
    50  from mvpa import _random_seed
    51  profilelevel = None
    52
    53  if environ.has_key('PROFILELEVEL'):
    54      profilelevel = int(environ['PROFILELEVEL'])
    55
    56  # Extend TestProgram to print out the seed which was used
    57 -class TestProgramPyMVPA(unittest.TestProgram):
    58 -    def runTests(self):
    59          if self.verbosity:
    60              print "MVPA_SEED=%s:" % _random_seed,
    61              sys.stdout.flush()
    62          super(TestProgramPyMVPA, self).runTests()
    63
    64  if profilelevel is None:
    65      TestProgramPyMVPA()
    66  else:
    67      profilelines = environ.has_key('PROFILELINES')
    68
    69      import hotshot, hotshot.stats
    70      pname = "%s.prof" % sys.argv[0]
    71      prof = hotshot.Profile(pname, lineevents=profilelines)
    72      try:
    73          # actually return values are never setup
    74          # since unittest.main sys.exit's
    75          benchtime, stones = prof.runcall( unittest.main )
    76      except SystemExit:
    77          pass
    78      print "Saving profile data into %s" % pname
    79      prof.close()
    80      if profilelevel > 0:
    81          # we wanted to see the summary right here
    82          # instead of just storing it into a file
    83          print "Loading profile data from %s" % pname
    84          stats = hotshot.stats.load(pname)
    85          stats.strip_dirs()
    86          stats.sort_stats('time', 'calls')
    87          stats.print_stats(profilelevel)
    88