我想将 Geb 屏幕截图和 html 快照工件嵌入到创建的 spock-report 中,但在 geb-spock-reports 之外似乎没有一个好的解决方案,现已弃用。
如问题中所述,解决方案是使用此代码片段,使用带有 reportInfo 的清理功能以及将工件嵌入到报告中的方法。
void cleanup() {
def gebArtifactsPath = "build/reports/geb/path/to/specs/here/"
File[] files = new File("$gebArtifactsPath$specificationContext.currentSpec.name").listFiles()
insertReportArtifacts(files)
insertFailureArtifacts(files)
}
/**
* Finds all report artifacts taken. Moves them into the spock-report directory.
* Then creates the html to insert into the reportInfo() which embeds them into the report
*
* @param files - geb artifacts from specs
*/
def insertReportArtifacts(File[] files) {
List<File> screenshots = files.findAll { !it.name.contains("failure.png") && it.name.contains(".png") }
List<File> htmlSnapshots = files.findAll { !it.name.contains("failure.html") && it.name.contains(".html") }
boolean reportFound = screenshots != null || htmlSnapshots != null
if (reportFound) {
def reportDir = new File('build/spock-reports')
if (!reportDir.exists()) reportDir.mkdirs()
htmlSnapshots.each { it.renameTo("$reportDir/$it.name") }
screenshots.each { it.renameTo("$reportDir/$it.name") }
def reportArtifactHtml = ""
def screenshotIndex = 0
htmlSnapshots.each { html ->
def screenshot = screenshots[screenshotIndex]
reportArtifactHtml += """
<table style="border:1px solid black;">
<thead>
<tr>
<th>[Html Report] ${html.name.replace('.html', '')}</th>
</tr>
</thead>
<tr>
<td><a href="${html.name}" target="_blank">html report</a></td>
</tr>
<thead>
<tr>
<th>[Image Report] ${screenshot.name.replace('.png', '')}</th>
</tr>
<tr>
<td><a href="${screenshot.name}" target="_blank"><img src="${screenshot.name}" width="400" height="400" align="center"></a></td>
</tr>
</thead>
</table>
"""
screenshotIndex++
}
reportInfo(reportArtifactHtml)
}
}
/**
* Finds failure artifacts taken. Moves them into the spock-report directory.
* Then creates the html to insert into the reportInfo() which embeds them into the report
*
* @param files - geb artifacts from specs
*/
def insertFailureArtifacts(File[] files) {
File screenshot = files.find { it.name.contains("failure.png") }
File htmlSnapshot = files.find { it.name.contains("failure.html") }
boolean failureFound = screenshot != null || htmlSnapshot != null
if (failureFound) {
def reportDir = new File('build/spock-reports')
if (!reportDir.exists()) reportDir.mkdirs()
htmlSnapshot.renameTo("$reportDir/$htmlSnapshot.name")
screenshot.renameTo("$reportDir/$screenshot.name")
def failureArtifactHtml = """
<table style="border:1px solid black;">
<thead>
<tr>
<th>[Html Fail]</th>
</tr>
</thead>
<tr>
<td><a href="$htmlSnapshot.name" target="_blank">html failure</a></td>
</tr>
<thead>
<tr>
<th>[Image Fail]</th>
</tr>
<tr>
<td><a href="$screenshot.name" target="_blank"><img src="$screenshot.name" width="400" height="400" align="center"></a></td>
</tr>
</thead>
</table>"""
reportInfo(failureArtifactHtml)
}
}