【问题标题】:cross-platform numerical testing?跨平台数值测试?
【发布时间】:2026-01-22 05:50:01
【问题描述】:

我需要测试可在 Linux 和 Windows 上运行的数值软件。测试涉及将输出与已知良好的输出等进行比较,类似于在 Numerical regression testing。为了澄清,输出不一定是数字 - 它们可以是分类器或文本的分类预测。在 Linux 上,这是一个差异;在 Windows 上是另外一回事,但我的目标是每个测试只编写一次。我知道 CMake/CTest 可用于生成跨平台测试,但它们似乎仅限于检查非零退出状态。是否有软件可以在每个平台上自动选择正确的“差异”?也许是我不知道的 CTest 模块/包?

【问题讨论】:

  • 如果你正在编写一个数字包,你可能已经有了一个语言和库,可以让你做比比较数字更复杂的事情。我怀疑直接用 C(或任何你的语言)对回归测试进行编码,并在测试通过时以指示成功的状态退出测试将是最简单的事情。
  • 不要使用差异。你永远不会在不同的计算机上得到相同的结果。您必须定义合理的绝对误差和相对误差,并相应地比较您的结果。
  • @usr1234567,我补充说明输出不一定是数字。所以对于很多测试来说,diff 是合适的。

标签: cmake regression-testing ctest


【解决方案1】:

CMake 和 CTest 不提供复杂的测试评估。主要区分通过测试、跳过测试、失败测试(非零返回值、异常、SIGTERM)。

  1. 使用 FAIL / PASS_REGULAR_EXPRESSION 评估输出。您可以对这两个属性使用正则表达式。正则表达式非常有限;尤其是估计数值误差的正则表达式是没有用的。可以编写一个更复杂的 CMake 函数来扩展 CMake 的功能。我不知道有任何项目这样做。

  2. 您可以使用专门用于单元测试的外部工具。此工具的结果值由 CTest 评估。根据语言的不同,可能的外部工具有:googletest、JUnit、Python unittest 甚至 diff。

  3. 编写您自己的输出评估脚本。例如 Perl 或 Python 易于使用并且具有良好的解析质量。您可以通过add_test 添加带有实际测试的脚本作为参数。该脚本运行测试,比较输出并将结果发送给 CTest。

因此,您必须安装额外的语言解释器,例如 Perl 或 Python 或第三方帮助工具。或者坚持为每个平台编写评估。

【讨论】: