具有预期错误的单元测试

时间:2010-10-11 16:08:40

标签: unit-testing

对于我的ColorJizz库,当您在不同颜色格式之间进行多次转换时,我期待轻微错误。错误都非常小(即0.0001)。

您认为我应该怎么做?

我觉得有两个真正的选择:

  1. 保持原样,将近30%的测试失败
  2. 在我的单元测试中加入某种“错误范围”,如果它们在该范围内,则传递它们。但我如何判断我应该有什么级别或错误?
  3. 以下是我遇到的一种失败的例子:

    http://www.mikeefranklin.co.uk/tests/test/

    什么是最好的解决方案?

3 个答案:

答案 0 :(得分:3)

您似乎正在使用浮点值,rounding errors are a fact of life。我建议在单元测试中为比较检查应用误差范围。

即使您的某些单元测试失败也不是一个现实的选择 - 单元测试在正常情况下应该通过100%。如果你让其中一些经常失败,你就不会轻易注意到新的失败,这标志着代码中存在真正的错误。

答案 1 :(得分:2)

错误范围是浮点“相等”测试的标准方法。

NUnit uses "within"

Assert.That( 2.1 + 1.2, Is.EqualTo( 3.3 ).Within( .0005 );

Ruby's test/unit uses assert_in_delta

assert_in_delta 0.05, (50000.0 / 10**6), 0.00001

大多数其他测试框架都有类似的东西。显然qunit是有类似的东西,但是很容易修改the source以包含你的一个设计。

对于要使用的实际增量,它取决于您的应用程序。我认为0.01实际上对于人类在视觉上识别颜色差异具有相当大的限制性,但在数学上这将是一个相当宽松的要求。

答案 2 :(得分:1)

Gallio/MbUnit针对该特定测试用例(Assert.AreApproximatelyEqual)提供专用断言

double a = 5;
double b = 4.999;
Assert.AreApproximatelyEqual(a, b, 0.001); // Pass!