##// END OF EJS Templates
IPython.testing.tools without Nose
IPython.testing.tools without Nose

File last commit:

r26991:ca9ff08f
r27041:47037d10
Show More
_decorators.py
150 lines | 4.6 KiB | text/x-python | PythonLexer
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 """
Decorators for labeling and modifying behavior of test objects.
Fernando Perez
Checkpoint with more tests working....
r1420
Decorators that merely return a modified version of the original
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 function object are straightforward. Decorators that return a new
Fernando Perez
Checkpoint with more tests working....
r1420 function object need to use
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 ::
nose.tools.make_decorator(original_function)(decorator)
in returning the decorator, in order to preserve meta-data such as
function name, setup and teardown functions and so on - see
``nose.tools`` for more information.
Fernando Perez
Checkpoint with more tests working....
r1420
"""
Fernando Perez
Update numpy's decorators.py from upstream.
r2369
Fernando Perez
Make IPython work if a recent numpy is not available....
r2406 # IPython changes: make this work if numpy not available
# Original code:
MinRK
don't unconditionally import nose...
r3692 try:
Thomas Kluyver
Use explicit relative imports...
r13347 from ._numpy_testing_noseclasses import KnownFailureTest
MinRK
don't unconditionally import nose...
r3692 except:
pass
Paul Ivanov
make know failures report as 'K'...
r3511
Fernando Perez
Make IPython work if a recent numpy is not available....
r2406 # End IPython changes
Fernando Perez
Checkpoint with more tests working....
r1420
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 def skipif(skip_condition, msg=None):
"""
Make function raise SkipTest exception if a given condition is true.
If the condition is a callable, it is used at runtime to dynamically
make the decision. This is useful for tests that may require costly
imports, to delay the cost until the test suite is actually executed.
Fernando Perez
Checkpoint with more tests working....
r1420
Parameters
Fernando Perez
Update docs for automatic API building.
r1850 ----------
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 skip_condition : bool or callable
Flag to determine whether to skip the decorated test.
msg : str, optional
Message to give on raising a SkipTest exception. Default is None.
Returns
-------
decorator : function
Decorator which, when applied to a function, causes SkipTest
to be raised when `skip_condition` is True, and the function
to be called normally otherwise.
Fernando Perez
Checkpoint with more tests working....
r1420
Notes
-----
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 The decorator itself is decorated with the ``nose.tools.make_decorator``
function in order to transmit function name, and various other metadata.
"""
Fernando Perez
Checkpoint with more tests working....
r1420 def skip_decorator(f):
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 # Local import to avoid a hard nose dependency and only incur the
# import time overhead at actual test-time.
Fernando Perez
Checkpoint with more tests working....
r1420 import nose
Fernando Perez
Update numpy's decorators.py from upstream.
r2369
# Allow for both boolean or callable skip conditions.
if callable(skip_condition):
skip_val = lambda : skip_condition()
else:
skip_val = lambda : skip_condition
def get_msg(func,msg=None):
"""Skip message with information about function being skipped."""
Bernardo B. Marques
remove all trailling spaces
r4872 if msg is None:
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 out = 'Test skipped due to test condition'
Bernardo B. Marques
remove all trailling spaces
r4872 else:
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 out = '\n'+msg
return "Skipping test: %s%s" % (func.__name__,out)
# We need to define *two* skippers because Python doesn't allow both
# return with value and yield inside the same function.
def skipper_func(*args, **kwargs):
"""Skipper for normal test functions."""
if skip_val():
raise nose.SkipTest(get_msg(f,msg))
Fernando Perez
Checkpoint with more tests working....
r1420 else:
return f(*args, **kwargs)
Fernando Perez
Update numpy's decorators.py from upstream.
r2369
def skipper_gen(*args, **kwargs):
"""Skipper for test generators."""
if skip_val():
raise nose.SkipTest(get_msg(f,msg))
else:
for x in f(*args, **kwargs):
yield x
# Choose the right skipper to use when building the actual decorator.
if nose.util.isgenerator(f):
skipper = skipper_gen
else:
skipper = skipper_func
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Checkpoint with more tests working....
r1420 return nose.tools.make_decorator(f)(skipper)
Fernando Perez
Update numpy's decorators.py from upstream.
r2369
Fernando Perez
Checkpoint with more tests working....
r1420 return skip_decorator
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 def knownfailureif(fail_condition, msg=None):
"""
Make function raise KnownFailureTest exception if given condition is true.
Parameters
----------
Matthias Bussonnier
Cleanup unused functionality in decorators.
r23405 fail_condition : bool
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 Flag to determine whether to mark the decorated test as a known
failure (if True) or not (if False).
msg : str, optional
Message to give on raising a KnownFailureTest exception.
Default is None.
Returns
-------
decorator : function
Matthias Bussonnier
Cleanup unused functionality in decorators.
r23405 Decorator, which, when applied to a function, causes KnownFailureTest to
be raised when `fail_condition` is True and the test fails.
Fernando Perez
Update numpy's decorators.py from upstream.
r2369
Notes
-----
The decorator itself is decorated with the ``nose.tools.make_decorator``
function in order to transmit function name, and various other metadata.
"""
if msg is None:
msg = 'Test skipped due to known failure'
def knownfail_decorator(f):
# Local import to avoid a hard nose dependency and only incur the
# import time overhead at actual test-time.
import nose
Matthias Bussonnier
Cleanup unused functionality in decorators.
r23405
Nikita Kniazev
Make knownfailureif Pytest-compatible
r26966 try:
from pytest import xfail
except ImportError:
Nikita Kniazev
Fix xfail polyfill signature
r26991 def xfail(msg):
Nikita Kniazev
Make knownfailureif Pytest-compatible
r26966 raise KnownFailureTest(msg)
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 def knownfailer(*args, **kwargs):
Matthias Bussonnier
Cleanup unused functionality in decorators.
r23405 if fail_condition:
Nikita Kniazev
Make knownfailureif Pytest-compatible
r26966 xfail(msg)
Fernando Perez
Update numpy's decorators.py from upstream.
r2369 else:
return f(*args, **kwargs)
return nose.tools.make_decorator(f)(knownfailer)
return knownfail_decorator