FFo*_*Fox 32 testing unit-testing scientific-computing
我确信软件测试确实非常重要,特别是在科学方面.然而,在过去的6年中,我从来没有遇到任何经常进行测试的科学软件项目(其中大多数甚至不受版本控制).
现在我想知道你如何处理科学代码(数值计算)的软件测试.
从我的观点来看,标准单元测试经常忽略这一点,因为没有确切的结果,因此使用assert(a == b)可能会因"正常"数值误差而变得有点困难.
所以我很期待阅读你对此的想法.
Phi*_*ley 12
刚看了一个类似的问题(谷歌:"测试科学软件"),并提出了一些可能感兴趣的论文.这些既包括平凡的编码错误,也包括了解结果是否正确(地球的地幔深度?)的更大问题.
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)
Gor*_*tch 11
我也在学术界,我已经编写了在我们的集群上执行的量子力学模拟程序.我对测试甚至版本控制做了同样的观察.我更糟糕的是:在我的情况下,我使用C++库进行模拟,而我从其他人那里得到的代码是纯粹的意大利面条代码,没有继承,甚至没有函数.
我重写了它,我也实施了一些单元测试.您必须处理数值精度是正确的,根据您运行的体系结构,数值精度可能会有所不同.尽管如此,只要您考虑这些数值舍入误差,就可以进行单元测试.您的结果不应该取决于数值的舍入,否则您的算法的稳健性会有不同的问题.
因此,总而言之,我对我的科学计划使用单元测试,这确实让人对结果更有信心,特别是在最终发布数据方面.
小智 8
我也在使用cpptest TEST_ASSERT_DELTA.我正在编写计算电磁学中的高性能数值程序,我很高兴在我的C++程序中使用它.
我通常会像处理任何其他类型的代码一样测试科学代码,只需要几个润饰,即:
对于没有物理意义的情况,我总是测试我的数字代码,并确保在产生结果之前计算实际停止.我学到了很多困难:我有一个计算一些频率响应的函数,然后提供了一个用它们构建的矩阵作为参数的另一个函数,最终给出了它的答案单个向量.矩阵可以是任何大小,取决于信号应用于多少个终端,但我的功能是不检查矩阵大小是否与终端数量一致(2个终端应该是指2 x 2 xn矩阵); 然而,代码本身被包装以便不依赖于它,它不关心矩阵的大小,因为它只需要对它们进行一些基本的矩阵运算.最终,结果非常合理,完全在预期的范围内,实际上,部分正确 - 只有一半的解决方案向量出现乱码.我花了一段时间来计算.如果您的数据看起来正确,则它汇集在一个有效的数据结构中并且数值很好(例如没有NaN或负粒子数)但它没有物理意义,该函数必须优雅地失败.
我总是测试I/O例程,即使它们只是从测试文件中读取一堆以逗号分隔的数字.当你编写代码扭曲数学的时候,总是很想进入调试代码的一部分,这个代码非常重要,以至于你需要咖啡因来理解这些符号.几天后,您意识到您还要将ASCII值添加\n到您的点列表中.
在测试数学关系时,我总是"通过书本"测试它,我也通过实例学习了这一点.我已经看到了应该比较两个向量的代码,但只检查了元素的相等性,并没有检查长度是否相等.
| 归档时间: |
|
| 查看次数: |
3165 次 |
| 最近记录: |