0

我需要编写一个 JUnit 测试,它将比较两个相同格式的 csv 文件,并且只有当它们的绝对差小于阈值时才会通过。我需要字符串和双精度匹配,它应该满足阈值标准。

CSV 格式:

第一个.csv
 名称 price-1 price-2
 项目 1 5.12 6.12
 项目 2 4.23 5.56
 项目 3 11.2 12.23

第二个.csv

 名称 price-1 price-2
 项目 1 5.12 6.10
 项目 2 4.20 5.50
 项目 3 11.19 12.19

现在假设差异阈值为 0.15。所以这里 first.csv 和 second.csv 中 item2 的 price1 之间的绝对差异是 0.03,那么它将通过 JUnit 测试,如果差异阈值为 0.02,那么它将失败。

有什么好的解决方案?

4

2 回答 2

3

当您将 assertEquals 与 double 一起使用时,您可以传入一个阈值。这在junit中称为delta。

或者你可以使用

assertTrue (Math.abs(val1 - val2) < threshold);

所以在你的例子中

价格 2 是 6.12 和 6.10

在第一个你可以使用

assertEquals(6.12d, 6.10d, 0.15)

这会通过

或者

assertEquals(Math.abs(6.12d - 6.10d) < 0.15)

这会过去的。

我建议使用 assertEquals 并插入数字,以便您了解 assertEquals 重载方法

当您从文件中读取时,您可能会读取字符串。让他们双倍然后做

try {
    Double d1 = Double.parseDouble(str1);
    Double d2 = Double.parseDouble(str2);
    assertEquals(d1, d2, 0.15);
}catch (NumberFormatException e) {
    //not a number so cannot compare - perhaps call fail("fail msg here")
}
于 2012-08-29T19:04:39.623 回答
2

您在标签中列出了 junit。

Junit 的 .equals(double, double, accuracy) 允许您指定它们与最后一个参数的接近程度。

我只是读入值并在测试中为每个调用 .equals ...

或者有什么我没有得到的问题吗?

要解析这些行,您的示例使用空格,但您说“CSV”(逗号分隔)。如果它们实际上是 CSV,你可以使用类似的东西:

String[] line = currentLine.split(",")

在每一行。那会给你 line[0]="item1", line[1]="5.12", line[2]="6.12"

之后尝试使用 Double.parseDouble() 解析 line[1] 和 line[2]

顺便说一句,使用 assertEquals,而不是 assertTrue,更具体的 assertEquals 将显示您想要的值以及您在 junit 结果中作为错误的一部分获得的值。

我还建议您传入可选字符串。测试线如下所示:

assertEquals("item "+file1.line[0]+" values do not match",
    Double.parseDouble(file1.line[1]),
    Double.parseDouble(file2.line[1]),
    0.001)

还有一个完整的问题是确保您为每个文件读取同一行 - 让它们正确配对。如果保证它们的顺序相同,那么你很好,但如果不是,你可能想通过 name 字段散列第一个文件:

for(String line: file1.readNextLine()) 
    file1hash.put(line.split(",")[0],line)

然后,当您遍历第二个文件时,您可以轻松地执行以下操作:

for(String line2: file2.readNextLine())  {
    String line1=file1hash.get(line2.split(",")[0])

确保 line1 和 line2 指的是同一行。

于 2012-08-29T19:03:56.683 回答