测试您不知道输出的代码

时间:2013-04-09 21:13:52

标签: java unit-testing junit

我目前的项目相当复杂,并且进行了大量的数学运算,其中我事先并不知道结果。我正在尝试编写单元测试(在JUint中);我目前已经编写了一些测试,然后我手工查看结果,看看它们“看起来”是否正确,但由于我的程序是我如何确定复杂数学的结果,我不是我确定如何验证准确性。

我有其他单元测试用于测试非常小的代码片段,但我不确定如何为更大块的代码编写测试。有人有任何想法和指导吗?

更多信息,这不是一个数字。它更像是:“输入:100,000行csv数据”输出“100,000 csv分析”。但这些行依赖于彼此,在10行csv数据上运行代码并不足以有意义地进行数学运算。

4 个答案:

答案 0 :(得分:5)

做数学要求你是一名数学家,即使你是一个非常糟糕的人。没有办法绕过它。考虑到这一点,以下是数学家用来检查答案的一些方法:

  • 从答案中获取输入,迫使您反思。
  • 使用其他方法来获得相同的答案。
  • 将问题缩小为更小,更容易验证的步骤。
  • 尝试在现实世界中使用结果,并观察是否有不良事件发生。

如果您大致知道您的程序应该输出什么答案,那么您可以检查您的程序是否接近正确的答案,然后希望它是正确的并将其用于您的单元测试。但根据我的经验(游戏开发),真实的,硬核数学是检查自己最可靠的方法。此外,您还可以轻松获得世界上最先进的计算器之一。 :)

P.S。不要忘记在单元测试中留下一些差异。特别是在进行更高级的数学运算时,有多种正确的方法可以使浮点运算产生稍微不同的答案。

答案 1 :(得分:1)

您应该能够选择特定输入并获得这些输入的预期结果。如果你不能手工完成一些测试用例结果,你应该将你正在测试的部分分解成多个可测试的部分。您还可以在测试中使用不同的技术然后在测试项目中解决数学问题。这个问题是,如果它们不同,哪一个是错的......但至少你知道该找什么。

答案 2 :(得分:0)

这很大程度上取决于你正在做的数学类型。例如,如果您正在求解微分方程,那么您将验证您获得了相同答案的一半步长,或者您将结果与已知的精确(但缓慢)方法(如反欧拉方法)进行比较。

在不知道你正在做什么类型的数学的情况下,我假设你正在使用双精度算术。尝试将结果与BigDecimal等任意精度库进行比较,以验证您是否遇到了大量的舍入和截断错误。

答案 3 :(得分:0)

以下建议可能有点微不足道:

  • 尝试提供可以预期输出的输入(所有零数据,除一个值以外的所有零数据等)
  • 如果可能,尝试为您手动执行的部分检查编写代码,并在大/多输入上运行
  • 使用不同的算法(或由不同的开发人员)再次实现代码并交叉检查两个实现
  • 对于小规模,手动检查的运行请参阅代码覆盖率(例如使用Jacoco http://www.eclemma.org/jacoco/)并尝试修改输入/创建新输入以增加代码覆盖率