我需要比较 2 个 csv 文件并使用 java 将结果输出到 Fitnesse 中的新文件。由于我是 Fitnesse 的新手,请对此有所了解。我对要使用什么固定装置感到困惑。
2 回答
好吧,有两种方法可以解决这个问题。一个非常充分地利用 FitNesse,另一个只是完成了工作。
选项 1:充分利用 FitNesse
假设两个 CSV 文件之一是固定的并且始终相同,您可以创建一个可以读取文件的夹具,然后将结果与 FitNesse 测试中的表格进行比较。这可能看起来像这样:
|Query:list csv data|c:\test\file_to_check.csv|
|col1 |col2 |col3 |
|Joe |12 |red |
|Steve |15 |purple |
当测试运行时,它会读入文件并将其拆分为行和列,使用标题行将值与列连接起来。然后它返回标准的 Slim(我假设它目前正在使用 Slim)行列表,这些行本身是名称、值对作为字符串的列表。如果匹配,您将看到全部为绿色。如果它们不匹配,那么您将收到指示不匹配的失败。这样的固定装置还可以识别缺失的行或额外的行,您会在页面中看到它们。
选项2:完成它
第二种选择不会像 FitNesse 那样友好,但可以工作。此版本会将所有验证推送到夹具中。在这种情况下,您将编写一个可以将两个文件名作为输入的夹具,然后在夹具代码中进行比较。然后它将返回一些失败的指示。它可能看起来像这样(但还有其他设计也可以工作:
|compare csv files|
|file1 |file2 |match?|
|c:\test_file_1.csv|c:\test_file_1.csv|true |
这将适用于以下代码(您仍然必须完成比较 CSV 文件的困难部分):
public class CompareCsvFiles {
private String filenameForFirstFile = null;
private String filenameForSecondFile = null;
private String matched = null;
public void setFile1(String filename){
filenameForFirstFile = filename;
}
public void setFile2(String filename){
filenameForSecondFile = filename;
}
public String match(){
return new CsvCompareTool(filenameForFirstFile, filenameForSecondFile).match();
}
private class CsvCompareTool{
private String filename1 = null;
private String filename2 = null;
public CsvCompareTool(String file1, String file2){
filename1 = file1;
filename2 = file2;
}
public String match(){
// create the necessary code to do the comparison here.
// I'll leave that to you.
return "Not implemented yet";
}
}
}
如果出现故障,我将返回一个字符串来描述发生故障的行。
有关解析 CSV 文件的更多信息,请参阅有关 Java CSV 解析器的问题。
最后的评论
就个人而言,我更喜欢选项 1。它利用 FitNesse 进行最终验证,并向您显示页面中的特定故障。但这确实需要一个文件是一致的预期结果。
在任何一种情况下,我都会尝试找到一个使 CSV 文件处理更容易的库,因为有一些有趣的规则关于如何将事物转义为嵌入逗号。
您也许还可以使用 TableTable 样式表构建一些东西来执行此操作,但我不推荐这样做。
如果您使用的是 FitLibrary,您应该能够执行与任一示例相同的操作,但编码会有所不同。
FitLibrary 的 CompareFiles 夹具怎么样?