software resultados proyectos proyecto modelo informe evaluacion ejemplo educativo cierre groovy soapui

groovy - resultados - Creación de un informe de prueba desde el script de eliminación de nivel de proyecto



informe final de un proyecto social (1)

He generado un informe basado en una ejecución de un banco de pruebas donde crea un directorio de carpetas e inserta un archivo que muestra el informe. Esto se compila dentro de un TearDown Script en el nivel de Suite de prueba . A continuación está el código:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) def dataFolder = groovyUtils.projectPath def failedTestCases = 0 def succeedTestCases = 0 def totalTestCases = 0 def testCaseFailed = "" def testCaseSucceed = "" def date = new Date() def folderTime = date.format("yyyy-MM-dd HH-mm-ss") def hotelId = context.getProperty(''hotelid'') def hotelname = context.getProperty(''hotelname'') def hoteltype = context.getProperty(''hoteltype'') //def propertyValues = "" //def correlationid = messageExchange.modelItem.testStep.testCase.testSuite.Project.namegetPropertyValue("correlationid") //Create a folder directory for the responses RootResultFolder = dataFolder + "//Test Reports" + "//xxx_WebAPI - " + folderTime + "//" CreateResultFolder = new File(RootResultFolder) CreateResultFolder.mkdir() //context.setProperty("RootResultFolder", RootResultFolder) def fileName = "WebAPI Test Report.txt" def rootFolder = RootResultFolder + fileName def logFile = new File(rootFolder) if(logFile.exists()) { log.info("Error a file named " + fileName + "already exisits") } else { runner.results.each { testCaseResult -> def name = testCaseResult.testCase.name totalTestCases++ if(testCaseResult.status.toString() == ''FAILED''){ failedTestCases ++ testCaseFailed += "- $name - HAS FAILED /n/n" //propertyValues += "hotelid - $hotelid, hotelname - $hotelname, hoteltype - $hoteltype /n/n" testCaseResult.results.each{ testStepResults -> testStepResults.messages.each() { msg -> log.info msg } } }else{ succeedTestCases ++ testCaseSucceed += "- $name - SUCCEED /n/n" testCaseResult.results.each{ testStepResults -> testStepResults.messages.each() { msg -> log.info msg } } } } } logFile.write "TOTAL TEST CASES SUCCEED: $succeedTestCases of $totalTestCases" + "/n/n" + testCaseSucceed + "---/n/n" + "TOTAL TEST CASES FAILED: $failedTestCases of $totalTestCases" + "/n/n" + testCaseFailed + "/n/n"

Lo que realmente quiero hacer es mover el código desde el nivel de Suite de prueba y colocarlo en el script de derribar en el nivel de proyecto. Ahora cuando ejecuto el código desde allí, no genera el archivo, supongo que necesito ubicar las rutas correctas, ya que no me estoy moviendo al banco de pruebas para probar el caso, sino del proyecto al banco de pruebas para probar los pasos de prueba. .

Mi pregunta es realmente sobre la sintaxis, quiero desarrollar un informe cuando se ejecuta todo el proyecto, se obtienen los siguientes resultados:

  • Nombre del proyecto: ¿ha tenido éxito o ha fallado? Si un paquete falló, el proyecto falla o pasa
  • Conjunto de pruebas: tome el nombre de cada conjunto de pruebas en el proyecto y, si las pasa, coloque ''Salir bien'' junto al nombre del conjunto de pruebas, en su lugar, coloque ''Error'' junto al nombre del conjunto de pruebas.
  • Nombre de todos los casos de prueba dentro del conjunto de pruebas. Al igual que el que aparece en la captura de pantalla, realmente "triunfa" al lado de los casos de prueba que han pasado y "fallado" al lado de aquellos que no lo han hecho.
  • Finalmente los valores de la propiedad. Si un caso de prueba ha fallado, capture los valores de propiedad para ese caso de prueba fallido para que podamos rastrear qué valores se ingresaron que causaron la falla de la prueba.

¿Alguien puede ayudarme con la sintaxis relevante para realizar esto, entonces puedo pegarlo en mi código y manipularlo?

ACTUALIZAR:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) def dataFolder = groovyUtils.projectPath def date = new Date() def folderTime = date.format("yyyy-MM-dd HH-mm-ss") //Create a folder directory for the responses RootResultFolder = dataFolder + "//Test Reports" + "//xxx - " + folderTime + "//" CreateResultFolder = new File(RootResultFolder) CreateResultFolder.mkdir()*/ //context.setProperty("RootResultFolder", RootResultFolder) def reportFileName = "WebAPI Test Report.txt" def rootFolder = RootResultFolder + reportFileName def logFile = new File(rootFolder)


Si observa el TearDown Script del proyecto, se muestra a continuación, es decir, las variables ya inicializadas por soapui.

Emitir con su script
Entonces, si lo miras, hay una variable de runner . También la misma variable está disponible en el script TearDown del nivel de conjunto de pruebas . Pero, estas son instancias de diferentes Objetos. La secuencia de comandos utilizada en OP era de nivel suite que usted conoce y es por eso que no está viendo en el resultado.

Aquí está el nivel de proyecto TearDown Script y los siguientes comentarios en línea.

/** * * 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}" if ( caseRunner.status.toString() == ''FAILED'' ){ 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 -> report.append("Name : ${kase}/n") report.append("Status : ${getResult(tcReport.status)}/n") if (!tcReport.status) { 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())

Y aquí está el resultado generado: