Katalon写一个Groovy脚本,java-diff-util库实现了两个文件夹的比较,并将比较结果以HTML文件的形式输出,包括差异数据在两个文件中所对应的行数和内容,以及高亮显示有差异的字段,当文件在两个文件夹都存在但存在差异时,将两个文件的差异数据以逗号隔开,并将有差异的字段高亮显示出来。
时间: 2024-03-04 10:47:58 浏览: 138
folder-diff:比较两个文件夹的工具
以下是一个可能的解决方案,需要先安装java-diff-utils库,然后在Katalon中执行Groovy脚本:
```groovy
import difflib.DiffUtils
import difflib.Patch
import groovy.json.JsonOutput
// 定义两个文件夹的路径
def folder1Path = 'path/to/folder1'
def folder2Path = 'path/to/folder2'
// 定义生成的HTML文件路径
def htmlPath = 'path/to/output.html'
// 读取两个文件夹中的所有文件
def folder1Files = new File(folder1Path).listFiles()
def folder2Files = new File(folder2Path).listFiles()
// 对比文件夹中的每一个文件,并将结果保存到diffMap中
def diffMap = [:]
for (File file1 : folder1Files) {
def filename = file1.name
def file2 = new File(folder2Path, filename)
if (file2.exists()) {
def patch = DiffUtils.diff(getLines(file1), getLines(file2))
if (!patch.getDeltas().isEmpty()) {
def delta = patch.getDeltas()[0]
def orig = delta.getOriginal()
def rev = delta.getRevised()
diffMap[filename] = [
'delta': delta.getType().name(),
'original': [
'start': orig.getPosition(),
'lines': orig.getLines()
],
'revised': [
'start': rev.getPosition(),
'lines': rev.getLines()
]
]
}
}
}
// 将结果输出到HTML文件中
def html = generateHtml(diffMap)
new File(htmlPath).write(html)
/**
* 读取文件内容,并返回每一行的列表
*/
def getLines(File file) {
def lines = []
file.eachLine {
lines << it
}
return lines
}
/**
* 生成HTML文件内容
*/
def generateHtml(Map diffMap) {
def html = """
<html>
<head>
<meta charset="UTF-8">
<style>
.diff-ins {
background-color: #cfc;
}
.diff-del {
background-color: #fcc;
}
</style>
</head>
<body>
<table>
<tr><th>Filename</th><th>Delta</th><th>Original</th><th>Revised</th></tr>
"""
diffMap.each { filename, diff ->
def delta = diff['delta']
def origStart = diff['original']['start']
def origLines = diff['original']['lines']
def revStart = diff['revised']['start']
def revLines = diff['revised']['lines']
def origCode = getCode(origLines, origStart)
def revCode = getCode(revLines, revStart)
def diffCode = getDiffCode(origLines, revLines)
html += """
<tr>
<td>$filename</td>
<td>$delta</td>
<td><pre>$origCode</pre></td>
<td><pre>$revCode</pre></td>
</tr>
"""
if (delta == 'CHANGE') {
html += """
<tr>
<td colspan="4"><pre>$diffCode</pre></td>
</tr>
"""
}
}
html += """
</table>
</body>
</html>
"""
return html
}
/**
* 获取文件内容中的指定行数的代码,并高亮显示
*/
def getCode(List lines, int start) {
def code = ''
lines.eachWithIndex { line, index ->
def lineNumber = start + index
code += "<span id=\"line$lineNumber\">$line</span>\n"
}
return code
}
/**
* 获取两个文件内容中的差异代码,并高亮显示
*/
def getDiffCode(List origLines, List revLines) {
def patch = DiffUtils.diff(origLines, revLines)
def code = ''
patch.getDeltas().each { delta ->
def orig = delta.getOriginal()
def rev = delta.getRevised()
if (delta.getType() == Delta.TYPE.CHANGE) {
def origCode = getCode(orig.getLines(), orig.getPosition())
def revCode = getCode(rev.getLines(), rev.getPosition())
code += "<span class=\"diff-del\">$origCode</span><span class=\"diff-ins\">$revCode</span>"
} else if (delta.getType() == Delta.TYPE.DELETE) {
def origCode = getCode(orig.getLines(), orig.getPosition())
code += "<span class=\"diff-del\">$origCode</span>"
} else if (delta.getType() == Delta.TYPE.INSERT) {
def revCode = getCode(rev.getLines(), rev.getPosition())
code += "<span class=\"diff-ins\">$revCode</span>"
}
}
return code
}
```
这个脚本会对比两个文件夹中的所有文件,如果两个文件夹中存在同名文件且内容有差异,则会将差异信息保存到diffMap中,并生成一个HTML文件,其中包含了差异信息和高亮显示的代码。如果两个文件夹中存在同名文件但内容相同,则不会在HTML中显示该文件。
阅读全文