不要让测试创建一个完全无法使用且难以理解的代码.并且不要过度使用面向对象方法的功能.
你正在测试一个函数,即无状态存在,它为相同的参数产生相同的结果.我认为你应该如何测试它:从所有可能的等价类中给它参数并在结果上断言.
以我的经验,您应该将单元测试用作健全性检查和可能的回归检查。当然,单元测试应该尽可能地彻底,但是有时使其完全测试代码的全部功能非常繁琐。
单元测试不是正式的证明。他们不能也不会预言将来的错误和代码问题。测试代码的常见用例。如果您需要大量的可靠性,则需要创建一个大型的回归测试存储库。幸运的是,对于常见问题,有一些在线数据库可以解决此类问题。例如,TPLP是定理证明者的问题(和解决方案)数据库。
一种有时对我有用的技术...通常在数学代码中,有“简单但缓慢”的方法和“快速但难以编程”的方法。编写代码时,您想使用快速但难于编写的代码(因此,您会期望遇到错误)。因此...快速建立被测系统(SUT)。进行单元测试时,请创建1000个随机问题,并使用“简单但缓慢”的方法解决它们。然后,运行SUT并确保答案相似。
当然假设...创建随机问题是一个容易解决的问题。有时是,有时不是。如果您不告诉我们有关数学代码本身的信息,这很难说。现在...这能解决所有问题吗?不会。但是它将得到“常见”案例。并且,如果在实践中弹出一个极端的案例,请将其包装在单元测试中,并在下一版代码中进行修复。