1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
''' Nose test running
Implements test and bench functions for modules.
'''
import os
import sys
import re
import nose
class NoseTester(object):
""" Nose test runner.
Usage: NoseTester(<package>).test()
<package> is package path or module Default for package is None. A
value of None finds calling module path.
Typical call is from module __init__, and corresponds to this:
>>> test = NoseTester().test
In practice, because nose may not be importable, the __init__
files actually have:
>>> from scipy.testing.pkgtester import Tester
>>> test = Tester().test
The pkgtester module checks for the presence of nose on the path,
returning this class if nose is present, and a null class
otherwise.
"""
def __init__(self, package=None):
''' Test class init
Parameters
----------
package : string or module
If string, gives full path to package
If None, extract calling module path
Default is None
'''
if package is None:
f = sys._getframe(1)
package = f.f_locals.get('__file__', None)
assert package is not None
package = os.path.dirname(package)
elif isinstance(package, type(os)):
package = os.path.dirname(package.__file__)
self.package_path = package
def _add_doc(testtype):
''' Decorator to add docstring to functions using test labels
Parameters
----------
testtype : string
Type of test for function docstring
'''
def docit(func):
test_header = \
'''Parameters
----------
label : {'fast', 'full', '', attribute identifer}
Identifies %(testtype)s to run. This can be a string to pass to
the nosetests executable with the'-A' option, or one of
several special values.
Special values are:
'fast' - the default - which corresponds to
nosetests -A option of
'not slow'.
'full' - fast (as above) and slow %(testtype)s as in
no -A option to nosetests - same as ''
None or '' - run all %(testtype)ss
attribute_identifier - string passed directly to
nosetests as '-A'
verbose : integer
verbosity value for test outputs, 1-10
extra_argv : list
List with any extra args to pass to nosetests''' \
% {'testtype': testtype}
func.__doc__ = func.__doc__ % {
'test_header': test_header}
return func
return docit
@_add_doc('(testtype)')
def _test_argv(self, label, verbose, extra_argv):
''' Generate argv for nosetest command
%(test_header)s
'''
argv = [__file__, self.package_path, '-s']
if label and label != 'full':
if not isinstance(label, basestring):
raise TypeError, 'Selection label should be a string'
if label == 'fast':
label = 'not slow'
argv += ['-A', label]
argv += ['--verbosity', str(verbose)]
if extra_argv:
argv += extra_argv
return argv
@_add_doc('test')
def test(self, label='fast', verbose=1, extra_argv=None, doctests=False,
coverage=False):
''' Run tests for module using nose
%(test_header)s
doctests : boolean
If True, run doctests in module, default False
'''
argv = self._test_argv(label, verbose, extra_argv)
if doctests:
argv+=['--with-doctest','--doctest-tests']
if coverage:
argv+=['--cover-package=numpy','--with-coverage',
'--cover-tests','--cover-inclusive','--cover-erase']
# bypass these samples under distutils
argv += ['--exclude','f2py_ext']
argv += ['--exclude','f2py_f90_ext']
argv += ['--exclude','gen_ext']
argv += ['--exclude','pyrex_ext']
argv += ['--exclude','swig_ext']
nose.run(argv=argv)
@_add_doc('benchmark')
def bench(self, label='fast', verbose=1, extra_argv=None):
''' Run benchmarks for module using nose
%(test_header)s'''
argv = self._test_argv(label, verbose, extra_argv)
argv += ['--match', r'(?:^|[\\b_\\.%s-])[Bb]ench' % os.sep]
nose.run(argv=argv)
|