Katalon写一个Groovy脚本,java8利用java-diff-util实现两个文件夹对比,并将比较结果以文件为单位出力成各自的HTML文件,HTML中要体现差异数据在两个文件中所对应的行数以及内容分别是什么。要求:当文件在两个文件夹中都存在时,能识别隔行数据,将两个文件有差异的数据都出力到HTML中,将两个文件的差异数据以逗号隔开,并将有差异的字段高亮显示出来;当文件只在一个文件夹中存在的文件,将这个信息出力到HTML中
时间: 2024-03-04 15:47:51 浏览: 154
好的,以下是一个实现这个功能的Groovy脚本示例:
```groovy
@Grab(group='com.googlecode.java-diff-utils', module='diffutils', version='1.3.0')
import difflib.*
import java.nio.file.*
import java.nio.charset.*
// 定义要比较的两个文件夹路径
def folder1 = Paths.get("path/to/folder1")
def folder2 = Paths.get("path/to/folder2")
// 获取两个文件夹下的所有文件
def files1 = Files.walk(folder1).filter{Files.isRegularFile(it)}.toList()
def files2 = Files.walk(folder2).filter{Files.isRegularFile(it)}.toList()
// 定义 HTML 文件的模板
def htmlTemplate = """
<html>
<head>
<title>${"DIFF: " + file1.getFileName()}</title>
<style>
.added { background-color: #aaffaa; }
.deleted { background-color: #ffaaaa; }
.changed { background-color: #ffffaa; }
</style>
</head>
<body>
<h1>${"DIFF: " + file1.getFileName()}</h1>
<table>
<tr>
<th>${folder1.toString()}</th>
<th>${folder2.toString()}</th>
</tr>
<%
for (diff in diffs) {
if (diff.operation == Operation.DELETE) {
out << "<tr><td class='deleted'>${diff.text}</td><td></td></tr>"
} else if (diff.operation == Operation.INSERT) {
out << "<tr><td></td><td class='added'>${diff.text}</td></tr>"
} else if (diff.operation == Operation.CHANGE) {
out << "<tr><td class='deleted'>${diff.text1}</td><td class='added'>${diff.text2}</td></tr>"
} else {
out << "<tr><td>${diff.text}</td><td>${diff.text}</td></tr>"
}
}
%>
</table>
</body>
</html>
"""
// 遍历两个文件夹下的所有文件,进行比较,并将结果写入 HTML 文件
(files1 + files2).unique().each { file ->
def relativePath = folder1.relativize(file)
def file1 = folder1.resolve(relativePath)
def file2 = folder2.resolve(relativePath)
def diffs = []
if (Files.exists(file1) && Files.exists(file2)) {
// 两个文件都存在,进行比较
def lines1 = Files.readAllLines(file1, StandardCharsets.UTF_8)
def lines2 = Files.readAllLines(file2, StandardCharsets.UTF_8)
diffs = new DiffRowGenerator.Builder().showInlineDiffs(true).build().generateDiffRows(lines1, lines2)
} else {
// 只有一个文件存在,输出提示信息
diffs = [new DiffRow(Operation.INSERT, "[ERROR] File not found: ${file1.toAbsolutePath()}"), new DiffRow(Operation.DELETE, "[ERROR] File not found: ${file2.toAbsolutePath()}")]
}
// 生成 HTML 文件并写入比较结果
def htmlContent = new StringWriter().with { out ->
new MarkupBuilder(out).with {
mkp.xml()
mkp.template(htmlTemplate).with {
setProperty('file1', file1.getFileName())
setProperty('file2', file2.getFileName())
setProperty('diffs', diffs)
}
}
return out.toString()
}
def htmlFile = new File("path/to/output/${relativePath}.html")
htmlFile.parentFile.mkdirs()
htmlFile.write(htmlContent)
}
```
该脚本会遍历两个文件夹下的所有文件,并对每一对相同路径的文件进行比较。如果两个文件都存在,则使用 `java-diff-utils` 库比较它们的内容,并将比较结果写入一个 HTML 文件;如果只有一个文件存在,则输出一个错误提示信息。HTML 文件的模板定义了表格的结构和样式,并使用 Groovy 的模板语法将比较结果渲染成 HTML 表格的形式。在表格中,删除的行用红色背景标记,添加的行用绿色背景标记,变化的行用黄色背景标记,同时高亮显示发生变化的字段。
阅读全文