Java JUnit assertEqual适用于双打,含百分比增量

Java JUnit assertEqual适用于双打,含百分比增量,java,unit-testing,junit,Java,Unit Testing,Junit,在JUnit中,双打的assertEquals采用绝对增量。但百分比值不是比绝对值更适合保证金吗?当比较两个较大的值时,由于四舍五入(如有)而产生的误差很可能会导致最后一个有效数字,而与指数无关。在这种情况下,拥有一个绝对的三角洲并没有帮助,是吗 这并不难,我写了一个,但很好奇为什么JUnit没有这个功能。我错过了什么吗?这取决于具体情况。如果您有一个固定的精度,例如小数点后两位,您可能需要0.5e-2的增量,但是如果您有一个未知的精度,您需要有效数字,您可能需要更复杂的东西,如 assertE

在JUnit中,双打的assertEquals采用绝对增量。但百分比值不是比绝对值更适合保证金吗?当比较两个较大的值时,由于四舍五入(如有)而产生的误差很可能会导致最后一个有效数字,而与指数无关。在这种情况下,拥有一个绝对的三角洲并没有帮助,是吗


这并不难,我写了一个,但很好奇为什么JUnit没有这个功能。我错过了什么吗?

这取决于具体情况。如果您有一个固定的精度,例如小数点后两位,您可能需要0.5e-2的增量,但是如果您有一个未知的精度,您需要有效数字,您可能需要更复杂的东西,如

assertEquals(expected, actual, Math.abs(expected) / 1e3);

相对错误的问题是,很难知道它是相对于预期的、实际的还是两者的某种组合。

人们只能假设JUnit API中没有线索,但它针对的是浮点域中数字表示的微小差异(小数点后第15位出现差异时)。毕竟,从绝对值版本到前入口版本要比从另一个角度更容易。

在预期值为零的情况下,百分比公差将不好,但您愿意接受一个非常小的值就足够了。因此,cuurent API可用于所有numeric值。

只是吹毛求疵-我认为与预期值相对是非常合乎逻辑的。我想不出一种逻辑情况,即根据实际值指定边距。@LakshmanKakkirala我非常习惯于实际值,因此如果您希望两个数字在0.005以内相同,我自然会使用它,因为您有两个小数点精度,这是一个正常的用例。如果你使用double,你总是需要使用合理的舍入,如果你这样做,相对误差就没有那么有意义了。你对什么是正确的和不正确的值不会随着实际情况而变化吗?我知道这可能没什么大关系,但理论上,这两者并不相同,我仍然不确定你在哪里定义suc测试的成功或失败不是基于预期值,而是基于实际值!你能举个例子吗?同意。正如其他人所说,可以模拟百分比误差。但最好将其直接作为API的一部分,以便将用户错误降至最低。