3
<title>nose: builtin plugin: testid</title>
4
<link rel="stylesheet" href="site.css" type="text/css"></link>
9
<p>This document covers nose version <b>0.10.3</b></p>
10
<p>Last update: <b>Tue Jun 3 11:50:26 2008</b></p>
11
<h2>Plugins</h2><ul><li><a href="plugin_attrib.html">Builtin Plugin: attrib</a></li><li><a href="plugin_capture.html">Builtin Plugin: capture</a></li><li><a href="plugin_cover.html">Builtin Plugin: cover</a></li><li><a href="plugin_debug.html">Builtin Plugin: debug</a></li><li><a href="plugin_deprecated.html">Builtin Plugin: deprecated</a></li><li><a href="plugin_doctests.html">Builtin Plugin: doctests</a></li><li><a href="plugin_failuredetail.html">Builtin Plugin: failuredetail</a></li><li><a href="plugin_isolate.html">Builtin Plugin: isolate</a></li><li><a href="plugin_prof.html">Builtin Plugin: prof</a></li><li><a href="plugin_skip.html">Builtin Plugin: skip</a></li><li><a href="plugin_testid.html">Builtin Plugin: testid</a></li><li><a href="error_class_plugin.html">ErrorClass Plugins</a></li><li><a href="plugin_interface.html">Plugin Interface</a></li><li><a href="writing_plugins.html">Writing Plugins</a></li></ul><h2>Modules</h2><ul><li><a href="module_nose.case.html">Module: nose.case</a></li><li><a href="module_nose.commands.html">Module: nose.commands</a></li><li><a href="module_nose.config.html">Module: nose.config</a></li><li><a href="module_nose.core.html">Module: nose.core</a></li><li><a href="module_nose.exc.html">Module: nose.exc</a></li><li><a href="module_nose.failure.html">Module: nose.failure</a></li><li><a href="module_nose.importer.html">Module: nose.importer</a></li><li><a href="module_nose.inspector.html">Module: nose.inspector</a></li><li><a href="module_nose.loader.html">Module: nose.loader</a></li><li><a href="module_nose.plugins.manager.html">Module: nose.plugins.manager</a></li><li><a href="module_nose.plugins.plugintest.html">Module: nose.plugins.plugintest</a></li><li><a href="module_nose.proxy.html">Module: nose.proxy</a></li><li><a href="module_nose.result.html">Module: nose.result</a></li><li><a href="module_nose.selector.html">Module: nose.selector</a></li><li><a href="module_nose.suite.html">Module: nose.suite</a></li><li><a href="module_nose.tools.html">Module: nose.tools</a></li><li><a href="module_nose.twistedtools.html">Module: nose.twistedtools</a></li><li><a href="module_nose.util.html">Module: nose.util</a></li></ul><h2>Plugin Examples</h2><ul><li><a href="unwanted_package.html">Excluding Unwanted Packages</a></li><li><a href="errorclass_failure.html">Failure of Errorclasses</a></li><li><a href="imported_tests.html">Importing Tests</a></li><li><a href="empty_plugin.html">Minimal plugin</a></li><li><a href="restricted_plugin_options.html">Restricted Plugin Managers</a></li><li><a href="init_plugin.html">Running Initialization Code Before the Test Run</a></li><li><a href="selector_plugin.html">Using a Custom Selector</a></li><li><a href="plugin_exceptions.html">When Plugins Fail</a></li><li><a href="plugintest_environment.html">nose.plugins.plugintest, os.environ and sys.argv</a></li></ul>
15
<h1>nose: builtin plugin: testid</h1>
17
<p>This plugin adds a test id (like #1) to each test name output. After
18
you've run once to generate test ids, you can re-run individual
19
tests by activating the plugin and passing the ids (with or
20
without the # prefix) instead of test names.</p>
21
<p>For example, if your normal test run looks like:</p>
22
<pre class="literal-block">
28
<p>When adding --with-id you'll see:</p>
29
<pre class="literal-block">
30
% nosetests -v --with-id
31
#1 tests.test_a ... ok
32
#2 tests.test_b ... ok
33
#2 tests.test_c ... ok
35
<p>Then you can rerun individual tests by supplying just the id numbers:</p>
36
<pre class="literal-block">
37
% nosetests -v --with-id 2
38
#2 tests.test_b ... ok
40
<p>Then you can rerun individual tests by supplying just the id numbers:</p>
41
<pre class="literal-block">
42
% nosetests -v --with-id 2 3
43
#2 tests.test_b ... ok
44
#3 tests.test_c ... ok
46
<p>Since most shells consider '#' a special character, you can leave it out when
47
specifying a test id.</p>
50
<h2>Plugin Methods Implemented</h2>
52
<p>This plugin implements the following plugin interface methods:</p>
54
<ul><li><a href="plugin_interface.html#configure">configure</a></li><li><a href="plugin_interface.html#finalize">finalize</a></li><li><a href="plugin_interface.html#loadTestsFromNames">loadTestsFromNames</a></li><li><a href="plugin_interface.html#options">options</a></li><li><a href="plugin_interface.html#setOutputStream">setOutputStream</a></li><li><a href="plugin_interface.html#startTest">startTest</a></li></ul>
57
<h2>Commandline Options</h2>
59
<p>This plugin adds the following commandline options:</p>
62
--with-id Enable plugin TestId: Activate to add a test id (like
63
#1) to each test name output. After you've run once to
64
generate test ids, you can re-run individual tests by
65
activating the plugin and passing the ids (with or
66
without the # prefix) instead of test names.
68
--id-file=TESTIDFILE Store test ids found in test runs in this file.
69
Default is the file .noseids in the working directory.
74
<div class="highlight"><pre><span class="sd">"""</span>
75
<span class="sd">This plugin adds a test id (like #1) to each test name output. After</span>
76
<span class="sd">you've run once to generate test ids, you can re-run individual</span>
77
<span class="sd">tests by activating the plugin and passing the ids (with or</span>
78
<span class="sd">without the # prefix) instead of test names.</span>
80
<span class="sd">For example, if your normal test run looks like::</span>
82
<span class="sd"> % nosetests -v</span>
83
<span class="sd"> tests.test_a ... ok</span>
84
<span class="sd"> tests.test_b ... ok</span>
85
<span class="sd"> tests.test_c ... ok</span>
87
<span class="sd">When adding --with-id you'll see::</span>
89
<span class="sd"> % nosetests -v --with-id</span>
90
<span class="sd"> #1 tests.test_a ... ok</span>
91
<span class="sd"> #2 tests.test_b ... ok</span>
92
<span class="sd"> #2 tests.test_c ... ok</span>
94
<span class="sd">Then you can rerun individual tests by supplying just the id numbers::</span>
96
<span class="sd"> % nosetests -v --with-id 2</span>
97
<span class="sd"> #2 tests.test_b ... ok</span>
99
<span class="sd">Then you can rerun individual tests by supplying just the id numbers::</span>
101
<span class="sd"> % nosetests -v --with-id 2 3</span>
102
<span class="sd"> #2 tests.test_b ... ok</span>
103
<span class="sd"> #3 tests.test_c ... ok</span>
104
<span class="sd"> </span>
105
<span class="sd">Since most shells consider '#' a special character, you can leave it out when</span>
106
<span class="sd">specifying a test id.</span>
107
<span class="sd">"""</span>
108
<span class="n">__test__</span> <span class="o">=</span> <span class="bp">False</span>
110
<span class="k">import</span> <span class="nn">logging</span>
111
<span class="k">import</span> <span class="nn">os</span>
112
<span class="k">from</span> <span class="nn">nose.plugins</span> <span class="k">import</span> <span class="n">Plugin</span>
113
<span class="k">from</span> <span class="nn">nose.util</span> <span class="k">import</span> <span class="n">src</span>
115
<span class="k">try</span><span class="p">:</span>
116
<span class="k">from</span> <span class="nn">cPickle</span> <span class="k">import</span> <span class="n">dump</span><span class="p">,</span> <span class="n">load</span>
117
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
118
<span class="k">from</span> <span class="nn">pickle</span> <span class="k">import</span> <span class="n">dump</span><span class="p">,</span> <span class="n">load</span>
120
<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
122
<span class="k">class</span> <span class="nc">TestId</span><span class="p">(</span><span class="n">Plugin</span><span class="p">):</span>
123
<span class="sd">"""</span>
124
<span class="sd"> Activate to add a test id (like #1) to each test name output. After</span>
125
<span class="sd"> you've run once to generate test ids, you can re-run individual</span>
126
<span class="sd"> tests by activating the plugin and passing the ids (with or</span>
127
<span class="sd"> without the # prefix) instead of test names.</span>
128
<span class="sd"> """</span>
129
<span class="n">name</span> <span class="o">=</span> <span class="s">'id'</span>
130
<span class="n">idfile</span> <span class="o">=</span> <span class="bp">None</span>
131
<span class="n">shouldSave</span> <span class="o">=</span> <span class="bp">True</span>
133
<span class="k">def</span> <span class="nf">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">):</span>
134
<span class="n">Plugin</span><span class="o">.</span><span class="n">options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span>
135
<span class="n">parser</span><span class="o">.</span><span class="n">add_option</span><span class="p">(</span><span class="s">'--id-file'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">'store'</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s">'testIdFile'</span><span class="p">,</span>
136
<span class="n">default</span><span class="o">=</span><span class="s">'.noseids'</span><span class="p">,</span>
137
<span class="n">help</span><span class="o">=</span><span class="s">"Store test ids found in test runs in this "</span>
138
<span class="s">"file. Default is the file .noseids in the "</span>
139
<span class="s">"working directory."</span><span class="p">)</span>
141
<span class="k">def</span> <span class="nf">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">):</span>
142
<span class="n">Plugin</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
143
<span class="bp">self</span><span class="o">.</span><span class="n">idfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">options</span><span class="o">.</span><span class="n">testIdFile</span><span class="p">)</span>
144
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">):</span>
145
<span class="bp">self</span><span class="o">.</span><span class="n">idfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">conf</span><span class="o">.</span><span class="n">workingDir</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
146
<span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="mi">1</span>
147
<span class="c"># Ids and tests are mirror images: ids are {id: test address} and</span>
148
<span class="c"># tests are {test address: id}</span>
149
<span class="bp">self</span><span class="o">.</span><span class="n">ids</span> <span class="o">=</span> <span class="p">{}</span>
150
<span class="bp">self</span><span class="o">.</span><span class="n">tests</span> <span class="o">=</span> <span class="p">{}</span>
151
<span class="c"># used to track ids seen when tests is filled from</span>
152
<span class="c"># loaded ids file</span>
153
<span class="bp">self</span><span class="o">.</span><span class="n">_seen</span> <span class="o">=</span> <span class="p">{}</span>
155
<span class="k">def</span> <span class="nf">finalize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
156
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span><span class="p">:</span>
157
<span class="n">fh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span>
158
<span class="c"># save as {id: test address}</span>
159
<span class="n">ids</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
160
<span class="n">dump</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">fh</span><span class="p">)</span>
161
<span class="n">fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
162
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'Saved test ids: </span><span class="si">%s</span><span class="s"> to </span><span class="si">%s</span><span class="s">'</span><span class="p">,</span> <span class="n">ids</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
164
<span class="k">def</span> <span class="nf">loadTestsFromNames</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">names</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
165
<span class="sd">"""Translate ids in the list of requested names into their</span>
166
<span class="sd"> test addresses, if they are found in my dict of tests.</span>
167
<span class="sd"> """</span>
168
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'ltfn </span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">'</span><span class="p">,</span> <span class="n">names</span><span class="p">,</span> <span class="n">module</span><span class="p">)</span>
169
<span class="k">try</span><span class="p">:</span>
170
<span class="n">fh</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span>
171
<span class="bp">self</span><span class="o">.</span><span class="n">ids</span> <span class="o">=</span> <span class="n">load</span><span class="p">(</span><span class="n">fh</span><span class="p">)</span>
172
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'Loaded test ids </span><span class="si">%s</span><span class="s"> from </span><span class="si">%s</span><span class="s">'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
173
<span class="n">fh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
174
<span class="k">except</span> <span class="ne">IOError</span><span class="p">:</span>
175
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">'IO error reading </span><span class="si">%s</span><span class="s">'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">idfile</span><span class="p">)</span>
176
<span class="k">return</span>
178
<span class="c"># I don't load any tests myself, only translate names like '#2'</span>
179
<span class="c"># into the associated test addresses</span>
180
<span class="n">result</span> <span class="o">=</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="nb">map</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tr</span><span class="p">,</span> <span class="n">names</span><span class="p">))</span>
181
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span><span class="p">:</span>
182
<span class="c"># got some ids in names, so make sure that the ids line</span>
183
<span class="c"># up in output with what I said they were last time</span>
184
<span class="bp">self</span><span class="o">.</span><span class="n">tests</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="o">.</span><span class="n">values</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
185
<span class="k">return</span> <span class="n">result</span>
187
<span class="k">def</span> <span class="nf">makeName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
188
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Make name </span><span class="si">%s</span><span class="s">"</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
189
<span class="n">filename</span><span class="p">,</span> <span class="n">module</span><span class="p">,</span> <span class="n">call</span> <span class="o">=</span> <span class="n">addr</span>
190
<span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
191
<span class="n">head</span> <span class="o">=</span> <span class="n">src</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
192
<span class="k">else</span><span class="p">:</span>
193
<span class="n">head</span> <span class="o">=</span> <span class="n">module</span>
194
<span class="k">if</span> <span class="n">call</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
195
<span class="k">return</span> <span class="s">"</span><span class="si">%s</span><span class="s">:</span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">head</span><span class="p">,</span> <span class="n">call</span><span class="p">)</span>
196
<span class="k">return</span> <span class="n">head</span>
198
<span class="k">def</span> <span class="nf">setOutputStream</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
199
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span>
201
<span class="k">def</span> <span class="nf">startTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
202
<span class="n">adr</span> <span class="o">=</span> <span class="n">test</span><span class="o">.</span><span class="n">address</span><span class="p">()</span>
203
<span class="k">if</span> <span class="n">adr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="p">:</span>
204
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span> <span class="ow">or</span> <span class="n">adr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_seen</span><span class="p">:</span>
205
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">' '</span><span class="p">)</span>
206
<span class="k">else</span><span class="p">:</span>
207
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">'#</span><span class="si">%s</span><span class="s"> '</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="p">[</span><span class="n">adr</span><span class="p">])</span>
208
<span class="bp">self</span><span class="o">.</span><span class="n">_seen</span><span class="p">[</span><span class="n">adr</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
209
<span class="k">return</span>
210
<span class="bp">self</span><span class="o">.</span><span class="n">tests</span><span class="p">[</span><span class="n">adr</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span>
211
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">'#</span><span class="si">%s</span><span class="s"> '</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
212
<span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">+=</span> <span class="mi">1</span>
214
<span class="k">def</span> <span class="nf">tr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
215
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"tr '</span><span class="si">%s</span><span class="s">'"</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
216
<span class="k">try</span><span class="p">:</span>
217
<span class="n">key</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'#'</span><span class="p">,</span> <span class="s">''</span><span class="p">))</span>
218
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
219
<span class="k">return</span> <span class="n">name</span>
220
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">"Got key </span><span class="si">%s</span><span class="s">"</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
221
<span class="bp">self</span><span class="o">.</span><span class="n">shouldSave</span> <span class="o">=</span> <span class="bp">False</span>
222
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">:</span>
223
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ids</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
224
<span class="k">return</span> <span class="n">name</span>
230
<script src="http://www.google-analytics.com/urchin.js"
231
type="text/javascript">
233
<script type="text/javascript">
234
_uacct = "UA-2236166-1";