I m 撰写一份《Junnit》测试,测试一些产生Excel文档(即双轨)的代码。 我有另一份Excel文件,其中载有我的预期产出。 将实际档案与预期档案进行比较的最容易的方法是什么?
我可以自己写这部法典,但我很想知道,在值得信赖的第三方图书馆(例如春天或阿帕奇共同点)中是否有一种已有的方法。
I m 撰写一份《Junnit》测试,测试一些产生Excel文档(即双轨)的代码。 我有另一份Excel文件,其中载有我的预期产出。 将实际档案与预期档案进行比较的最容易的方法是什么?
我可以自己写这部法典,但我很想知道,在值得信赖的第三方图书馆(例如春天或阿帕奇共同点)中是否有一种已有的方法。
在此,我最后做些什么(通过DBUnit做重提):
/**
* Compares the data in the two Excel files represented by the given input
* streams, closing them on completion
*
* @param expected can t be <code>null</code>
* @param actual can t be <code>null</code>
* @throws Exception
*/
private void compareExcelFiles(InputStream expected, InputStream actual)
throws Exception
{
try {
Assertion.assertEquals(new XlsDataSet(expected), new XlsDataSet(actual));
}
finally {
IOUtils.closeQuietly(expected);
IOUtils.closeQuietly(actual);
}
}
比较了这两个档案中的数据,没有从任何可能不同的不相干的元数据中产生错误负面的风险。 希望有助于人们。
您可考虑使用我的项目simple-excel。 该公司为哈姆克斯特骑师提供一队工作。
当你做以下事情时:
assertThat(actual, WorkbookMatcher.sameWorkbook(expected));
例如,请见
java.lang.AssertionError:
Expected: entire workbook to be equal
but: cell at "C14" contained <"bananas"> expected <nothing>,
cell at "C15" contained <"1,850,000 EUR"> expected <"1,850,000.00 EUR">,
cell at "D16" contained <nothing> expected <"Tue Sep 04 06:30:00">
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
这样,你就可以从您的自动测试中操作,并在你重新开发的过程中获得有意义的反馈。
简单的档案比较可以很容易地利用一些检查(如MD5)或阅读两种档案。
However, as Excel files contain loads of metadata, the files will probably never be identical byte-for-byte, as James Burgess pointed out. So you ll need another kind of comparison for your test.
我建议从Excel文档中产生一种“扫描”形式,即阅读产生的Excel文档,将其转换为一种更简单的格式(CSV或类似材料),这只会保留你想要检查的信息。 然后,你可以使用“证据形式”,与你的预期结果进行比较(当然也采用坦诚的形式)。
Apache POI可能有助于阅读档案。
BTW:阅读完整档案以检查其正确之处,通常不考虑联检组的测试。 这种融合检验......
我需要做一些类似的事情,已经在我创建Excel档案的项目中使用rel=“noreferer”>ExcelExtractor接口,以出口两份工作手册作为案文的载体,并声称这些图表是平等的。 https://poi.apache.org/apidocs/org/apache/poi/hssf/extractor/ExcelExtractor.html” rel=“noreferer”HSSF for .xls,以及
Dump tostring: ExcelExtractor有一些选择,可以选择哪些选择都应纳入铺设的垃圾场。 我发现,它存在包括姓名在内的有用违约情况。 此外,还包括囚室的内容。XSSFWorkbook xssfWorkbookA = ...;
String workbookA = new XSSFExcelExtractor(xssfWorkbookA).getText();
The easiest way I find is to use Tika. I use it like this:
private void compareXlsx(File expected, File result) throws IOException, TikaException {
Tika tika = new Tika();
String expectedText = tika.parseToString(expected);
String resultText = tika.parseToString(result);
assertEquals(expectedText, resultText);
}
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.13</version>
<scope>test</scope>
</dependency>
你可以使用javaxdelta检查这两个档案是否相同。 可查阅:
请看thesite,比较双亲档案,
猛虎
您可使用Beyond compare 3,从指挥线开始,并支持以不同方式比较 Excel文档,包括:
只测试科特林首页的内容(通常可以转换为java)。
private fun checkEqualityExcelDocs(doc : XSSFWorkbook, doc1 : XSSFWorkbook) : Boolean{
val mapOfCellDoc = doc.toList().first().toList().flatMap { row -> row.map { Pair(PivotExcelCreator.IndexInThePivotTable(it.rowIndex,it.columnIndex),it.stringCellValue) }}.toMap()
val mapOfCellDoc1 = doc1.toList().first().toList().flatMap { row -> row.map { Pair(PivotExcelCreator.IndexInThePivotTable(it.rowIndex,it.columnIndex),it.stringCellValue) }}.toMap()
if(mapOfCellDoc.size == mapOfCellDoc1.size){
return mapOfCellDoc.entries.all { mapOfCellDoc1.containsKey(it.key) && mapOfCellDoc[it.key] == mapOfCellDoc1[it.key]}
}
return false
}
data class IndexInThePivotTable(val row: Int, val col: Int)
以及
assertTrue(checkEqualityExcelDocs(expected, actual), "Docs aren t equal!")
如您能看到<条码>doc.toList(>.first()只读到文件的第一页,如果您需要将每一页的改动代码进行比较的话。
同样,不考虑“空洞的囚室”也是非常好的想法,我不需要这种功能(如果你需要,只是增加这一部分)。
也可以是有用的信息
//first doc I ve got from outputstream such way
val out = ByteArrayOutputStream()
//some method which writes excel to outputstream
val firstDoc = XSSFWorkbook(ByteArrayInputStream(out.toByteArray()))
档案中的第二版
val secondDoc = XSSFWorkbook(Test::class.java.getClassLoader().getResource("yourfile.xlsx").path)
也许......比较每个档案的MD5摘要? 我确信,有许多办法可以做到这一点。 你只能公开档案和逐一比较。
EDIT:James称,XLS格式在元数据上可能有所不同。 也许你应当使用你用来生成xls文档的同一接口,以打开这些文档,并将从电池到电池的数值进行比较?