Mercurial > bitten > bitten-test
annotate bitten/util/testrunner.py @ 868:242f2e225c4e 0.6.x
0.6dev: Merged [928,935:937,943:945] from trunk.
author | hodgestar |
---|---|
date | Mon, 18 Oct 2010 11:52:18 +0000 |
parents | f4d07544722b |
children |
rev | line source |
---|---|
379 | 1 # -*- coding: utf-8 -*- |
22 | 2 # |
408
933105ab516b
Update file headers and other stuff pointing to the old home.
cmlenz
parents:
379
diff
changeset
|
3 # Copyright (C) 2005-2007 Christopher Lenz <cmlenz@gmx.de> |
482 | 4 # Copyright (C) 2008 Matt Good <matt@matt-good.net> |
833 | 5 # Copyright (C) 2008-2010 Edgewall Software |
163 | 6 # All rights reserved. |
22 | 7 # |
163 | 8 # This software is licensed as described in the file COPYING, which |
9 # you should have received as part of this distribution. The terms | |
408
933105ab516b
Update file headers and other stuff pointing to the old home.
cmlenz
parents:
379
diff
changeset
|
10 # are also available at http://bitten.edgewall.org/wiki/License. |
22 | 11 |
429 | 12 from distutils import log |
13 from distutils.errors import DistutilsOptionError | |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
14 import os |
22 | 15 import re |
429 | 16 from StringIO import StringIO |
22 | 17 import sys |
18 import time | |
429 | 19 from pkg_resources import Distribution, EntryPoint, PathMetadata, \ |
20 normalize_path, require, working_set | |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
21 from setuptools.command.test import test |
22 | 22 from unittest import _TextTestResult, TextTestRunner |
23 | |
221 | 24 from bitten import __version__ as VERSION |
25 from bitten.util import xmlio | |
22 | 26 |
411
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
27 __docformat__ = 'restructuredtext en' |
a169d2e96463
Use reStructuredText as the API documentation syntax.
cmlenz
parents:
408
diff
changeset
|
28 |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
29 |
22 | 30 class XMLTestResult(_TextTestResult): |
31 | |
32 def __init__(self, stream, descriptions, verbosity): | |
33 _TextTestResult.__init__(self, stream, descriptions, verbosity) | |
34 self.tests = [] | |
35 | |
36 def startTest(self, test): | |
37 _TextTestResult.startTest(self, test) | |
38 filename = sys.modules[test.__module__].__file__ | |
39 if filename.endswith('.pyc') or filename.endswith('.pyo'): | |
40 filename = filename[:-1] | |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
41 self.tests.append([test, filename, time.time(), None, None]) |
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
42 |
22 | 43 def stopTest(self, test): |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
44 self.tests[-1][2] = time.time() - self.tests[-1][2] |
121
381233a91db6
Fix for the {{{unittest}}} command, which was raising an exception but swallowing the traceback.
cmlenz
parents:
105
diff
changeset
|
45 _TextTestResult.stopTest(self, test) |
22 | 46 |
47 | |
48 class XMLTestRunner(TextTestRunner): | |
49 | |
105
de5b6e69fc7e
* Make the {{{unittest}}} command raise an exception if the tests failed, so that distutils exits with a non-zero return code.
cmlenz
parents:
60
diff
changeset
|
50 def __init__(self, stream=sys.stdout, xml_stream=None): |
de5b6e69fc7e
* Make the {{{unittest}}} command raise an exception if the tests failed, so that distutils exits with a non-zero return code.
cmlenz
parents:
60
diff
changeset
|
51 TextTestRunner.__init__(self, stream, descriptions=0, verbosity=2) |
22 | 52 self.xml_stream = xml_stream |
53 | |
54 def _makeResult(self): | |
55 return XMLTestResult(self.stream, self.descriptions, self.verbosity) | |
56 | |
57 def run(self, test): | |
58 result = TextTestRunner.run(self, test) | |
59 if not self.xml_stream: | |
60 return result | |
61 | |
221 | 62 root = xmlio.Element('unittest-results') |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
63 for testcase, filename, timetaken, stdout, stderr in result.tests: |
22 | 64 status = 'success' |
65 tb = None | |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
66 |
22 | 67 if testcase in [e[0] for e in result.errors]: |
68 status = 'error' | |
69 tb = [e[1] for e in result.errors if e[0] is testcase][0] | |
70 elif testcase in [f[0] for f in result.failures]: | |
71 status = 'failure' | |
72 tb = [f[1] for f in result.failures if f[0] is testcase][0] | |
73 | |
144
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
74 name = str(testcase) |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
75 fixture = None |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
76 description = testcase.shortDescription() or '' |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
77 if description.startswith('doctest of '): |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
78 name = 'doctest' |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
79 fixture = description[11:] |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
80 description = None |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
81 else: |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
82 match = re.match('(\w+)\s+\(([\w.]+)\)', name) |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
83 if match: |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
84 name = match.group(1) |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
85 fixture = match.group(2) |
76dea27af878
* Make the `<python:unittest>` command strip the base dir from file names in the report. Fixes #42.
cmlenz
parents:
121
diff
changeset
|
86 |
221 | 87 test_elem = xmlio.Element('test', file=filename, name=name, |
88 fixture=fixture, status=status, | |
89 duration=timetaken) | |
22 | 90 if description: |
221 | 91 test_elem.append(xmlio.Element('description')[description]) |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
92 if stdout: |
221 | 93 test_elem.append(xmlio.Element('stdout')[stdout]) |
60
055a6c666fa8
* Pass a {{{Context}}} object to recipe commands as the first argument. Currently this only has the basedir, but will be extended to also provide output recording etc.
cmlenz
parents:
22
diff
changeset
|
94 if stderr: |
221 | 95 test_elem.append(xmlio.Element('stdout')[stderr]) |
96 if tb: | |
97 test_elem.append(xmlio.Element('traceback')[tb]) | |
98 root.append(test_elem) | |
22 | 99 |
100 root.write(self.xml_stream, newlines=True) | |
101 return result | |
102 | |
103 | |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
104 class unittest(test): |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
105 description = test.description + ', and optionally record code coverage' |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
106 |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
107 user_options = test.user_options + [ |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
108 ('xml-output=', None, |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
109 "Path to the XML file where test results are written to"), |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
110 ('coverage-dir=', None, |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
111 "Directory where coverage files are to be stored"), |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
112 ('coverage-summary=', None, |
429 | 113 "Path to the file where the coverage summary should be stored"), |
114 ('coverage-method=', None, | |
115 "Whether to use trace.py or coverage.py to collect code coverage. " | |
116 "Valid options are 'trace' (the default) or 'coverage'.") | |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
117 ] |
22 | 118 |
119 def initialize_options(self): | |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
120 test.initialize_options(self) |
367 | 121 self.xml_output = None |
122 self.xml_output_file = None | |
221 | 123 self.coverage_summary = None |
22 | 124 self.coverage_dir = None |
429 | 125 self.coverage_method = 'trace' |
22 | 126 |
127 def finalize_options(self): | |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
128 test.finalize_options(self) |
429 | 129 |
367 | 130 if self.xml_output is not None: |
503
a7c795920c4a
Merging trac-0.11 branch to trunk. This revision is equivalent to [571].
wbell
parents:
482
diff
changeset
|
131 output_dir = os.path.dirname(self.xml_output) or '.' |
a7c795920c4a
Merging trac-0.11 branch to trunk. This revision is equivalent to [571].
wbell
parents:
482
diff
changeset
|
132 if not os.path.exists(output_dir): |
a7c795920c4a
Merging trac-0.11 branch to trunk. This revision is equivalent to [571].
wbell
parents:
482
diff
changeset
|
133 os.makedirs(output_dir) |
367 | 134 self.xml_output_file = open(self.xml_output, 'w') |
22 | 135 |
482 | 136 if self.coverage_method not in ('trace', 'coverage', 'figleaf'): |
429 | 137 raise DistutilsOptionError('Unknown coverage method %r' % |
138 self.coverage_method) | |
139 | |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
140 def run_tests(self): |
441
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
141 if self.coverage_summary: |
429 | 142 if self.coverage_method == 'coverage': |
441
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
143 self._run_with_coverage() |
482 | 144 elif self.coverage_method == 'figleaf': |
145 self._run_with_figleaf() | |
429 | 146 else: |
441
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
147 self._run_with_trace() |
22 | 148 else: |
149 self._run_tests() | |
150 | |
482 | 151 def _run_with_figleaf(self): |
152 import figleaf | |
153 figleaf.start() | |
154 try: | |
155 self._run_tests() | |
156 finally: | |
157 figleaf.stop() | |
158 figleaf.write_coverage(self.coverage_summary) | |
159 | |
441
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
160 def _run_with_coverage(self): |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
161 import coverage |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
162 coverage.use_cache(False) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
163 coverage.start() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
164 try: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
165 self._run_tests() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
166 finally: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
167 coverage.stop() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
168 |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
169 modules = [m for _, m in sys.modules.items() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
170 if m is not None and hasattr(m, '__file__') |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
171 and os.path.splitext(m.__file__)[-1] in ('.py', '.pyc')] |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
172 |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
173 # Generate summary file |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
174 buf = StringIO() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
175 coverage.report(modules, file=buf) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
176 buf.seek(0) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
177 fileobj = open(self.coverage_summary, 'w') |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
178 try: |
471
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
179 filter_coverage(buf, fileobj) |
441
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
180 finally: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
181 fileobj.close() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
182 |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
183 if self.coverage_dir: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
184 if not os.path.exists(self.coverage_dir): |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
185 os.makedirs(self.coverage_dir) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
186 coverage.annotate(modules, directory=self.coverage_dir, |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
187 ignore_errors=True) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
188 |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
189 def _run_with_trace(self): |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
190 from trace import Trace |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
191 trace = Trace(ignoredirs=[sys.prefix, sys.exec_prefix], trace=False, |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
192 count=True) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
193 try: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
194 trace.runfunc(self._run_tests) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
195 finally: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
196 results = trace.results() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
197 real_stdout = sys.stdout |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
198 sys.stdout = open(self.coverage_summary, 'w') |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
199 try: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
200 results.write_results(show_missing=True, summary=True, |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
201 coverdir=self.coverage_dir) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
202 finally: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
203 sys.stdout.close() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
204 sys.stdout = real_stdout |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
205 |
22 | 206 def _run_tests(self): |
356
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
207 old_path = sys.path[:] |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
208 ei_cmd = self.get_finalized_command("egg_info") |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
209 path_item = normalize_path(ei_cmd.egg_base) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
210 metadata = PathMetadata( |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
211 path_item, normalize_path(ei_cmd.egg_info) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
212 ) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
213 dist = Distribution(path_item, metadata, project_name=ei_cmd.egg_name) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
214 working_set.add(dist) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
215 require(str(dist.as_requirement())) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
216 loader_ep = EntryPoint.parse("x=" + self.test_loader) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
217 loader_class = loader_ep.load(require=False) |
173f0c362fe1
The `unittest` command is now based on the setuptools `test command.
cmlenz
parents:
295
diff
changeset
|
218 |
441
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
219 try: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
220 import unittest |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
221 unittest.main( |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
222 None, None, [unittest.__file__] + self.test_args, |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
223 testRunner=XMLTestRunner(stream=sys.stdout, |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
224 xml_stream=self.xml_output_file), |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
225 testLoader=loader_class() |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
226 ) |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
227 except SystemExit, e: |
641a73f078f5
Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
cmlenz
parents:
429
diff
changeset
|
228 return e.code |
221 | 229 |
230 | |
471
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
231 def filter_coverage(infile, outfile): |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
232 for idx, line in enumerate(infile): |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
233 if idx < 2 or line.startswith('--'): |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
234 outfile.write(line) |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
235 continue |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
236 parts = line.split() |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
237 name = parts[0] |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
238 if name == 'TOTAL': |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
239 continue |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
240 if name not in sys.modules: |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
241 outfile.write(line) |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
242 continue |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
243 filename = os.path.normpath(sys.modules[name].__file__) |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
244 if filename.endswith('.pyc') or filename.endswith('.pyo'): |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
245 filename = filename[:-1] |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
246 outfile.write(line.rstrip() + ' ' + filename + '\n') |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
247 |
b15e6eec8422
extract the code for filtering coverage files so it can be reused
mgood
parents:
442
diff
changeset
|
248 |
295
5f84af72d17f
* Store executable bit in ZIP archives (from `svn:executable`).
cmlenz
parents:
221
diff
changeset
|
249 def main(): |
221 | 250 from distutils.dist import Distribution |
251 from optparse import OptionParser | |
252 | |
253 parser = OptionParser(usage='usage: %prog [options] test_suite ...', | |
254 version='%%prog %s' % VERSION) | |
367 | 255 parser.add_option('-o', '--xml-output', action='store', dest='xml_output', |
221 | 256 metavar='FILE', help='write XML test results to FILE') |
257 parser.add_option('-d', '--coverage-dir', action='store', | |
258 dest='coverage_dir', metavar='DIR', | |
259 help='store coverage results in DIR') | |
260 parser.add_option('-s', '--coverage-summary', action='store', | |
261 dest='coverage_summary', metavar='FILE', | |
262 help='write coverage summary to FILE') | |
263 options, args = parser.parse_args() | |
264 if len(args) < 1: | |
265 parser.error('incorrect number of arguments') | |
266 | |
267 cmd = unittest(Distribution()) | |
268 cmd.initialize_options() | |
269 cmd.test_suite = args[0] | |
367 | 270 if hasattr(options, 'xml_output'): |
271 cmd.xml_output = options.xml_output | |
221 | 272 if hasattr(options, 'coverage_summary'): |
273 cmd.coverage_summary = options.coverage_summary | |
274 if hasattr(options, 'coverage_dir'): | |
275 cmd.coverage_dir = options.coverage_dir | |
276 cmd.finalize_options() | |
277 cmd.run() | |
278 | |
279 if __name__ == '__main__': | |
512
a68da2b81220
`sys.argv` is assumed by `main`, and it takes no parameters, so removing
dfraser
parents:
503
diff
changeset
|
280 main() |