尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
NumPy 测试支持模块 numpy.testing 完全指南:断言、装饰器与测试运行工具
科学计算数据分析【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址https://gitcode.com/gh_mirrors/nu/numpy点击查看免费下载numpy.testing是 NumPy 内置的测试支持模块它为整个 NumPy 乃至 SciPy 的测试套件提供统一的断言、警告捕获、性能测量与测试运行工具。本文以 doc/source/reference/routines.testing.rst 的 API 清单为骨架结合 numpy/testing/_private/utils.py 与 numpy/testing/overrides.py 的源码实现系统讲解每个工具的签名、参数默认值、语义细节与真实用法读完本文你将能够在自己的数值测试脚本中熟练使用np.testing写出专业、健壮的断言并理解其与 pytest 生态的关系。模块定位为所有 NumPy 测试脚本提供统一能力文档开篇即点明模块设计目标Common test support for all numpy test scripts——将 NumPy 测试所需的公共功能集中到单一模块中使得测试脚本只需import numpy.testing即可立刻工作。这一点在 numpy/testing/init.py 的 docstring 与实现中得到印证模块从._private.utils导出全部断言工具并额外暴露TestCase来自unittest、overrides子模块以及PytestTester实例testnumpy.testing.test即各模块test()方法的底层实现。模块内部按职责划分为四层结构numpy/testing/__init__.py公共入口聚合所有导出符号numpy/testing/_private/utils.py核心实现包含全部断言、上下文管理器与工具函数共约 2900 行numpy/testing/_private/extbuild.py供 C 扩展编译测试使用numpy/testing/overrides.py针对__array_ufunc__/__array_function__协议的自定义数组容器测试工具。同时模块级还维护了丰富的平台/环境探测常量如HAS_REFCOUNT、IS_PYPY、IS_WASM、IS_MUSL、NOGIL_BUILD、HAS_LAPACK64等见 utils.py这些常量被 NumPy 自身的测试广泛用于条件跳过展示了如何在不同解释器与平台上优雅地组织测试。推荐使用的断言Assertsnumpy.testing的断言与传统unittest/ 朴素相比核心差异在于对浮点比较的严谨处理NaNs 视为同位置相等、支持容差比较、失败信息中自动附带不匹配索引与最大绝对/相对误差。文档明确指出浮点比较应优先选用assert_allclose、assert_array_almost_equal_nulp或assert_array_max_ulp以获得一致的比较语义。assert_allclose——容差比较的首选np.testing.assert_allclose(actual, desired, rtol1e-7, atol0, equal_nanTrue, err_msg, verboseTrue, *, strictFalse)其判定条件与np.allclose相同|actual - desired| atol rtol * |desired|但更严格——不做广播且默认容差更紧。源码utils.py通过np.isclose完成逐元素判定失败时报头格式为Not equal to tolerance rtol1e-07, atol1e-15并自动汇总不匹配元素数、百分比、最大绝对/相对差及前 5 个不匹配位置诊断信息非常完整。关键参数rtol相对容差默认1e-7atol绝对容差默认0也支持np.timedelta64类型equal_nan默认True两数组同位置的 NaN 视为相等strictNumPy 2.0 新增为True时强制 shape 与 dtype 完全一致禁用标量广播语义。典型应用场景是验证数值算法结果例如np.testing.assert_allclose(x, y, rtol1e-5, atol0)验证arccos(cos(x))与x的一致性或assert_allclose(np.sin(x), 0, atol1e-15)验证三角函数在 π 整数倍处接近零。assert_equal——任意对象的严格相等np.testing.assert_equal(actual, desired, err_msg, verboseTrue, *, strictFalse)支持标量、列表、元组、字典与 ndarray 的混合比较在首个冲突值处抛异常。与 IEEE 754 标准相反两对象同位置均为 NaN 时判定相等datetime/timedelta 的 NaT 在 dtype 一致时同样视为相等-0.0与0.0因符号位不同会被判为不等源码中通过signbit检查utils.py。源码对复杂数会拆分为实部/虚部分别比较对字典按键递归比较utils.py。值得注意的标量特殊语义当一侧为标量、另一侧为数组时等价于逐元素与标量比较因此空数组等于任意标量strictTrueNumPy 2.0 新增可关闭该行为并强制 shape/dtype 一致。实现上若任一侧是ndarray实例则委托给assert_array_equal。assert_array_equal / assert_array_less——数组级比较assert_array_equal(actual, desired, err_msg, verboseTrue, *, strictFalse)校验 shape 相同且逐元素相等NaNs 同位置视为相等失败时输出Arrays are not equal报头及Mismatched elements: 1 / 3 (33.3%)汇总。从源码看它通过assert_array_compare(operator.__eq__, ...)实现utils.pystrict参数1.24 起控制是否要求 shape 与 dtype 完全匹配。assert_array_less(x, y, err_msg, verboseTrue, *, strictFalse)校验x的每个元素严格小于y的对应元素严格小于报头为Arrays are not strictly ordered x y比较操作通过operator.__lt__传入公共比较器且equal_infFalse——即 ±inf 位置不一致也会被报告。strict自 2.0 起可用。两者共用的底层assert_array_compareutils.py是 NumPy 断言体系的引擎统一处理 NaN/Inf/NaT 位置一致性、vstring dtype 的 NA 对象、标量广播、shape/dtype 校验并生成包含Mismatched elements、位置明细、Max absolute difference、Max relative difference的完整失败报告。它还针对 ndarray 子类做了防御对返回np.ma.masked的all()、返回 Python 布尔值的__eq__、未实现np.all的子类均有兼容分支utils.py。assert_array_almost_equal_nulp / assert_array_max_ulp——ULP 级浮点比较当比较对象的数值幅度差异极大从1e-20到1e20相对容差难以选择时ULPUnit in the Last Place最后一位单位方法是最稳健的选择assert_array_almost_equal_nulp(x, y, nulp1)要求|x - y| nulp * spacing(max(|x|, |y|))其中spacing返回相邻可表示浮点数之间的距离assert_array_max_ulp(a, b, maxulp1, dtypeNone)检查所有元素至多相差maxulp个 ULP返回值为 ndarray——包含每对元素之间可表示的浮点数个数可用于进一步量化误差dtype参数可将输入先转换后再比较。二者底层依赖nulp_diff与integer_reprutils.py将浮点数的二进制位模式重解释为符号-数值sign-magnitude整数表示从而把两个浮点数之间有多少个可表示数转化为整数差。实现支持 float16/float32/float64对复数抛NotImplementedError且计算 ULP 差时不做 NaN 不同表示之间的区分。文档示例x*eps/2 x与x的差在 1 ULP 内可通过断言而x*eps x会以Arrays are not equal to 1 ULP (max is 2)失败。assert_raises / assert_raises_regex——异常断言两者直接取自unittestassert_raises的实现是_d.assertRaises(*args, **kwargs)utils.py其中_d是一个unittest.TestCase空实例。支持两种调用形态# 形式一调用可调用对象 assert_raises(ZeroDivisionError, div, 1, 0) # 形式二上下文管理器 with assert_raises(ZeroDivisionError): 1 / 0assert_raises_regex(exception_class, expected_regexp, callable, *args, **kwargs)额外要求异常消息匹配正则表达式同样支持上下文管理器形态。assert_warns / assert_no_warnings / assert_no_gc_cycles——警告与 GC 断言assert_warns(warning_class, func, *args, **kwargs)断言调用产生指定类型警告未产生时抛出AssertionError(No warning raised)也可作为上下文管理器使用。assert_no_warnings(func, *args, **kwargs)断言不产生任何警告通过warnings.catch_warnings(recordTrue)simplefilter(always)实现utils.py。重要变更NumPy 2.4assert_warns与suppress_warnings已被弃用源码中会发出 DeprecationWarning官方建议改用warnings.catch_warnings、warnings.filterwarnings、pytest.warns或pytest.filterwarningsutils.py。在编写新测试时应优先采用 pytest 生态的警告断言。assert_no_gc_cycles(func, *args, **kwargs)断言调用不产生引用循环在无引用计数的解释器如无sys.getrefcount的 Pyston上自动跳过运行时先循环gc.collect()最多 100 次以确保垃圾清空再以gc.DEBUG_SAVEALL模式收集并统计循环对象数量发现循环时在报错中列出各循环对象及其 id 与格式化内容utils.py。这对排查 C 扩展层的引用计数泄漏如 ufunc 误操作引用计数很有价值_assert_valid_refcount即是其配套回归工具。assert_string_equal——字符串 diff 断言assert_string_equal(actual, desired)校验两个字符串相等不等时用difflib.Differ生成逐行 diff报错格式为AssertionError: Differences in strings: - abc abcd? 实现上会先校验两个参数都是str类型再输出差异utils.py非常适合校验输出文本、repr 字符串或错误消息。不推荐使用的断言Asserts, not recommended文档明确建议优先使用上述新式断言以下函数保留主要用于向后兼容assert_(val, msg)断言在-O优化模式下依然生效Python 内建assert在优化模式下不生成字节码。msg支持可调用对象以延迟求值utils.pyassert_almost_equal(actual, desired, decimal7, err_msg, verboseTrue)判据为abs(desired - actual) float64(1.5 * 10**(-decimal))对 ndarray 委托给assert_array_almost_equalassert_approx_equal(actual, desired, significant7, err_msg, verboseTrue)按有效数字位数比较两个标量先将两数归一化到 (-10, 10) 区间再比较源码见 utils.pyassert_array_almost_equal(actual, desired, decimal6, err_msg, verboseTrue)数组版近似相等判据abs(desired-actual) 1.5 * 10**(-decimal)默认decimal6print_assert_equal(test_string, actual, desired)用actual desired比较失败时打印ACTUAL:/DESIRED:两块 pprint 输出并抛出AssertionErrorutils.py。为何不推荐这些函数基于十进制位数的近似比较语义不统一assert_almost_equal的判据比文档原始描述更宽松而assert_allclose的rtol/atol与np.isclose语义一致、跨幅度更稳健ULP 系列则提供了机器精度层面的精确度量。装饰器decorate_methodsdecorate_methods(cls, decorator, testmatchNone)将装饰器批量应用到类中匹配正则的所有公有方法私有方法即下划线开头者被忽略。testmatch默认为re.compile(rf(?:^|[\\b_\\.{os.sep}-])[Tt]est)对应原 nose 的测试命名规则可传入字符串或已编译正则。实现遍历cls.__dict__中的函数对象用testmatch.search(funcname)匹配并就地替换方法utils.py。典型用途是为整个测试类统一追加pytest.mark.skipif或超时等标记。测试运行与辅助工具Test runningclear_and_catch_warningsclear_and_catch_warnings(recordFalse, modules())继承warnings.catch_warnings的上下文管理器额外解决 Python 警告机制的滑头问题Python 会在首次触发警告的模块上写入__warningregistry__导致同一模块内无法再次触发相同警告。该上下文管理器在进入时保存并清空指定模块的警告注册表退出时恢复原状从而保证上下文内可重复触发任意警告utils.pywith np.testing.clear_and_catch_warnings(modules[np._core.fromnumeric]): warnings.simplefilter(always) # 此处可反复触发来自 np._core.fromnumeric 的警告suppress_warningssuppress_warnings(forwarding_rulealways)是比warnings.catch_warnings更强的上下文管理器/装饰器支持sup.filter(category, message, module)添加抑制过滤器message为正则module必须精确匹配、不能是子模块sup.record(category, message, module)添加记录过滤器匹配的警告追加到sup.log属性forwarding_rule取always / once / module / location之一控制未被过滤的警告如何向外转发对应warnings模块的 filter 模式。可作为装饰器包裹整个函数sup。同样自 NumPy 2.4 弃用新代码请使用warnings.filterwarnings/pytest.filterwarnings。measuremeasure(code_str, times1, labelNone)在调用者命名空间中执行代码并返回总耗时秒精度约 10 毫秒基于jiffies()即 Linux 下从/proc/pid/stat读取的用户态调度 jiffies 数。code_str只编译一次适合对快速片段循环计时etime np.testing.measure(for i in range(1000): np.sqrt(i**2), times10)rundocsrundocs(filenameNone, raise_on_errorTrue)运行指定文件中的 doctest通过importlib.util动态加载模块、用doctest.DocTestFinder收集、DocTestRunner执行失败时默认抛出AssertionError。filename缺省时取调用栈上一帧的__file__。它对应np.lib.test(doctestsTrue)式的 doctest 运行通道utils.py。测试自定义数组容器numpy.testing.overrides当实现自定义数组容器duck array并支持__array_ufunc__/__array_function__协议时可用 numpy/testing/overrides.py 提供的四个工具验证协议接线的完整性get_overridable_numpy_ufuncs()返回所有可通过__array_ufunc__覆写的 ufunc 集合。实现为扫描numpy._core.umath命名空间收集所有isinstance(obj, np.ufunc)对象overrides.pyallows_array_ufunc_override(func)判断某函数是否可被__array_ufunc__覆写等价于isinstance(func, np.ufunc)且对 NumPy 之外定义的 ufunc 同样正确get_overridable_numpy_array_functions()返回所有可通过__array_function__覆写的公共 API 函数集合实现上先导入numpy.lib.recfunctions再返回numpy._core.overrides.ARRAY_FUNCTIONS的拷贝确保记录函数也被纳入清单allows_array_function_override(func)判断某函数是否属于可覆写清单func in ARRAY_FUNCTIONS。典型场景是测试自定义数组类型是否正确注册了协议、检查用户误用协议时函数是否被意外劫持。这些工具本身在 numpy/testing/tests/test_utils.py 中有配套测试覆盖。如何运行测试从 numpy.test 到 spin按 doc/TESTS.rst 的说明numpy.testing同时服务于 NumPy 自身与下游项目SciPy 直接复用该测试框架。运行方式有两类Python 内运行针对已安装的 NumPy import numpy numpy.test(labelslow) # fast 为默认full 运行全部含慢速测试 numpy.test(labelfull, verbose2) # verbose1 时报告缺少测试的模块 numpy._core.test() # 仅测试某个子模块命令行运行针对源码构建使用 spin 工具$ spin test -m full # 运行完整测试套件 $ spin test -t numpy/_core/tests # 测试子集 $ spin test -p auto # 用 pytest-run-parallel 多线程压力测试 $ spin test -p auto -- --skip-thread-unsafetrue # 仅运行线程安全测试numpy.test的底层实现是numpy._pytesttester.PytestTester见 numpy/testing/init.py它把label、verbose等参数翻译为 pytest 的-m、-v选项后启动 pytest体现了 numpy.testing 与现代 pytest 框架的衔接——从 1.15 起 NumPy 已全面改用 pytestnose 仅因下游兼容而保留。小结numpy.testing是一个历经 NumPy 数十年演化沉淀的数值测试工具箱assert_allclose、ULP 系列与assert_array_compare引擎解决了浮点比较的精度语义问题assert_warns、suppress_warnings、clear_and_catch_warnings与assert_no_gc_cycles覆盖了警告与内存治理overrides子模块则专门服务于自定义数组容器的协议测试。在编写自己的数值库测试时推荐直接from numpy.testing import assert_allclose, assert_array_equal, assert_array_less并让测试运行统一落到 pytest 生态上pytest.warns、pytest.filterwarnings替代已弃用的警告工具从而获得与 NumPy 官方测试同等水平的诊断信息与可维护性。赞分享科学计算数据分析【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址https://gitcode.com/gh_mirrors/nu/numpy点击查看免费下载相关推荐CuPy 测试支持模块 cupy.testing 完全指南断言、NumPy-CuPy 一致性检查与 dtype/order 参数化测试CuPy 测试支持模块 cupy.testing 完全指南断言、NumPy CuPy 一致性检查与 dtype/order 参数化测试 导读 cupy.tes科学计算高性能计算pandas testing 模块完全指南断言函数、异常体系、Bug 报告与测试运行器pandas testing 模块完全指南断言函数、异常体系、Bug 报告与测试运行器 本文是 pandas 官方 API 参考中 Testing 章节 ht数据分析数据科学数据处理ssh_scan核心原理揭秘如何实现高效SSH协议配置检测ssh_scan核心原理揭秘如何实现高效SSH协议配置检测 SSH协议配置检测工具ssh_scan是一款由Mozilla开发的开源安全扫描器专门用于检测SS上一篇FFmpegFreeUIWindows上最强大的视频转码图形界面工具终极指南下一篇VUnit verification components实战UART、AXI等IP核测试案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

