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