Forum Discussion
JoostDG
3 years agoFrequent Contributor
Hi VigneshR32 ,
I found a script somewhere online, which I applied and adjusted a bit in one of my projects some time ago. The script writes the test results of a project run via a teardown script to a file. Perhaps not fully what you are looking for, but it can give some clues to achieve your goal.
All credits to the original uploader.
/*
* Below is the TearDown script for SoapUI Project level
* Which create a custom report in a given file
* Modify the variable "reportFileName" below
*
*/
//Get the project path (including the project foled, i.e. Wed Jan 15 13:13:40 UTC 2020: INFO: ... stored in file at location C:\git\readyAPIProjects/yourProjectName
def dataFolder = context.expand( '${#Project#projectpath}' )
//Create today's date for storing response
LocalDateTime now = LocalDateTime.now()
DateTimeFormatter wantedDateFormat = DateTimeFormatter.ofPattern("EEE_dd-MM-YYYY").withLocale(Locale.US)
DateTimeFormatter wantedDateTimeFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy'T'HH.mm.ss").withLocale(Locale.US)
String today = wantedDateFormat.format(now)
String fileNamePart = wantedDateTimeFormat.format(now)
def filePrefix = "${dataFolder}/ReadyAPI_TestReports/${today}"
//creating filename dynamically.
def reportFileName = "${filePrefix}/"+project.getActiveEnvironment().getName()+"/"+project.getName()+"_${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> caseResults = [:]
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)
caseResults[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,context, runner, fileNamePart) {
def report = new StringBuffer()
def versionAPPyourProjectName = context.expand( '${#Project#versionAPPyourProjectName}' )
def versionAPPyourProjectNameDeployDate = context.expand( '${#Project#versionAPPyourProjectNameDeployDate}' )
def versionBFF = context.expand( '${#Project#versionBFF}' )
def versionBFFDeployDate = context.expand( '${#Project#versionBFFDeployDate}' )
def versionyourProjectNameApi = context.expand( '${#Project#versionyourProjectNameApi}' )
def versionyourProjectNameApiDeployDate = context.expand( '${#Project#versionyourProjectNameApiDeployDate}' )
def versionINTApiX = context.expand( '${#Project#versionINTApiX}' )
def versionINTApiY = context.expand( '${#Project#versionINTApiY}' )
def versionINTAPIZyourProjectName = context.expand( '${#Project#versionINTAPIZyourProjectName}' )
def timetakeninms = runner.timeTaken
String timeTakenInMinutes = String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toMinutes(timetakeninms),
TimeUnit.MILLISECONDS.toSeconds(timetakeninms) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timetakeninms))
)
report.append(drawLine()).append('\n')
report.append("\t\t\tTest Execution Summary\n")
report.append(drawLine('-', 60)).append('\n')
report.append("Project : ${project.name} on "+project.getActiveEnvironment().getName()+" "+ fileNamePart.toString() +"\n")
report.append("Result : ${getResult(projectResultHolder.status)}\n")
report.append("TimeTaken : "+timeTakenInMinutes+ " \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.append("versionAPPyourProjectName : $versionAPPyourProjectName\n")
report.append("versionAPPyourProjectNameDeployDate : $versionAPPyourProjectNameDeployDate\n")
report.append("versionBFF : $versionBFF\n")
report.append("versionBFFDeployDate : $versionBFFDeployDate\n")
report.append("versionyourProjectNameApi : $versionyourProjectNameApi\n")
report.append("versionyourProjectNameApiDeployDate : $versionyourProjectNameApiDeployDate\n")
report.append("versionINTApiX : $versionINTApiX\n")
report.append("versionINTApiY : $versionINTApiY\n")
report.append("versionINTAPIZyourProjectName : $versionINTAPIZyourProjectName\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 Test Cases : ${details.testCaseCount}\n")
//report.append("Cases Passed : ${details.passedCasesCount}\n")
report.append("Cases Failed: ${details.failedCasesCount}\n")
report.append(getTestCaseReport(details.caseResults))
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, context, runner, fileNamePart))
finalReport.append(getDetailedReport(holder))
def reportFile = new File(reportFileName)
saveToFile(reportFile, finalReport.toString())
Related Content
- 10 years ago
- 4 years ago
- 10 years ago
Recent Discussions
- 22 days ago