LibreChat部署实战:打造统一多模型AI对话平台

LibreChat部署实战:打造统一多模型AI对话平台

1. 为什么我最终还是选了LibreChat如果你手头同时握着好几个大模型的API密钥,那你一定遇到过这种尴尬时刻:想对比一下GPT-4o和Claude 3.5 Sonnet对同一道复杂代码题的作答质量,结果需要在两个网页标签页之间来回横跳,复制粘贴到手…

📅 2026/9/20 22:36:45
DeepSpeech 学术引用清单解读:BIBLIOGRAPHY.md 论文全览与 BibTeX 引用实战指南

DeepSpeech 学术引用清单解读:BIBLIOGRAPHY.md 论文全览与 BibTeX 引用实战指南

人工智能语音音频深度学习 【免费下载链接】DeepSpeech DeepSpeech is an open source embedded (offline, on-device) speech-to-text engine which can run in real time on devices ranging from a Raspberry Pi 4 to high power GPU servers. 项目地址: https:/…

📅 2026/9/20 22:36:45
Quasar QTimeline 组件完全指南:三种布局、插槽体系与无障碍时间线实战

Quasar QTimeline 组件完全指南:三种布局、插槽体系与无障碍时间线实战

前端UI组件跨平台 【免费下载链接】quasar Quasar Framework - Build high-performance VueJS user interfaces in record time 项目地址: https://gitcode.com/gh_mirrors/qu/quasar 点击查看 免费下载 Quasar Framework 的 QTimeline 组件用于以时间轴的形式按时…

