Katalon写一个Groovy脚本,java8利用java-diff-util实现两个文件夹对比,并将比较结果以文件为单位出力成各自的HTML文件。要求:当文件在两个文件夹中都存在时,能识别隔行数据,将两个文件有差异的数据都出力到HTML中,解析两个文件的差异数据并将有差异的字段高亮显示出来;当文件只在一个文件夹中存在的文件,将结果出力到HTML中
时间: 2024-03-02 12:49:59 浏览: 121
好的,根据您的要求,我来为您提供一个Groovy脚本,利用java-diff-util实现两个文件夹对比,并将比较结果以文件为单位输出成各自的HTML文件。
首先,您需要在Katalon中安装java-diff-utils库,可以在Katalon的Project Settings中的External Libraries中添加该库。
然后,您可以使用以下脚本:
```groovy
import difflib.*
import java.nio.file.*
import java.nio.charset.*
import java.util.stream.Collectors
// 设置要比较的两个文件夹路径
def folder1 = Paths.get("path/to/folder1")
def folder2 = Paths.get("path/to/folder2")
// 获取两个文件夹中的所有文件
def files1 = Files.walk(folder1).filter({Files.isRegularFile(it)}).collect(Collectors.toList())
def files2 = Files.walk(folder2).filter({Files.isRegularFile(it)}).collect(Collectors.toList())
// 获取两个文件夹中的所有文件名
def fileNames1 = files1.stream().map({folder1.relativize(it).toString()}).collect(Collectors.toList())
def fileNames2 = files2.stream().map({folder2.relativize(it).toString()}).collect(Collectors.toList())
// 获取只在一个文件夹中存在的文件名
def uniqueFileNames = (fileNames1 - fileNames2) + (fileNames2 - fileNames1)
// 对于两个文件夹中都存在的文件,进行比较并输出差异到HTML中
(fileNames1.intersect(fileNames2)).each({ fileName ->
def file1 = folder1.resolve(fileName)
def file2 = folder2.resolve(fileName)
def diff = generateDiff(file1, file2)
writeDiffToHtml(fileName, diff)
})
// 对于只在一个文件夹中存在的文件,直接输出到HTML中
uniqueFileNames.each({ fileName ->
def file = (fileNames1.contains(fileName)) ? folder1.resolve(fileName) : folder2.resolve(fileName)
def content = Files.readString(file, StandardCharsets.UTF_8)
writeContentToHtml(fileName, content)
})
/**
* 生成两个文件的差异
*/
def generateDiff(Path file1, Path file2) {
def lines1 = Files.readAllLines(file1, StandardCharsets.UTF_8)
def lines2 = Files.readAllLines(file2, StandardCharsets.UTF_8)
def patch = DiffUtils.diff(lines1, lines2)
def diff = patch.getDeltas().collect({
def original = it.getOriginal().getLines().stream().collect(Collectors.joining("\n"))
def revised = it.getRevised().getLines().stream().collect(Collectors.joining("\n"))
def diff = generateDiff(original, revised)
def location = "Lines ${it.getOriginal().getPosition() + 1}-${it.getOriginal().last() + 1} in ${file1} and ${it.getRevised().getPosition() + 1}-${it.getRevised().last() + 1} in ${file2}"
[location: location, diff: diff]
})
return diff
}
/**
* 生成两个字符串的差异
*/
def generateDiff(String str1, String str2) {
def patch = DiffUtils.diff(str1.tokenize(/\r?\n/), str2.tokenize(/\r?\n/))
def diff = patch.getDeltas().collect({
def original = it.getOriginal().getLines().stream().collect(Collectors.joining("\n"))
def revised = it.getRevised().getLines().stream().collect(Collectors.joining("\n"))
def diff = generateInlineDiff(original, revised)
def location = "Lines ${it.getOriginal().getPosition() + 1}-${it.getOriginal().last() + 1} and ${it.getRevised().getPosition() + 1}-${it.getRevised().last() + 1}"
[location: location, diff: diff]
})
return diff
}
/**
* 生成两个字符串的行内差异
*/
def generateInlineDiff(String str1, String str2) {
def inlineDiff = new InlineDiff("", "")
inlineDiff.setOldText(str1)
inlineDiff.setNewText(str2)
inlineDiff.build()
return inlineDiff.getInsDelDiffHtml()
}
/**
* 将文件差异输出到HTML中
*/
def writeDiffToHtml(String fileName, List<Map<String, String>> diff) {
def content = diff.collect({
"""
<p><b>${it.location}</b></p>
${it.diff}
"""
}).join("")
writeContentToHtml(fileName, content)
}
/**
* 将文件内容输出到HTML中
*/
def writeContentToHtml(String fileName, String content) {
def html = """
<html>
<head>
<meta charset="UTF-8">
<title>${fileName}</title>
<style>
.diff-ins { background-color: #aaffaa; }
.diff-del { background-color: #ffaaaa; }
</style>
</head>
<body>
<pre>${content}</pre>
</body>
</html>
"""
def file = new File("path/to/output/folder/${fileName}.html")
file.getParentFile().mkdirs()
file.write(html)
}
```
该脚本会将两个文件夹中的文件逐个比较,对于在两个文件夹中都存在的文件,输出差异到HTML中;对于只在一个文件夹中存在的文件,直接输出到HTML中。输出的HTML文件会以文件名为文件名,并放在指定的输出文件夹中。
在输出的HTML文件中,差异部分会被高亮显示,被删除的部分会显示为红色,被添加的部分会显示为绿色。
希望这个脚本能够满足您的需求!
阅读全文