2012-08-29 48 views
0

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

CSV格式:

 
first.csv 
Name price-1 price-2 
item1 5.12  6.12 
item2 4.23  5.56 
item3 11.2  12.23 

second.csv 

Name price-1  price-2 
item1 5.12  6.10 
item2 4.20  5.50 
item3 11.19  12.19 

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

有什么可以很好的解决它吗?

+1

看到这个问题:http://stackoverflow.com/questions/5686755/junit-assertequals-for-double-values –

+0

这是你的功课? – Ridcully

回答

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解析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) 

还有确保您正在阅读每个文件的同一行的整个问题 - 让他们配对的权利。如果他们保证在你的罚款顺序相同,但如果没有你可能想凑起来的名称字段中的第一个文件:

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引用同一行。

+0

当我读取csv文件时,它会给出字符串数组。我必须同时检查column1(name)和double准确性(对于其他两列)的字符串等同性。是否必须显式检查它是否可解析为double或不。在我的实际文件中,有240列,其中一些是双打和其他字符串。 – arpitMandliya

3

当你使用assertEquals和double时,你可以通过一个阈值。这就是所谓的三角洲在说话。

或者你可以使用

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,人数封堵让您了解重载方法

当你从你可能阅读的字符串的文件读取在断言。为了让他们在双然后做

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") 
} 
+0

减去两个值时不应该取绝对值吗? – Danny

+0

@Danny哈哈:) - 您在编辑帖子时添加了评论。正确我已经更新它使用Math.abs – RNJ

+0

@RNJ当我读取csv文件时,它会给出字符串数组。我必须明确检查它是否可以解析为double或double。在我的实际文件中,有240列,一些他们是双打和其他strings.Thank你的JUnit信息。 – arpitMandliya