|
1 """Test suite for the profile module.""" |
|
2 |
|
3 import os |
|
4 import sys |
|
5 import pstats |
|
6 import unittest |
|
7 from StringIO import StringIO |
|
8 from test.test_support import run_unittest |
|
9 |
|
10 import profile |
|
11 from test.profilee import testfunc, timer |
|
12 |
|
13 |
|
14 class ProfileTest(unittest.TestCase): |
|
15 |
|
16 profilerclass = profile.Profile |
|
17 methodnames = ['print_stats', 'print_callers', 'print_callees'] |
|
18 expected_output = {} |
|
19 |
|
20 @classmethod |
|
21 def do_profiling(cls): |
|
22 results = [] |
|
23 prof = cls.profilerclass(timer, 0.001) |
|
24 start_timer = timer() |
|
25 prof.runctx("testfunc()", globals(), locals()) |
|
26 results.append(timer() - start_timer) |
|
27 for methodname in cls.methodnames: |
|
28 s = StringIO() |
|
29 stats = pstats.Stats(prof, stream=s) |
|
30 stats.strip_dirs().sort_stats("stdname") |
|
31 getattr(stats, methodname)() |
|
32 results.append(s.getvalue()) |
|
33 return results |
|
34 |
|
35 def test_cprofile(self): |
|
36 results = self.do_profiling() |
|
37 self.assertEqual(results[0], 1000) |
|
38 for i, method in enumerate(self.methodnames): |
|
39 self.assertEqual(results[i+1], self.expected_output[method], |
|
40 "Stats.%s output for %s doesn't fit expectation!" % |
|
41 (method, self.profilerclass.__name__)) |
|
42 |
|
43 |
|
44 def regenerate_expected_output(filename, cls): |
|
45 filename = filename.rstrip('co') |
|
46 print 'Regenerating %s...' % filename |
|
47 results = cls.do_profiling() |
|
48 |
|
49 newfile = [] |
|
50 with open(filename, 'r') as f: |
|
51 for line in f: |
|
52 newfile.append(line) |
|
53 if line[:6] == '#--cut': |
|
54 break |
|
55 |
|
56 with open(filename, 'w') as f: |
|
57 f.writelines(newfile) |
|
58 for i, method in enumerate(cls.methodnames): |
|
59 f.write('%s.expected_output[%r] = """\\\n%s"""\n' % ( |
|
60 cls.__name__, method, results[i+1])) |
|
61 f.write('\nif __name__ == "__main__":\n main()\n') |
|
62 |
|
63 |
|
64 def test_main(): |
|
65 run_unittest(ProfileTest) |
|
66 |
|
67 def main(): |
|
68 if '-r' not in sys.argv: |
|
69 test_main() |
|
70 else: |
|
71 regenerate_expected_output(__file__, ProfileTest) |
|
72 |
|
73 |
|
74 # Don't remove this comment. Everything below it is auto-generated. |
|
75 #--cut-------------------------------------------------------------------------- |
|
76 ProfileTest.expected_output['print_stats'] = """\ |
|
77 127 function calls (107 primitive calls) in 999.749 CPU seconds |
|
78 |
|
79 Ordered by: standard name |
|
80 |
|
81 ncalls tottime percall cumtime percall filename:lineno(function) |
|
82 4 -0.004 -0.001 -0.004 -0.001 :0(append) |
|
83 4 -0.004 -0.001 -0.004 -0.001 :0(exc_info) |
|
84 12 -0.024 -0.002 11.964 0.997 :0(hasattr) |
|
85 8 -0.008 -0.001 -0.008 -0.001 :0(range) |
|
86 1 0.000 0.000 0.000 0.000 :0(setprofile) |
|
87 1 -0.002 -0.002 999.751 999.751 <string>:1(<module>) |
|
88 0 0.000 0.000 profile:0(profiler) |
|
89 1 -0.002 -0.002 999.749 999.749 profile:0(testfunc()) |
|
90 28 27.972 0.999 27.972 0.999 profilee.py:110(__getattr__) |
|
91 1 269.996 269.996 999.753 999.753 profilee.py:25(testfunc) |
|
92 23/3 149.937 6.519 169.917 56.639 profilee.py:35(factorial) |
|
93 20 19.980 0.999 19.980 0.999 profilee.py:48(mul) |
|
94 2 39.986 19.993 599.814 299.907 profilee.py:55(helper) |
|
95 4 115.984 28.996 119.964 29.991 profilee.py:73(helper1) |
|
96 2 -0.006 -0.003 139.942 69.971 profilee.py:84(helper2_indirect) |
|
97 8 311.976 38.997 399.896 49.987 profilee.py:88(helper2) |
|
98 8 63.968 7.996 79.944 9.993 profilee.py:98(subhelper) |
|
99 |
|
100 |
|
101 """ |
|
102 ProfileTest.expected_output['print_callers'] = """\ |
|
103 Ordered by: standard name |
|
104 |
|
105 Function was called by... |
|
106 :0(append) <- profilee.py:73(helper1)(4) 119.964 |
|
107 :0(exc_info) <- profilee.py:73(helper1)(4) 119.964 |
|
108 :0(hasattr) <- profilee.py:73(helper1)(4) 119.964 |
|
109 profilee.py:88(helper2)(8) 399.896 |
|
110 :0(range) <- profilee.py:98(subhelper)(8) 79.944 |
|
111 :0(setprofile) <- profile:0(testfunc())(1) 999.749 |
|
112 <string>:1(<module>) <- profile:0(testfunc())(1) 999.749 |
|
113 profile:0(profiler) <- |
|
114 profile:0(testfunc()) <- profile:0(profiler)(1) 0.000 |
|
115 profilee.py:110(__getattr__) <- :0(hasattr)(12) 11.964 |
|
116 profilee.py:98(subhelper)(16) 79.944 |
|
117 profilee.py:25(testfunc) <- <string>:1(<module>)(1) 999.751 |
|
118 profilee.py:35(factorial) <- profilee.py:25(testfunc)(1) 999.753 |
|
119 profilee.py:35(factorial)(20) 169.917 |
|
120 profilee.py:84(helper2_indirect)(2) 139.942 |
|
121 profilee.py:48(mul) <- profilee.py:35(factorial)(20) 169.917 |
|
122 profilee.py:55(helper) <- profilee.py:25(testfunc)(2) 999.753 |
|
123 profilee.py:73(helper1) <- profilee.py:55(helper)(4) 599.814 |
|
124 profilee.py:84(helper2_indirect) <- profilee.py:55(helper)(2) 599.814 |
|
125 profilee.py:88(helper2) <- profilee.py:55(helper)(6) 599.814 |
|
126 profilee.py:84(helper2_indirect)(2) 139.942 |
|
127 profilee.py:98(subhelper) <- profilee.py:88(helper2)(8) 399.896 |
|
128 |
|
129 |
|
130 """ |
|
131 ProfileTest.expected_output['print_callees'] = """\ |
|
132 Ordered by: standard name |
|
133 |
|
134 Function called... |
|
135 :0(append) -> |
|
136 :0(exc_info) -> |
|
137 :0(hasattr) -> profilee.py:110(__getattr__)(12) 27.972 |
|
138 :0(range) -> |
|
139 :0(setprofile) -> |
|
140 <string>:1(<module>) -> profilee.py:25(testfunc)(1) 999.753 |
|
141 profile:0(profiler) -> profile:0(testfunc())(1) 999.749 |
|
142 profile:0(testfunc()) -> :0(setprofile)(1) 0.000 |
|
143 <string>:1(<module>)(1) 999.751 |
|
144 profilee.py:110(__getattr__) -> |
|
145 profilee.py:25(testfunc) -> profilee.py:35(factorial)(1) 169.917 |
|
146 profilee.py:55(helper)(2) 599.814 |
|
147 profilee.py:35(factorial) -> profilee.py:35(factorial)(20) 169.917 |
|
148 profilee.py:48(mul)(20) 19.980 |
|
149 profilee.py:48(mul) -> |
|
150 profilee.py:55(helper) -> profilee.py:73(helper1)(4) 119.964 |
|
151 profilee.py:84(helper2_indirect)(2) 139.942 |
|
152 profilee.py:88(helper2)(6) 399.896 |
|
153 profilee.py:73(helper1) -> :0(append)(4) -0.004 |
|
154 :0(exc_info)(4) -0.004 |
|
155 :0(hasattr)(4) 11.964 |
|
156 profilee.py:84(helper2_indirect) -> profilee.py:35(factorial)(2) 169.917 |
|
157 profilee.py:88(helper2)(2) 399.896 |
|
158 profilee.py:88(helper2) -> :0(hasattr)(8) 11.964 |
|
159 profilee.py:98(subhelper)(8) 79.944 |
|
160 profilee.py:98(subhelper) -> :0(range)(8) -0.008 |
|
161 profilee.py:110(__getattr__)(16) 27.972 |
|
162 |
|
163 |
|
164 """ |
|
165 |
|
166 if __name__ == "__main__": |
|
167 main() |