How can I embed Geb screenshots and HTML snapshot artifacts into renatoathaydes/spock-reports?

102 Views Asked by At

Is there a good way to embed Geb screenshots and HTML snapshot artifacts into the created spock-report? There does not seem to be an good solution to this outside of geb-spock-reports, which is now deprecated.

1

There are 1 best solutions below

0
On BEST ANSWER

For my solution I went ahead and made this code snippet shown below to do it in the cleanup step and using reportInfo(). This works well for me because I have a SpecBase class that gets inherited and used in all of the specs.

You can paste the methods and the code and add in your own paths and it should work. I'm aware this isn't the most elegant solution and can be improved or possibly added as a configuration option into this project, but for now here is a solution for those wanting the reports and failures to be embedded.

It basically finds the geb artifacts and moves them into the spock-reports directory to used the created html string which is inserted with reportInfo() for embedding.

I'm open to any suggestions to get this as a PR or to improve it. I haven't setup a test project to showcase this so unfortunately I don't have an example image to give just yet!


    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)
        }
    }