katalon写一个Groovy脚本,利用java-diff-util库来实现两个文件夹的自动比较,并利用ReportGenerator将比较结果生成HTML。当文件在两个文件夹中都存在,但内容不一致,则将差异数据的行数及内容出力到html中,将具体哪个字段有差异高亮显示出来;当文件只在一个文件夹中存在,将信息输出到html中。要求能识别隔行数据,按文件名生成结果html,html里显示两个文件夹的差异内容
时间: 2024-02-28 18:56:10 浏览: 190
folder-diff:比较两个文件夹的工具
以下是一个可能的实现,其中假设你已经安装了Java-Diff-Utils和ReportGenerator:
```groovy
import difflib.*
import com.kms.katalon.core.reporting.ReportUtil
import com.kms.katalon.core.util.KeywordUtil
import java.nio.file.*
// 比较两个文件夹的内容
def compareFolders(String folder1, String folder2) {
// 获取文件夹中的所有文件
def files1 = new File(folder1).listFiles()
def files2 = new File(folder2).listFiles()
// 遍历所有文件,分别比较
for (def file1 : files1) {
def file2 = new File(folder2, file1.getName())
if (file2.exists()) {
// 如果两个文件都存在,比较它们的内容
def lines1 = Files.readAllLines(file1.toPath())
def lines2 = Files.readAllLines(file2.toPath())
def patch = DiffUtils.diff(lines1, lines2)
if (!patch.getDeltas().isEmpty()) {
// 如果有差异,输出到HTML报告中
def reportFile = generateReport(file1.getName(), patch)
KeywordUtil.markWarning("文件 ${file1.getName()} 与 ${file2.getName()} 不同,详见报告 ${reportFile}")
}
} else {
// 如果只有一个文件存在,输出到HTML报告中
def reportFile = generateReport(file1.getName(), null, lines1)
KeywordUtil.markWarning("文件 ${file1.getName()} 只在 ${folder1} 中存在,详见报告 ${reportFile}")
}
}
// 找出只在第二个文件夹中存在的文件
def onlyInFolder2 = files2.findAll { !new File(folder1, it.getName()).exists() }
for (def file2 : onlyInFolder2) {
// 输出到HTML报告中
def reportFile = generateReport(file2.getName(), null, null, Files.readAllLines(file2.toPath()))
KeywordUtil.markWarning("文件 ${file2.getName()} 只在 ${folder2} 中存在,详见报告 ${reportFile}")
}
}
// 生成HTML报告
def generateReport(String fileName, Patch patch, List<String> originalLines = null, List<String> revisedLines = null) {
def reportFile = ReportUtil.generateReportFileName("diff_${fileName}")
def reportBuilder = new StringBuilder()
// 输出文件名
reportBuilder.append("<h1>文件 ${fileName}</h1>")
if (patch != null) {
// 输出差异内容
reportBuilder.append("<h2>差异行数:${patch.getDeltas().size()}</h2>")
reportBuilder.append("<table>")
reportBuilder.append("<tr><th>原文件</th><th>新文件</th></tr>")
for (def delta : patch.getDeltas()) {
def originalStart = delta.getOriginal().getPosition() + 1
def originalEnd = originalStart + delta.getOriginal().size() - 1
def revisedStart = delta.getRevised().getPosition() + 1
def revisedEnd = revisedStart + delta.getRevised().size() - 1
reportBuilder.append("<tr>")
reportBuilder.append("<td>${originalStart}-${originalEnd}</td>")
reportBuilder.append("<td>${revisedStart}-${revisedEnd}</td>")
reportBuilder.append("</tr>")
reportBuilder.append("<tr>")
reportBuilder.append("<td><pre>${highlight(originalLines.subList(originalStart - 1, originalEnd))}</pre></td>")
reportBuilder.append("<td><pre>${highlight(revisedLines.subList(revisedStart - 1, revisedEnd))}</pre></td>")
reportBuilder.append("</tr>")
}
reportBuilder.append("</table>")
} else {
// 输出只在一个文件夹中存在的文件信息
if (originalLines != null) {
reportBuilder.append("<h2>只在第一个文件夹中存在</h2>")
reportBuilder.append("<pre>${highlight(originalLines)}</pre>")
} else if (revisedLines != null) {
reportBuilder.append("<h2>只在第二个文件夹中存在</h2>")
reportBuilder.append("<pre>${highlight(revisedLines)}</pre>")
}
}
// 生成HTML报告
Files.write(Paths.get(reportFile), reportBuilder.toString().getBytes())
return reportFile
}
// 高亮显示差异内容
def highlight(List<String> lines) {
def result = new StringBuilder()
for (def line : lines) {
if (line.startsWith("+")) {
result.append("<span style=\"background-color:#aaffaa\">${line}</span>")
} else if (line.startsWith("-")) {
result.append("<span style=\"background-color:#ffaaaa\">${line}</span>")
} else {
result.append(line)
}
result.append("\n")
}
return result.toString()
}
// 示例用法
compareFolders("folder1", "folder2")
```
这个脚本假设你有两个文件夹,分别为“folder1”和“folder2”,并且它们都在你的Katalon工程目录下。你可以在脚本的最后一行调用`compareFolders`函数来比较这两个文件夹。比较结果将输出到Katalon的日志中,并生成HTML报告,报告文件名以“diff_”和文件名开头,后缀为“.html”。注意,这个脚本只比较文本文件,不会比较二进制文件。
阅读全文