单元测试和测试驱动开发的策略


16

我是科学计算中测试驱动开发的坚定拥护者。实际上,它的实用性令人just舌,并且确实减轻了代码开发人员所知道的经典麻烦。但是,测试普通编程中未遇到的科学代码存在固有的困难,因此TDD文本作为教程并不是很有用。例如:

  • 通常,对于先验的给定复杂问题,您不知道确切的答案,那么如何编写测试?

  • 并行度改变;我最近遇到了一个错误,该错误将MPI任务作为3的倍数使用会失败,但是2的倍数有效。此外,由于MPI的本质,常见的测试框架似乎对MPI不太友好-您必须重新执行测试二进制文件以更改任务数。

  • 科学法规通常包含许多紧密耦合,相互依存和可互换的部分。我们都已经看过遗留代码,并且我们知道放弃良好的设计并使用全局变量是多么诱人。

  • 通常,数值方法可能是一种“实验”,或者编码人员无法完全理解它的工作原理并试图理解它,因此无法预期结果。

我为科学代码编写的一些测试示例:

  • 对于时间积分器,请使用具有精确解决方案的简单ODE,并测试您的积分器是否在给定的精度范围内将其求解,并且通过使用不同步长进行测试来确定精度顺序是否正确。

  • 零稳定性测试:检查边界/初始条件为0的方法是否保持为0。

  • 插值测试:给定线性函数,请确保插值正确。

  • 旧版验证:在已知正确的旧版应用程序中隔离大量代码,并提取一些离散值用于测试。

除了人工试验和错误之外,我常常想出如何无法正确测试给定的代码块。您能否提供一些为数字代码编写的测试示例和/或测试科学软件的一般策略?


您能否说明插值测试的含义?
德米特里·卡巴诺夫

Answers:


8

制造溶液的方法

通过改进研究验证该方法达到了理论上的准确性顺序。

保留答案。解的按位和规范复制。


我想在原始帖子中提及MMS;这对代码验证很有用,但是从单元测试的角度来看,它完全毫无价值。如果这些测试失败,则不会提供任何线索或原因。
Aurelius

3
@Aurelius:但这是测试驱动开发的绝佳策略!对于PDE / ODE /线性代数代码,您应该编写非常小的 MMS测试,并且可以在不到一秒钟的时间内运行。进行更改时,您将运行它们。如果它们破裂,则说明您做错了!您会惊讶于元素的问题能告诉您多少(或任何其他信息)。2×2×2
Bill Barth 2013年

我在MMS上看到的许多文献基本上都是全局解决方案,例如对于CFD问题,制造的解决方案可能是机翼分析。当测试失败时,充其量您只能将问题的范围缩小到5,000行,因此对于TDD而言,它毫无价值-您不知道实际失败的原因。我同意2x2x2问题非常有价值,而且我个人经常使用它们。但是我遇到的问题很普遍,只有大型系统才会出现。实际上,我最近发现了一个ifort编译器错误,该错误仅在大问题中才表现出来。
Aurelius

@Aurelius:这里没有争论。您应该进行一系列测试,并经常运行它们。
Bill Barth 2013年

@Aurelius从表面上看,MMS不是单元测试,而是功能或验收测试(即整个系统的测试)。但是,代码通常具有不同的阶段(或可以分为多个阶段)。例如平流,压力,粘度。然后,只能测试这些阶段之一(“单元”)。同样,可以在没有BC,然后再有BC的情况下测试代码。一位朋友在单元测试中获得博士学位,他认为最大的好处是它迫使您将程序分解为单元,因此可以进行单元测试...也许这比起初看起来更适用(和以其他我不知道的方式)。
palpalium

6

Bill已经列出了一些解决您的问题的方法。

解决您的第三点,不,没有理由在零件之间引入强耦合。恰恰相反:如果您的函数或类具有定义良好的接口,则例如将线性求解器交换为另一个求解器或采用时间步进方案将更加容易。抵制它,然后您将能够分别测试这些组件。数十年来,我们已经通过Deal.II实现了这一目标。

第四点:如果您的方法是实验,则使用该方法的实验就构成了测试。只要您没有分析,就必须将这些测试结果视为最佳结果。但是通常,您对方法的顺序有一个期望,或者您会知道它对于特定类的解决方案是准确的,例如多项式在一定程度上是正确的。验证这些内容应该是您实验的一部分,并且随着分析的改进,可以添加测试。


1
为了增加Guido的回答,他的讲话经验记录在我们每次对Deal.II进行的大约3,000个测试中:每次更改后:Dealii.org/developer/development/…。关于如果您不知道确切答案该怎么办的问题:无论如何都要编写测试,并让它将今天的答案与昨天的答案(或无论何时编写测试的答案)进行比较。即使您不知道它们是使答案错误还是更正了先前不正确的答案,用一种方法来发现代码输出中的更改也很有价值。
Wolfgang Bangerth

3

我最近在计算科学领域找到了有关TDD的论文。我还没有读过它,所以我不知道它是否有用,但希望对您有所帮助。

http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf


1
我浏览了一些简介和结论,并假设其质量水平与标准博士学位论文相当,这既以高层次的方式说明了该过程,又对其有效性进行了实际评估。我认为这是一个发现。
Godric Seer 2015年

链接已死。您的意思是:Nanthaamornphong,A。“测试驱动的开发和重构技术在计算科学和工程软件开发中的有效性”。博士学位论文,大学。阿拉巴马州(2014)。
AlQuemist
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.