用于C ++数值应用程序的测试套件?


13

最近,我一直在推动我的小组在编写他们的代码时包括更多的测试。有几个主要的错误所花的时间比可能需要花费的时间长得多,因为我们没有适当的测试机制。

但是,我怀疑拥有适当的工具来自动化(或帮助简化)流程肯定会有用。另一方面,我不知道C ++测试套件的各种选项,以及如何在它们之间进行选择?

是否有寻找内容的指南?是否有专门针对数值应用的指南?

Answers:


11

测试数字代码的问题是:(i)您可能并不总是知道确切的输出,并且您现在只能保存计算结果以与以后进行比较-即进行回归测试,以及(ii)由于四舍五入的关系,结果在不同的机器上可能会有少量差异。

要查看Deal.II是如何做到的,请在此处查看:http : //www.dealii.org/developer/development/testsuite.html#regression_tests


关于单元测试的局限性的要点。回归测试是一件好事(肯定比不进行测试要好得多,因为输出是未知的;它可以给出有关错误的警告信号)。至于机器的修整问题,缓解这种情况是否会通过反复试验而选择一个好的公差?
Geoff Oxberry

2
这是一个持续的痛苦。在十多年的测试中,我们从来没有想出一个真正好的对策。使用numdiff代替diff可以有所帮助,但是最终您需要指定一台要存储“ 0.3987”的计算机,而不是在正确的数字为0.39875时在另一台计算机上存储的“ 0.3988”。无论您在何处设置阈值,都将始终在错误的位置截取另一个。
Wolfgang Bangerth,

@WolfgangBangerth。有某些特定于编译器的标志使浮点行为更具确定性。例如/ fp:strict | precise和/ Qimf-arch-consistency:true(英特尔编译器)或-fnounsafe-math-optimizations,-ffloat-store(GCC)可以使您的代码在各个平台上更加一致和可重现,而以性能为代价。通过一些调整,这提供了一种特殊的“可重现”构建,可以专门用于测试。
安德烈

@Andre-哦,是的,我们尝试了所有这些方法。仍然很困难:-)
Wolfgang Bangerth '17

10

最近,我一直在使用googletest来测试我正在研究的几个数字库,并且对此感到非常满意。您可以非常快速地编写相当简单的测试,也可以编写需要数据初始化等的复杂测试。它还提供了(就像我确定很多其他人一样)轻松进行浮点比较而不是按位比较的方法。


googletest的优点是,它们使在应用程序中轻松包含其源代码变得容易,因此您不必使其成为依赖项。
Geoff Oxberry


1

对于我们的计算生物学C ++库(Chaste),我们使用http://cxxtest.com/。这使用起来相当简单,效果很好,它提供了一些用于使用assert()样式语句进行测试的宏。对于科学计算,这些通常是与的简单直接比较TS_ASSERT_EQUALS(a,b)或与的数值比较TS_ASSERT_DELTA(a,b,tolerance)

使用这些基本宏也可以轻松编写额外的宏,从而比较自己选择的矢量/矩阵。在有用的情况下,您还可以检查代码在给定情况下是否抛出适当的警告和错误消息。您可以在以下test源代码的文件夹中浏览一些示例:https : //chaste.cs.ox.ac.uk/trac/browser/trunk

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.