📅 2026/9/20 22:31:45
MORE NEWS

更多资讯

📰

enzyme ShallowWrapper.debug() 方法完全指南:用 HTML 化字符串快速定位组件渲染问题

enzyme ShallowWrapper.debug() 方法完全指南:用 HTML 化字符串快速定位组件渲染问题 【免费下载链接】enzyme JavaScript Testing utilities for React 项目地址: https://gitcode.com/gh_mirrors/en/enzyme 导读 当你在用 enzyme 编写 React 单元测试时&a…

📰

Skynet框架设计原理与高并发系统实践

1. 这不是“八股文”——Skynet 框架面试题的本质是什么?很多人看到“Skynet 框架面试题”第一反应是:又一个要背的冷门技术点?尤其当它和“Java八股文”“Vue3面试题2026”“绝密100个Spark面试题”混在一起刷屏时,很容易误判——…

📰

WeKnora 完整部署指南:Docker Compose 四步跑通私有 RAG 知识库

WeKnora 完整部署指南:Docker Compose 四步跑通私有 RAG 知识库 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://gitc…

📰

ExoPlayer Cast 投屏 Demo 实战指南:用 CastPlayer 与 ExoPlayer 实现投屏与本地播放无缝切换

音视频移动开发 【免费下载链接】ExoPlayer An extensible media player for Android 项目地址: https://gitcode.com/gh_mirrors/exop/ExoPlayer 点击查看 免费下载 本指南围绕 ExoPlayer 仓库中的 demos/cast/README.md 展开,系统讲解 Cast demo 应用…

📰

OpenResearch工作流搭建指南:打造可追踪、可复现的开放研究链路

"OpenResearch"这个词我在圈子里听到的频率越来越高。前阵子跟几个做学术和独立开发的朋友聊,大家不约而同地在折腾同一件事:怎么让自己的研究过程更透明、结果更好复现、协作更省力。说白了,就是把整个研究链路从选题、文献、实验…

📰

Learn Go with Tests 章节模板解读:把 TDD 循环固化为每个章节的标准骨架

Learn Go with Tests 章节模板解读:把 TDD 循环固化为每个章节的标准骨架 【免费下载链接】learn-go-with-tests Learn Go with test-driven development 项目地址: https://gitcode.com/gh_mirrors/le/learn-go-with-tests 导读 template.md 是开源书籍《L…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