katalon写一个Groovy脚本,利用java-diff-util库来实现两个文件夹的自动比较。当文件在两个文件夹中都存在,但内容不一致,则将差异数据的行数及内容出力到html中,将具体哪个字段有差异高亮显示出来;当文件只在一个文件夹中存在,将信息输出到html中。要求能识别隔行数据,按文件名生成结果html,html里显示两个文件夹的差异内容
时间: 2024-02-28 12:54:56 浏览: 115
首先,需要在Katalon Studio中添加java-diff-utils库的依赖。在项目的Build Path中,选择“Add External JARs”并选择下载好的java-diff-utils的jar文件。
接下来,在Katalon Studio中创建一个新的Groovy脚本,并且添加以下代码:
```
import difflib.*
import java.nio.file.Files
import java.nio.file.Paths
import com.kms.katalon.core.configuration.RunConfiguration
import com.kms.katalon.core.testdata.TestDataFactory
import com.kms.katalon.core.testdata.TestData
import com.kms.katalon.core.testdata.reader.CsvReader
import com.kms.katalon.core.util.KeywordUtil
// 定义两个文件夹的路径
def folder1 = "path/to/folder1"
def folder2 = "path/to/folder2"
// 定义结果html文件的路径
def resultFilePath = "path/to/result.html"
// 获取所有文件名
def fileNames1 = new File(folder1).list()
def fileNames2 = new File(folder2).list()
// 创建结果html文件
def resultFile = new File(resultFilePath)
if (!resultFile.exists()) {
resultFile.createNewFile()
}
// 创建结果html文件的输出流
def resultFileStream = new FileOutputStream(resultFile)
// 写入html头部
def htmlHead = """
<!DOCTYPE html>
<html>
<head>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
</head>
<body>
<h2>Folder Comparison Result</h2>
<table>
<tr>
<th>File Name</th>
<th>Diff Type</th>
<th>Diff Content</th>
</tr>
"""
resultFileStream.write(htmlHead.getBytes())
// 获取所有文件的差异比较结果
for (fileName in fileNames1) {
if (fileNames2.contains(fileName)) {
// 文件在两个文件夹中都存在,比较文件内容
def file1 = new File("${folder1}/${fileName}")
def file2 = new File("${folder2}/${fileName}")
def content1 = Files.readAllLines(Paths.get(file1.toURI()))
def content2 = Files.readAllLines(Paths.get(file2.toURI()))
// 使用java-diff-utils库进行比较
def patch = DiffUtils.diff(content1, content2)
if (patch.getDeltas().size() > 0) {
// 写入差异比较结果到html文件
def diffMessage = ""
for (delta in patch.getDeltas()) {
def position = delta.getOriginal().getPosition()
def lines = delta.getOriginal().getLines()
if (delta.getType() == Delta.TYPE.CHANGE) {
// 写入修改的行内容
diffMessage += "Changed Lines: ${position + 1} - ${position + lines.size()}\n"
for (line in lines) {
def lineIndex = content1.indexOf(line)
if (lineIndex >= 0) {
diffMessage += "<p style='background-color: yellow;'>${line}</p>\n"
} else {
diffMessage += "<p style='background-color: red;'>${line}</p>\n"
}
}
} else if (delta.getType() == Delta.TYPE.DELETE) {
// 写入删除的行内容
diffMessage += "Deleted Lines: ${position + 1} - ${position + lines.size()}\n"
for (line in lines) {
diffMessage += "<p style='background-color: red;'>${line}</p>\n"
}
} else {
// 写入新增的行内容
diffMessage += "Added Lines: ${position + 1} - ${position + lines.size()}\n"
for (line in lines) {
diffMessage += "<p style='background-color: green;'>${line}</p>\n"
}
}
}
def htmlRow = """
<tr>
<td>${fileName}</td>
<td>Content Diff</td>
<td>${diffMessage}</td>
</tr>
"""
resultFileStream.write(htmlRow.getBytes())
}
} else {
// 文件只在一个文件夹中存在,输出信息到html文件
def htmlRow = """
<tr>
<td>${fileName}</td>
<td>Folder Diff</td>
<td>${folder1} or ${folder2}</td>
</tr>
"""
resultFileStream.write(htmlRow.getBytes())
}
}
// 写入html尾部
def htmlFoot = """
</table>
</body>
</html>
"""
resultFileStream.write(htmlFoot.getBytes())
// 关闭结果html文件的输出流
resultFileStream.close()
// 打印结果文件路径
KeywordUtil.logInfo("Comparison Result: ${resultFilePath}")
```
代码解释:
- 第1行:导入java-diff-utils库和其他需要用到的Katalon库。
- 第4-5行:定义需要比较的两个文件夹的路径和结果html文件的路径。
- 第8-9行:获取两个文件夹中的所有文件名。
- 第12-13行:创建结果html文件。
- 第16-18行:写入结果html文件的头部。
- 第21-50行:对每个文件进行比较,如果文件在两个文件夹中都存在,则比较文件内容并将差异比较结果输出到结果html文件中;如果文件只在一个文件夹中存在,则将信息输出到结果html文件中。
- 第53-55行:写入结果html文件的尾部。
- 第58行:关闭结果html文件的输出流。
- 第61行:输出结果html文件的路径。
代码注意事项:
- 需要替换第4-5行的文件夹路径和第6行的结果html文件路径。
- 结果html文件会被覆盖,所以请确保路径正确并没有重要文件。
- 如果要比较的文件较大,可能会导致程序运行的时间较长。
代码执行结果:
- 在Katalon Studio的Console中会输出结果html文件的路径。
- 打开结果html文件,可以看到两个文件夹中所有文件的差异比较结果。
阅读全文