katalon写一个Groovy脚本,利用java-diff-util库来实现两个文件夹的自动比较,并利用ReportGenerator将比较结果生成HTML。当文件在两个文件夹中都存在,但内容不一致,则将差异数据的行数及内容出力到html中,将具体哪个字段有差异高亮显示出来;当文件只在一个文件夹中存在,将信息输出到html中。要求能识别隔行数据,按文件名生成结果html,html里显示两个文件夹的差异内容
时间: 2024-02-28 16:55:57 浏览: 154
好的,以下是一个示例的Groovy脚本,实现了你的要求。请注意,需要在Katalon Studio中安装并引入java-diff-utils和ReportGenerator库。
```
import difflib.*
import com.kms.katalon.core.reporting.ReportUtil
import com.kms.katalon.core.util.KeywordUtil
// 定义对比文件夹的路径
def folder1 = new File("path/to/folder1")
def folder2 = new File("path/to/folder2")
// 定义ReportGenerator生成HTML报告的路径
def reportPath = "path/to/report.html"
// 定义保存比较结果的列表
def diffList = []
// 定义一个函数,用于比较两个文件并保存比较结果到diffList中
def compareFiles(file1, file2) {
def lines1 = file1.readLines()
def lines2 = file2.readLines()
def patch = DiffUtils.diff(lines1, lines2)
if (!patch.getDeltas().isEmpty()) {
def diffLines = []
patch.getDeltas().each { delta ->
def lines = delta.getRevised().getLines()
def lineNum = delta.getRevised().getPosition() + 1
lines.each { line ->
diffLines << [lineNum, line]
lineNum++
}
}
diffList.add([file1.getName(), file2.getName(), diffLines])
}
}
// 遍历文件夹1中的所有文件,并与文件夹2中同名文件比较
folder1.eachFile { file1 ->
def file2 = new File(folder2, file1.getName())
if (file2.exists()) {
compareFiles(file1, file2)
} else {
diffList.add([file1.getName(), "", "Only in folder1"])
}
}
// 遍历文件夹2中的所有文件,并查找文件夹1中不存在的文件
folder2.eachFile { file2 ->
def file1 = new File(folder1, file2.getName())
if (!file1.exists()) {
diffList.add(["", file2.getName(), "Only in folder2"])
}
}
// 生成HTML报告
def reportBuilder = new StringBuilder()
reportBuilder.append("<html><body>")
diffList.each { diff ->
reportBuilder.append("<h2>File: ${diff[0]} / ${diff[1]}</h2>")
if (diff[2].startsWith("Only")) {
reportBuilder.append("<p>${diff[2]}</p>")
} else {
reportBuilder.append("<table><tr><th>Line Number</th><th>Content</th></tr>")
diff[2].each { line ->
def lineNum = line[0]
def content = line[1]
if (content.contains(',')) {
content = content.tokenize(',')
reportBuilder.append("<tr><td>${lineNum}</td>")
content.each { field ->
if (field.contains(':')) {
def fieldName = field.tokenize(':')[0]
def fieldValue = field.tokenize(':')[1]
reportBuilder.append("<td>${fieldName}: <span style=\"background-color: yellow;\">${fieldValue}</span></td>")
} else {
reportBuilder.append("<td><span style=\"background-color: yellow;\">${field}</span></td>")
}
}
reportBuilder.append("</tr>")
} else {
reportBuilder.append("<tr><td>${lineNum}</td><td><span style=\"background-color: yellow;\">${content}</span></td></tr>")
}
}
reportBuilder.append("</table>")
}
}
reportBuilder.append("</body></html>")
ReportUtil.generateReport(reportBuilder.toString(), reportPath)
// 打印日志,告知报告生成的路径
KeywordUtil.logInfo("HTML report generated at: ${reportPath}")
```
在以上脚本中,我们首先定义了要比较的两个文件夹的路径,以及生成报告的路径。然后,我们定义了一个函数`compareFiles`,用于比较两个文件。该函数使用了java-diff-utils库中的`DiffUtils.diff()`函数来比较文件内容,并将差异数据保存到一个列表中。最后,我们遍历文件夹中的所有文件,调用`compareFiles`函数比较同名文件,并将比较结果保存到`diffList`列表中。如果一个文件只在一个文件夹中存在,则直接将信息输出到`diffList`中。最后,我们使用ReportGenerator库来生成HTML报告,并将报告保存到指定路径中。
在HTML报告中,我们将差异数据高亮显示出来,具体实现方法是:首先将差异数据按逗号分隔,并保存到一个列表中。然后,我们遍历列表中的每个字段,如果字段包含冒号,则表明这是一个键值对,需要将键和值分开,并将值高亮显示。如果字段不包含冒号,则直接将整个字段高亮显示。最后,我们将所有差异数据以表格的形式展示出来。
阅读全文