katalon写一个Groovy脚本,利用java-diff-util库来实现两个文件夹的自动比较,并将结果以html形式输出。当文件在两个文件夹中都存在,但内容不一致,则将差异数据的行数及内容出力到html中;当文件只在一个文件夹中存在,将信息输出到html中。要求能识别隔行数据,按文件名生成结果html,html里显示两个文件夹的差异内容,哪个字段有差异,就将差异高亮显示
时间: 2024-02-28 18:54:33 浏览: 44
以下是一个示例脚本,可以实现你的要求:
```groovy
import difflib.*
import java.nio.file.*
import java.nio.charset.*
import groovy.xml.*
// 定义比较结果的HTML文件名
def outputFileName = "diff_result.html"
// 定义比较的两个文件夹路径
def folder1Path = "path/to/folder1"
def folder2Path = "path/to/folder2"
// 定义HTML模板
def htmlTemplate = """
<html>
<head>
<style>
.added, .deleted, .changed { background-color: #FFFFCC; }
.added { font-weight: bold; }
.deleted { text-decoration: line-through; }
table { border-collapse: collapse; }
td { border: 1px solid black; padding: 5px; }
</style>
</head>
<body>
%s
</body>
</html>
"""
// 按文件名比较两个文件夹
def compareFolders = { folder1Path, folder2Path ->
// 获取文件列表
def folder1Files = Files.list(Paths.get(folder1Path)).map { it.getFileName().toString() }.toList()
def folder2Files = Files.list(Paths.get(folder2Path)).map { it.getFileName().toString() }.toList()
// 找到所有存在于两个文件夹中的文件
def commonFiles = folder1Files.intersect(folder2Files)
// 找到只存在于一个文件夹中的文件
def onlyInFolder1 = folder1Files.minus(commonFiles)
def onlyInFolder2 = folder2Files.minus(commonFiles)
// 生成HTML表格
def tableRows = ""
// 处理存在于两个文件夹中的文件
commonFiles.each { fileName ->
def path1 = Paths.get(folder1Path, fileName)
def path2 = Paths.get(folder2Path, fileName)
// 比较文件内容
def file1List = Files.readAllLines(path1, StandardCharsets.UTF_8)
def file2List = Files.readAllLines(path2, StandardCharsets.UTF_8)
def patch = DiffUtils.diff(file1List, file2List)
def patchView = UnifiedDiffUtils.generateUnifiedDiff(fileName, fileName, file1List, patch, 3)
// 生成HTML行
if (patch.getDeltas().size() > 0) {
tableRows += """
<tr>
<td>${fileName}</td>
<td colspan="2">文件内容不同</td>
</tr>
"""
patch.getDeltas().each { delta ->
def added = delta.getRevised().getLines().collect { "<tr><td></td><td></td><td class='added'>${it}</td></tr>" }.join()
def deleted = delta.getOriginal().getLines().collect { "<tr><td></td><td class='deleted'>${it}</td><td></td></tr>" }.join()
def unchanged = delta.getOriginal().getLines().collect { "<tr><td>${delta.getOriginal().getPosition() + it + 1}</td><td>${it}</td><td>${delta.getRevised().getLines().get(it)}</td></tr>" }.join()
tableRows += added + deleted + unchanged
}
}
}
// 处理只存在于一个文件夹中的文件
onlyInFolder1.each { fileName ->
tableRows += """
<tr>
<td>${fileName}</td>
<td>只存在于文件夹1</td>
<td></td>
</tr>
"""
}
onlyInFolder2.each { fileName ->
tableRows += """
<tr>
<td>${fileName}</td>
<td></td>
<td>只存在于文件夹2</td>
</tr>
"""
}
// 将HTML模板和表格拼接起来
return String.format(htmlTemplate, """
<table>
<tr>
<th>文件名</th>
<th>文件夹1</th>
<th>文件夹2</th>
</tr>
${tableRows}
</table>
""")
}
// 生成比较结果的HTML文件
def outputFile = Paths.get(outputFileName)
Files.write(outputFile, compareFolders(folder1Path, folder2Path).getBytes(StandardCharsets.UTF_8))
// 输出比较结果的HTML文件路径
println("比较结果已保存到: ${outputFile.toAbsolutePath()}")
```
这个脚本会比较两个文件夹中的所有文件,并将比较结果以HTML形式输出。如果文件在两个文件夹中都存在,但内容不一致,则会将差异数据的行数及内容输出到HTML中;如果文件只在一个文件夹中存在,则会将信息输出到HTML中。同时,它会识别隔行数据,并按文件名生成结果HTML,HTML里显示两个文件夹的差异内容,哪个字段有差异,就将差异高亮显示。
阅读全文