pytest¶
py.test hacks to support XFAIL/XPASS
- sympy.testing.pytest.ignore_warnings(warningcls)[source]¶
Context manager to suppress warnings during tests.
This function is useful for suppressing warnings during tests. The warns function should be used to assert that a warning is raised. The ignore_warnings function is useful in situation when the warning is not guaranteed to be raised (e.g. on importing a module) or if the warning comes from third-party code.
When the warning is coming (reliably) from SymPy the warns function should be preferred to ignore_warnings.
>>> from sympy.testing.pytest import ignore_warnings >>> import warnings
Here’s a warning:
>>> with warnings.catch_warnings(): # reset warnings in doctest ... warnings.simplefilter('error') ... warnings.warn('deprecated', UserWarning) Traceback (most recent call last): ... UserWarning: deprecated
Let’s suppress it with ignore_warnings:
>>> with warnings.catch_warnings(): # reset warnings in doctest ... warnings.simplefilter('error') ... with ignore_warnings(UserWarning): ... warnings.warn('deprecated', UserWarning)
(No warning emitted)
- sympy.testing.pytest.nocache_fail(func)[source]¶
Dummy decorator for marking tests that fail when cache is disabled
- sympy.testing.pytest.raises(expectedException, code=None)[source]¶
Tests that
code
raises the exceptionexpectedException
.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 inwith
statements; the code to execute then comes from the scope of thewith
.raises()
does nothing if the callable raises the expected exception, otherwise it raises an AssertionError.Examples
>>> from sympy.testing.pytest import raises
>>> raises(ZeroDivisionError, lambda: 1/0) <ExceptionInfo ZeroDivisionError(...)> >>> raises(ZeroDivisionError, lambda: 1/2) Traceback (most recent call last): ... Failed: DID NOT RAISE
>>> with raises(ZeroDivisionError): ... n = 1/0 >>> with raises(ZeroDivisionError): ... n = 1/2 Traceback (most recent call last): ... Failed: 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
- sympy.testing.pytest.warns(warningcls, *, match='')[source]¶
Like raises but tests that warnings are emitted.
>>> from sympy.testing.pytest import warns >>> import warnings
>>> with warns(UserWarning): ... warnings.warn('deprecated', UserWarning)
>>> with warns(UserWarning): ... pass Traceback (most recent call last): ... Failed: DID NOT WARN. No warnings of type UserWarning was emitted. The list of emitted warnings is: [].
- sympy.testing.pytest.warns_deprecated_sympy()[source]¶
Shorthand for
warns(SymPyDeprecationWarning)
This is the recommended way to test that
SymPyDeprecationWarning
is emitted for deprecated features in SymPy. To test for other warnings usewarns
. To suppress warnings without asserting that they are emitted useignore_warnings
.>>> from sympy.testing.pytest import warns_deprecated_sympy >>> from sympy.utilities.exceptions import SymPyDeprecationWarning >>> with warns_deprecated_sympy(): ... SymPyDeprecationWarning("Don't use", feature="old thing", ... deprecated_since_version="1.0", issue=123).warn()
>>> with warns_deprecated_sympy(): ... pass Traceback (most recent call last): ... Failed: DID NOT WARN. No warnings of type SymPyDeprecationWarning was emitted. The list of emitted warnings is: [].