单元测试数学代码

单元测试数学代码

问题描述:

我正在编写一个用于计算复杂数学公式的小工具(使用公用数学库进行集成和根发现)。我试图以与正常业务应用程序相同的方式编写它,但是我发现我正在快速增加一些类。为了得到计算的第一步(1个具有2个积分的直线公式),我已经为计算的每一个小小点编写了3个类,以便我可以使用依赖注入并正确地模拟所有对公共数学的调用。虽然有点失控,但我最终还是得到了20个类,这个类可以在一个类的两个屏幕上解决(没有单元测试)。你最喜欢的方法是什么?我非常想要仅仅依靠这个接受和更高水平的测试。单元测试数学代码

+3

你谈论嘲笑公用数学。我不会那样做。 Commons-math是一段可靠,可靠的代码。在测试中使用它而不是嘲笑它。这是否简化了事情? – DJClayworth 2010-07-06 13:23:07

+0

如果您需要模拟20个课程,也许这些课程耦合得太紧密? (高凝聚力)。 – 2010-07-06 13:26:05

不要让测试创建一个完全不可用的和难以理解的代码。而且不要用面向对象的方法来过度发挥功能。

您正在测试一项功能,即无国籍之处在于产生相同的结果为相同的参数。我认为你应该如何测试它:从所有可能的等价类中给出它的论点,并对结果进行断言。

+1

+1:我同意。但是,不管你做什么,都不要孤立地忽略这个函数的单元测试。如果你这样做,当你试图测试包含它的程序集时,你会后悔的。我从痛苦的经历写下。 – 2010-07-06 13:10:52

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

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

一种技术,有时对我的作品......通常在数学代码,还有“容易,但慢”的方法,而“快,但很难编程”方法。编写代码时,你想使用快速但很难写的(所以你期望错误)。所以...做出被测系统(SUT)的快速方式。当你进行单元测试时,创建1000个随机问题并用“简单但慢”的方法解决它们。然后,运行SUT并确保答案是类似的。

假设,当然......,创建随机的问题是一个容易解决的问题。有时候是,有时并非如此。没有你告诉我们数学代码本身,很难说。现在...这是否得到所有的情况?不,但会得到“常见”情况。如果在实践中出现拐角案例,请将其包装在单元测试中,并将其修复到下一个版本的代码中。