pytest

支持 XFAIL/XPASS 的 py.test 技巧

sympy.testing.pytest.SKIP(reason)[源代码][源代码]

类似于 skip(),但这是一个装饰器。

sympy.testing.pytest.nocache_fail(func)[源代码][源代码]

用于标记测试的虚拟装饰器,当缓存被禁用时这些测试会失败

sympy.testing.pytest.raises(expectedException, code=None)[源代码][源代码]

测试 code 是否引发异常 expectedException

code 可能是一个可调用的对象,例如 lambda 表达式或函数名。

如果 code 未提供或为 None,raises 将返回一个用于 with 语句的上下文管理器;要执行的代码来自 with 的作用域。

raises() 如果可调用对象引发了预期的异常则什么都不做,否则会引发一个 AssertionError。

示例

>>> 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

请注意,您不能通过 with raises 测试多个语句:

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

这正是 with 的预期功能:在第一次异常时中止包含的语句序列,并让上下文管理器处理异常。

要测试多个语句,您需要为每个语句使用一个单独的 with

>>> with raises(ZeroDivisionError):
...     n = 1/0    # will execute and raise
>>> with raises(ZeroDivisionError):
...     n = 9999/0 # will also execute and raise
sympy.testing.pytest.skip_under_pyodide(message)[源代码][源代码]

如果正在 pyodide 下运行,则跳过测试的装饰器。

sympy.testing.pytest.warns(
warningcls,
*,
match='',
test_stacklevel=True,
)[源代码][源代码]

类似于 raises,但测试是否发出警告。

>>> from sympy.testing.pytest import warns
>>> import warnings
>>> with warns(UserWarning):
...     warnings.warn('deprecated', UserWarning, stacklevel=2)
>>> 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: [].

test_stacklevel 确保检查 warn()stacklevel 参数设置,以便警告显示用户代码行(位于 warns() 上下文管理器下的代码)。如果这存在歧义或上下文管理器不测试直接发出警告的用户代码,请将此设置为 False。

如果警告是 SymPyDeprecationWarning ,这还会测试 active_deprecations_target 是否是 active-deprecations.md 文件中的一个真实目标。

sympy.testing.pytest.warns_deprecated_sympy()[源代码][源代码]

warns(SymPyDeprecationWarning) 的简写

这是测试 SymPyDeprecationWarning 是否为 SymPy 中已弃用功能发出的推荐方法。要测试其他警告,请使用 warns。要抑制警告而不断言它们被发出,请使用 ignore_warnings

备注

warns_deprecated_sympy() 仅用于 SymPy 测试套件内部,以测试弃用警告是否正确触发。SymPy 代码库中的所有其他代码,包括文档示例,都不应使用已弃用的行为。

如果你是 SymPy 的用户,并且你想禁用 SymPyDeprecationWarnings,请使用 warnings 过滤器(参见 静默 SymPy 弃用警告)。

>>> from sympy.testing.pytest import warns_deprecated_sympy
>>> from sympy.utilities.exceptions import sympy_deprecation_warning
>>> with warns_deprecated_sympy():
...     sympy_deprecation_warning("Don't use",
...        deprecated_since_version="1.0",
...        active_deprecations_target="active-deprecations")
>>> 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: [].

备注

有时堆栈级别测试会失败,因为同一警告被多次发出。在这种情况下,你可以在代码中使用 sympy.utilities.exceptions.ignore_warnings() 来防止 SymPyDeprecationWarning 被再次递归地发出。在极少数情况下,由于调用函数的方式不同会产生不同的调用栈,因此无法为弃用警告设置一致的 stacklevel。在这些情况下,请改用 warns(SymPyDeprecationWarning)