Why cProfile module doesn't work with unittest?

cprofile, macos, python, unit-testing

Solution

You have to initialize the cProfiler in the Constructor of the test, and use the profile data in destructor -- I use it like that:

from pstats import Stats
import unittest

class TestSplayTree(unittest.TestCase):
    """a simple test"""

    def setUp(self):
        """init each test"""
        self.testtree = SplayTree (1000000)
        self.pr = cProfile.Profile()
        self.pr.enable()
        print "\n<<<---"

    def tearDown(self):
        """finish any test"""
        p = Stats (self.pr)
        p.strip_dirs()
        p.sort_stats ('cumtime')
        p.print_stats ()
        print "\n--->>>"

    def xtest1 (self):
        pass

In case that a test waits for input, one needs to call `self.pr.disable()` before that call, and re-enable it afterwards.

If you prefer `pytest` the method names are a bit different:

import cProfile
import time

class TestProfile:
    """ test to illustrate cProfile usage """

    def setup_class(self):
        self.pr = cProfile.Profile()
        self.pr.enable()

    def teardown_class(self):
        self.pr.disable()
        self.pr.print_stats(sort="tottime")

    def test_sleep(self):
        time.sleep(2)

Problem

I would to use cProfile module to profile my unit tests. But when I run ``` python -mcProfile mytest.py ``` I got 'Ran 0 tests in 0.000s'. Here is the source code of mytest.py ``` import unittest class TestBasic(unittest.TestCase): def testFoo(self): assert True == True if __name__ == '__main__': unittest.main() ``` I've tested with other more complex unittests as well. Always got 'Ran 0 tests' if I run it with cProfile. Please help. UPDATE: My OS is MacOS 10.7 with built-in python 2.7. The same code works properly on ubuntu.

Original source

Related problems