py.test hacks to support XFAIL/XPASS


Similar to skip(), but this is a decorator.

sympy.utilities.pytest.raises(expectedException, code=None)[source]

Tests that code raises the exception expectedException.

code may be a callable, such as a lambda expression or function name.

If code is not given or None, raises will return a context manager for use in with statements; the code to execute then comes from the scope of the with. The calling module must have from __future__ import with_statement as its first code line for compatibility with Python 2.5 in that case.

raises does nothing if the callable raises the expected exception, otherwise it raises an AssertionError.


>>> from sympy.utilities.pytest import raises
>>> raises(ZeroDivisionError, lambda: 1/0)
>>> raises(ZeroDivisionError, lambda: 1/2)
Traceback (most recent call last):
AssertionError: DID NOT RAISE

(Python 2.5’s doctest cannot support with statements due to a bug in its __import__ handling. That’s why the following examples are excluded from doctesting; the doctest: annotations can go once SymPy stops Python 2.5 support.)

>>> with raises(ZeroDivisionError): 
...     n = 1/0
>>> with raises(ZeroDivisionError): 
...     n = 1/2
Traceback (most recent call last):
AssertionError: DID NOT RAISE

Note that you cannot test multiple statements via with raises:

>>> with raises(ZeroDivisionError): 
...     n = 1/0    # will execute and raise, aborting the ``with``
...     n = 9999/0 # never executed

This is just what with is supposed to do: abort the contained statement sequence at the first exception and let the context manager deal with the exception.

To test multiple statements, you’ll need a separate with for each:

>>> with raises(ZeroDivisionError): 
...     n = 1/0    # will execute and raise
... with raises(ZeroDivisionError):
...     n = 9999/0 # will also execute and raise

Previous topic


Next topic

Randomised Testing

This Page