pytest¶
支持 XFAIL/XPASS 的 py.test 技巧
- 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.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)
。