Forum Discussion

678's avatar
678
Regular Contributor
6 years ago

Project Level Teardown Script

I need some syntax update on this  Basically below script is doing All test Cases sucess and fail report  But i required only Failed Cases to be report along with properties  appreciate if any ...
  • groovyguy's avatar
    groovyguy
    6 years ago

    With a minor fix to the script to account for a different value expected on a Pass/Fail, I was able to get the original script working. From there, using what nmrao said, I was able to make a few more changes to only output failures.

     

    /*
    * Below is the TearDown script for SoapUI Project level
    * Which create a custom report in a  given file
    * Modify the variable "reportFileName" below
    *
    **/
    //Modify the file as needed for report file
    //def reportFileName = '/tmp/abctestreport.txt'
    //Adding the below as user wants specific directory
    //Get the project path
    
    def dataFolder =  new com.eviware.soapui.support.GroovyUtils(context).projectPath
    
    //Create today's date for storing response
    def today = new Date().format("yyyy-MM-dd")
    
    def filePrefix = "${dataFolder}/TestReports/xxx_WebAPI_${today}" as String
    
    def fileNamePart = new Date().format("yyyy-MM-dd'T'HH.mm.ss")
    
    //creating filename dynamically.
    def reportFileName = "${filePrefix}/xxx_WebAPI_TestReport_${fileNamePart}.txt" as String
    
    
    //NOTE: Not required to edit beyond this point
    
    /**
    * This class holds the test case details
    **/
    class TestCaseResultHolder {
        def log
        Map<String, String> properties = [:]
        boolean status
    
        def createProperties(testCase) {
            testCase.getPropertyNames().each { key ->
                properties[key] = testCase.getPropertyValue(key)
            }       
        }
    
        def getCaseResult(caseRunner, caseName) {
            log.info "Checking test case status ${caseName}"
            log.info "Checking test case status ${caseRunner.status}"
            if ( caseRunner.status.toString() == 'FAIL' ){
                log.error "Test case $caseName has failed"
                for ( stepResult in caseRunner?.results ){
                    stepResult.messages.each() { msg -> log.info msg }
                }
                return false
            } else {
                log.info "${caseName} is passed"
            }
            true
        }
    
        def buildCaseResult(caseRunner, caseName) {
            status = getCaseResult(caseRunner, caseName)
            if (!status) {
                createProperties(caseRunner.testCase)
            }
        }
    
    }
    
    /**
    * This class holds the test suite details
    **/
    class SuiteResultsHolder {
    
        def log
        Map<String, TestCaseResultHolder> casaeResults = [:]
        int testCaseCount = 0
        int passedCasesCount = 0
        int failedCasesCount = 0
    
        def buildSuiteResults(suiteRunner, suiteName)
        {      
            log.info "Building results of test suite ${suiteName}"
            for ( caseRunner in suiteRunner?.results ) {
                def caseName = caseRunner.testCase.name
                testCaseCount++
                def tcHolder = new TestCaseResultHolder(log: log)
                tcHolder.buildCaseResult(caseRunner, caseName)          
                casaeResults[caseName] = tcHolder
                if (tcHolder.status) {
                    passedCasesCount++
                } else {
                    failedCasesCount++
                }
            }
        }
    
        def getStatus() {
            (0 < failedCasesCount) ? false : true
        }
    
    }
    
    /**
    * This class holds the project details
    **/
    class ProjectResultsHolder {
    
        def log
        Map<String, SuiteResultsHolder> suiteResults = [:]
        int suiteCount = 0
        int passedSuitecount = 0
        int failedSuiteCount = 0
    
        def buildProjectResults(projectRunner, projectName) {
            log.info "Building results of test project ${projectName}"          
            for(suiteRunner in projectRunner?.results) {
                def suiteName =  suiteRunner.testSuite.name
                suiteCount++
                def suiteResultsHolder = new SuiteResultsHolder(log: log)
                suiteResultsHolder.buildSuiteResults(suiteRunner, suiteName)
                suiteResults[suiteName] = suiteResultsHolder
                if (suiteResultsHolder.status) {
                    passedSuitecount++
                } else {
                    failedSuiteCount++
                }
            }
        }
    
        def getStatus() {
            (0 < failedSuiteCount) ? false : true
        }
    
    }
    
    //Get the status string based on boolean
    def getResult(status){ status == true ? 'SUCCEED' : 'FAILED'}
    
    //Draws a line
    def drawLine(def letter = '=', def count = 70) { letter.multiply(count)}
    
    //Gets the summary report
    def getSummaryReport(project, projectResultHolder) {
        def report = new StringBuffer()
        report.append(drawLine()).append('\n')
        report.append("\t\t\tTest Execution Summary\n")
        report.append(drawLine('-', 60)).append('\n')
        report.append("Project : ${project.name}\n")
        report.append("Result : ${getResult(projectResultHolder.status)}\n")
        report.append("Total test suites executed: ${projectResultHolder.suiteCount}\n")
        //report.append("Test suites passed: ${projectResultHolder.passedSuitecount}\n")
        report.append("Test suites failed: ${projectResultHolder.failedSuiteCount}\n")
        report.append(drawLine()).append('\n')
        report
    }
    
    //Gets the test case report
    def getTestCaseReport(testCaseReport) {
        def report = new StringBuffer()
        report.append(drawLine('-', 60)).append('\n')
        report.append("\t\tTest Case Details:\n")
        report.append(drawLine('-', 60)).append('\n')
        testCaseReport.each { kase, tcReport ->
            if (!tcReport.status) {
            	  report.append("Name : ${kase}\n")
            	  report.append("Status : ${getResult(tcReport.status)}\n")
                // report.append("Properties : ${tcReport.properties.toString()}\n")
            }
        }
        report
    }
    
    //Get the detailed report
    def getDetailedReport(projectResultHolder) {
        def report = new StringBuffer()
        report.append(drawLine()).append('\n')
        report.append("\t\t\tTest Execution Detailed Report\n")
        report.append(drawLine()).append('\n')
        projectResultHolder.suiteResults.each { suite, details ->
            report.append("Test Suite : ${suite}\n")
            report.append("Result : ${getResult(details.status)}\n")
            report.append("Total Cases : ${details.testCaseCount}\n")
            //report.append("Cases Passed : ${details.passedCasesCount}\n")
            report.append("Cases Failed: ${details.failedCasesCount}\n")
            report.append(getTestCaseReport(details.casaeResults))
            report.append(drawLine()).append('\n')
            report.append(drawLine()).append('\n')
        }
        report
    }
    
    //Save the contents to a file
    def saveToFile(file, content) {
        if (!file.parentFile.exists()) {
            file.parentFile.mkdirs()
            log.info "Directory did not exist, created"
        }
        file.write(content) 
        assert file.exists(), "${file.name} not created"
    }
    
    def holder = new ProjectResultsHolder(log: log)
    holder.buildProjectResults(runner, project.name)
    
    def finalReport = new StringBuffer()
    finalReport.append(getSummaryReport(project, holder))
    finalReport.append(getDetailedReport(holder))
    
    def reportFile = new File(reportFileName)
    saveToFile(reportFile, finalReport.toString())