单元测试数学代码

Grz*_*nio 8 java testing math unit-testing

我正在编写一个小实用程序来计算复杂的数学公式(使用commons-math库进行集成和根查找).我试图以与普通业务应用程序相同的方式编写它,但是我发现我的类正在快速增加.为了得到计算的第一步(1行公式有2个积分),我已经为计算的每一小部分写了3个类,这样我就可以使用依赖注入并正确地模拟所有对commons-math的调用.虽然它有点失控,但我最终会遇到20个类,这个问题可以在一个类中的2个屏幕上解决(没有单元测试).你最喜欢的方法是什么?我非常想要仅仅依靠接受和更高级别的测试.

Kon*_*rus 9

不要让测试创建一个完全无法使用且难以理解的代码.并且不要过度使用面向对象方法的功能.

你正在测试一个函数,即无状态存在,它为相同的参数产生相同的结果.我认为你应该如何测试它:从所有可能的等价类中给它参数并在结果上断言.


Dra*_*788 5

以我的经验,您应该将单元测试用作健全性检查和可能的回归检查。当然,单元测试应该尽可能地彻底,但是有时使其完全测试代码的全部功能非常繁琐。

单元测试不是正式的证明。他们不能也不会预言将来的错误和代码问题。测试代码的常见用例。如果您需要大量的可靠性,则需要创建一个大型的回归测试存储库。幸运的是,对于常见问题,有一些在线数据库可以解决此类问题。例如,TPLP是定理证明者的问题(和解决方案)数据库。

一种有时对我有用的技术...通常在数学代码中,有“简单但缓慢”的方法和“快速但难以编程”的方法。编写代码时,您想使用快速但难于编写的代码(因此,您会期望遇到错误)。因此...快速建立被测系统(SUT)。进行单元测试时,请创建1000个随机问题,并使用“简单但缓慢”的方法解决它们。然后,运行SUT并确保答案相似。

当然假设...创建随机问题是一个容易解决的问题。有时是,有时不是。如果您不告诉我们有关数学代码本身的信息,这很难说。现在...这能解决所有问题吗?不会。但是它将得到“常见”案例。并且,如果在实践中弹出一个极端的案例,请将其包装在单元测试中,并在下一版代码中进行修复。