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.