我确信软件测试确实非常重要,特别是在科学方面。然而,在过去的6年中,我从来没有遇到任何经常进行测试的科学软件项目(其中大多数甚至不受版本控制)。
现在我想知道你如何处理科学代码(数值计算)的软件测试。
从我的观点来看,标准单元测试经常忽略这一点,因为没有确切的结果,因此使用assert(a == b)
可能会因“正常”数值错误而变得有点困难。
所以我很期待阅读你对此的想法。
答案 0 :(得分:11)
我也在学术界,我已经编写了在我们的集群上执行的量子力学模拟程序。我对测试甚至版本控制做了同样的观察。我更糟糕的是:在我的情况下,我使用C ++库进行模拟,而我从其他人那里获得的代码是纯粹的意大利面条代码,没有继承,甚至没有功能。
我重写了它,我也实施了一些单元测试。您必须处理数值精度是正确的,根据您运行的体系结构,数值精度可能会有所不同。尽管如此,只要您考虑这些数值舍入误差,就可以进行单元测试。您的结果不应该取决于数值的舍入,否则您的算法的稳健性会有不同的问题。
因此,总而言之,我对我的科学计划使用单元测试,这确实让人对结果更有信心,特别是在最终发布数据方面。
答案 1 :(得分:11)
刚看了一个类似的问题(谷歌:“测试科学软件”),并提出了一些可能感兴趣的论文。这些既包括平凡的编码错误,也包括了解结果是否正确(地球的地幔深度?)的更大问题。
http://www.cs.ua.edu/~SECSE09/Presentations/09_Hook.pdf(链接断开;新链接为http://www.se4science.org/workshops/secse09/Presentations/09_Hook.pdf)
我认为09_Hook.pdf(另请参阅matmute.sourceforge.net)中描述的突变测试的想法特别有趣,因为它模仿了我们所犯的简单错误。最难的部分是学习使用统计分析来获得置信水平,而不是单次通过代码审查(人或机器)。
问题不是新问题。我确信我有一本原创资料“科学软件的准确度如何?”由Hatton等人于1994年10月发表,即使在那时也表明同一理论(如算法)的不同实现如何快速分化(在Kelly& Sanders论文中也是参考文献8)
答案 2 :(得分:8)
我也在为TEST_ASSERT_DELTA
使用cpptest。我正在编写计算电磁学中的高性能数值程序,我很高兴在我的C ++程序中使用它。
我通常会像处理任何其他类型的代码一样测试科学代码,只需要几个润饰,即:
我总是在没有物理意义的情况下测试我的数字代码,并确保计算在生成结果之前实际停止。我学到了很多困难:我有一个计算一些频率响应的函数,然后提供了一个用它们构建的矩阵作为参数的另一个函数,最终给出了它的答案单个向量。矩阵可以是任何大小,取决于信号应用的终端数量,但我的功能是不检查矩阵大小是否与终端数量一致(2个终端应该是指2 x 2 x n矩阵);然而,代码本身被包装以便不依赖于它,它不关心矩阵的大小,因为它只需要对它们进行一些基本的矩阵运算。最终,结果非常合理,完全在预期的范围内,事实上,部分正确 - 只有一半的解决方案向量出现乱码。我花了一段时间来计算。如果你的数据看起来是正确的,那么它就是在一个有效的数据结构中组装而且数值很好(例如没有NaN或负粒子数),但它没有物理意义,函数必须优雅地失败。
< / LI>我总是测试I / O例程,即使它们只是从测试文件中读取一堆以逗号分隔的数字。当你编写的代码进行扭曲数学运算时,总是很想进入调试代码的一部分,这些代码非常重要,以至于你需要咖啡因来理解这些符号。几天后,您意识到您还将\n
的ASCII值添加到您的积分列表中。
在测试数学关系时,我总是“按书”测试它,我也通过实例学习了这一点。我已经看到了应该比较两个向量的代码,但只检查了元素的相等性,并没有检查长度是否相等。
答案 3 :(得分:2)