0

我目前的项目比较复杂,做了大量的数学运算,我事先不知道结果。我正在尝试编写单元测试(在 JUint 中);我目前有一些我已经写过的测试,然后我手动查看结果,看看它们是否“看起来”正确,但由于我的程序是我确定复杂数学结果的方式,所以我不是真的很确定我如何验证准确性。

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

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

4

4 回答 4

5

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

  • 从答案中得出输入,迫使您向后思考。
  • 使用不同的方法得到相同的答案。
  • 将问题分解为更小、更容易验证的步骤。
  • 尝试在现实世界中使用结果,并观察是否发生了不好的事情。

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

PS 不要忘记在单元测试中留下一些差异。特别是在进行更高级的数学运算时,由于浮点运算,有多种正确的方法可以给出略有不同的答案。

于 2013-04-09T21:24:23.157 回答
1

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

于 2013-04-09T21:18:12.930 回答
0

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

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

于 2013-04-09T21:18:25.917 回答
0

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

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