Katalon写一个Groovy脚本,java8利用java-diff-util实现两个文件夹对比,并将比较结果以各文件名出力为HTML文件。要求:当文件在两个文件夹中都存在时,能识别隔行数据,将两个文件有差异的数据都出力到HTML中,解析两个文件的差异数据并将有差异的字段高亮显示出来;当文件只在一个文件夹中存在的文件,将结果出力到HTML中
时间: 2024-03-02 17:48:56 浏览: 18
以下是使用Katalon和java-diff-utils实现对比两个文件夹并输出HTML文件的Groovy脚本:
```groovy
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Paths
import java.util.List
import difflib.ChangeDelta
import difflib.DeleteDelta
import difflib.DiffUtils
import difflib.InsertDelta
import difflib.Patch
import com.kms.katalon.core.configuration.RunConfiguration
import com.kms.katalon.core.testdata.TestDataFactory
import com.kms.katalon.core.testdata.TestDataInfo
import com.kms.katalon.core.testdata.reader.ExcelFactory
import com.kms.katalon.core.testdata.reader.TestDataReader
import com.kms.katalon.core.util.KeywordUtil
// 定义输出HTML文件名
def htmlFileName = "diff.html"
// 定义要比较的两个文件夹路径
def folder1Path = "path/to/folder1"
def folder2Path = "path/to/folder2"
// 获取文件夹中所有文件的路径
def folder1Files = new File(folder1Path).listFiles()
def folder2Files = new File(folder2Path).listFiles()
// 定义HTML文件内容
def htmlContent = "<html><head><title>文件夹对比结果</title><style>pre {font-family: 'Courier New', Courier, monospace; font-size: 14px;}</style></head><body>"
// 定义变量用于存储比较结果
def result = ""
// 比较两个文件夹中的文件
for (def file1 : folder1Files) {
def file2 = new File(folder2Path, file1.getName())
if (file2.exists()) {
// 如果两个文件夹中都存在同名文件,则比较两个文件的内容
def diff = compareFiles(file1.getAbsolutePath(), file2.getAbsolutePath())
if (diff != null) {
// 如果两个文件有差异,则输出差异内容
result += "<h2>${file1.getName()}和${file2.getName()}的差异:</h2>"
result += diff
}
} else {
// 如果只在一个文件夹中存在该文件,则将该文件的内容输出
result += "<h2>${file1.getName()}只存在于${folder1Path}中:</h2>"
result += readFileToString(file1.getAbsolutePath())
}
}
for (def file2 : folder2Files) {
def file1 = new File(folder1Path, file2.getName())
if (!file1.exists()) {
// 如果只在一个文件夹中存在该文件,则将该文件的内容输出
result += "<h2>${file2.getName()}只存在于${folder2Path}中:</h2>"
result += readFileToString(file2.getAbsolutePath())
}
}
// 将比较结果添加到HTML文件内容中
htmlContent += result
// 输出HTML文件
KeywordUtil.markup(htmlContent)
writeStringToFile(htmlFileName, htmlContent)
/**
* 比较两个文件的内容,并返回差异部分的HTML格式字符串
* @param file1Path 第一个文件的路径
* @param file2Path 第二个文件的路径
* @return 两个文件的差异部分的HTML格式字符串,如果两个文件内容相同,返回null
*/
def compareFiles(String file1Path, String file2Path) {
def file1Content = readFileToString(file1Path)
def file2Content = readFileToString(file2Path)
if (file1Content.equals(file2Content)) {
return null // 两个文件内容相同,返回null
}
// 使用java-diff-utils比较两个文件的内容
def patch = DiffUtils.diff(linesToList(file1Content), linesToList(file2Content))
// 解析差异数据,并将有差异的字段用HTML标签高亮显示出来
def result = ""
for (def delta : patch.getDeltas()) {
if (delta instanceof ChangeDelta) {
// 隔行数据
def origLines = delta.getOriginal().getLines()
def revLines = delta.getRevised().getLines()
def changeText = ""
for (def j = 0; j < origLines.size(); j++) {
if (j % 2 == 0) {
changeText += "<span style='background-color: #FFB6C1;'>${origLines.get(j)}</span>\n"
} else {
changeText += "<span style='background-color: #ADD8E6;'>${revLines.get(j)}</span>\n"
}
}
result += "<h3>隔行数据:</h3><pre>${changeText}</pre>"
} else if (delta instanceof DeleteDelta) {
// 删除的数据
def origLines = delta.getOriginal().getLines()
def deleteText = ""
for (def line : origLines) {
deleteText += "<span style='background-color: #FFB6C1;'>${line}</span>\n"
}
result += "<h3>删除的数据:</h3><pre>${deleteText}</pre>"
} else if (delta instanceof InsertDelta) {
// 新增的数据
def revLines = delta.getRevised().getLines()
def insertText = ""
for (def line : revLines) {
insertText += "<span style='background-color: #ADD8E6;'>${line}</span>\n"
}
result += "<h3>新增的数据:</h3><pre>${insertText}</pre>"
}
}
return result
}
/**
* 将文件的内容读取为字符串
* @param filePath 文件的路径
* @return 文件的内容字符串
*/
def readFileToString(String filePath) {
return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8)
}
/**
* 将字符串按行分割成列表
* @param str 字符串
* @return 行列表
*/
def linesToList(String str) {
return str.split("\n")
}
/**
* 将字符串写入文件
* @param filePath 文件的路径
* @param content 要写入的内容
*/
def writeStringToFile(String filePath, String content) {
def outputFolder = RunConfiguration.getProjectDir().getAbsolutePath() + "/Reports"
def file = new File(outputFolder, filePath)
file.getParentFile().mkdirs()
file.delete()
file.createNewFile()
Files.write(file.toPath(), content.getBytes(StandardCharsets.UTF_8))
}
```
注意:以上脚本仅供参考,需要根据实际需求进行修改。此外,需要在Katalon Studio中安装java-diff-utils库,具体操作可参考官方文档。