我是科学计算中测试驱动开发的坚定拥护者。实际上,它的实用性令人just舌,并且确实减轻了代码开发人员所知道的经典麻烦。但是,测试普通编程中未遇到的科学代码存在固有的困难,因此TDD文本作为教程并不是很有用。例如:
通常,对于先验的给定复杂问题,您不知道确切的答案,那么如何编写测试?
并行度改变;我最近遇到了一个错误,该错误将MPI任务作为3的倍数使用会失败,但是2的倍数有效。此外,由于MPI的本质,常见的测试框架似乎对MPI不太友好-您必须重新执行测试二进制文件以更改任务数。
科学法规通常包含许多紧密耦合,相互依存和可互换的部分。我们都已经看过遗留代码,并且我们知道放弃良好的设计并使用全局变量是多么诱人。
通常,数值方法可能是一种“实验”,或者编码人员无法完全理解它的工作原理并试图理解它,因此无法预期结果。
我为科学代码编写的一些测试示例:
对于时间积分器,请使用具有精确解决方案的简单ODE,并测试您的积分器是否在给定的精度范围内将其求解,并且通过使用不同步长进行测试来确定精度顺序是否正确。
零稳定性测试:检查边界/初始条件为0的方法是否保持为0。
插值测试:给定线性函数,请确保插值正确。
旧版验证:在已知正确的旧版应用程序中隔离大量代码,并提取一些离散值用于测试。
除了人工试验和错误之外,我常常想出如何无法正确测试给定的代码块。您能否提供一些为数字代码编写的测试示例和/或测试科学软件的一般策略?