从项目级别的分解脚本在SoapUI中创建测试报告



我试图更改@Rao编写的代码,这里有一个链接!为了在报告中显示测试步骤的详细信息,不幸的是,它不起作用。有人能帮忙吗?

我的问题实际上是语法,我想在整个项目运行时开发一个报告,它输出以下结果:

  • 项目名称-是成功还是失败。若一个套件失败,那个么项目就会失败,否则它就会通过
  • 测试套件-取项目中每个测试套件的名称,如果通过,则将"成功"放在测试套件名称旁边,否则将"失败"放在试验套件名称旁边
  • 测试套件中所有测试用例的名称。就像屏幕截图中的那个一样,在已经通过的测试用例旁边"成功",在没有通过的测试案例旁边"失败">
  • 测试步骤-取项目中每个测试步骤的名称,如果通过,则将"成功"放在测试步骤名称旁边,否则将"失败"放在检测步骤名称旁边
  • 最后是属性值。如果测试用例失败,请捕获该失败测试用例的属性值,以便我们可以跟踪导致测试失败的输入值

下面是代码:

/**
*
* 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/Local_AllModules_Report_${today}" as String
def fileNamePart = new Date().format("yyyy-MM-dd'T'HH.mm.ss")
//creating filename dynamically.
def reportFileName = "${filePrefix}/Local_AllModules_TestReport_${fileNamePart}.txt" as String

//NOTE: Not required to edit beyond this point
/**
* This class holds the test step details
**/
class TestStepResultHolder {
def log
Map<String, String> propertiesTest = [:]
boolean status
def getTestStepList(testCase) {
testCase.getTestCase().each { key ->
propertiesTest[key] = testCase.getTestStepByName(key)
}       
}
def getStepResult(stepRunner, stepName) {
log.info "Checking test case status ${stepName}"
if ( stepRunner.status.toString() == 'FAILED' ){
log.error "Test case $stepName has failed"
for ( step_Result in stepRunner?.results ){
step_Result.messages.each() { msg -> log.info msg }
}
return false
} else {
log.info "${stepName} is passed"
}
true
}
def buildStepResult(stepRunner, stepName) {
status = getStepResult(stepRunner, stepName)
if (!status) {
createProperties(stepRunner.testCase)
}
}
}
/**
* 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("tttTest Execution Summaryn")
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("ttTest 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
}
//Gets the test step report
def getTestStepReport(testStepReport) {
def report = new StringBuffer()
report.append(drawLine('-', 60)).append('n')
report.append("ttTest Case Details:n")
report.append(drawLine('-', 60)).append('n')
testStepReport.each { kaset, tsReport ->
report.append("Name : ${kaset}n")
report.append("Status : ${getResult(tsReport.status)}n")
if (!tsReport.status) {
report.append("Properties : ${tsReport.propertiesTest.toString()}n")
}
}
report
}
//Get the detailed report
def getDetailedReport(projectResultHolder) {
def report = new StringBuffer()
report.append(drawLine()).append('n')
report.append("tttTest Execution Detailed Reportn")
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())

要获得测试步骤结果,您可以添加一个脚本,就像我在测试用例的拆卸脚本中使用的脚本:

log.info "nb steps : " + testRunner.getTestCase().getTestStepCount()
for (testStep in testRunner.getResults()){
log.info "step " + testStep.getTestStep().getName() + " : " + testStep.getStatus()
}

您也可以在测试套件的拆卸脚本中添加以下内容,但当您在测试套件级别运行时,您将不会得到测试用例的拆卸脚本:

log.info "*********** EXECUTION SUMMARY *****************************************"
def runner = context.testRunner;

//log.info "nb test results = " + runner.getResultCount()
for (testRun in runner.getResults())
{
testCase = testRun.getTestCase()
//log.info "testCase " + testCase
log.info context.expand( '${#Project#testcase_flag}' ) + testCase.getName()
log.info "nb test steps = "+ testCase.getTestStepCount()
for (testResult in  testRun.getResults())
log.info testResult.getTestStep().getName() + " : " + testResult.getStatus()
log.info context.expand( '${#Project#testcase_status_flag}' ) + " : " + runner.getStatus()
}
log.info "*************************************************************************************"

这对我来说效果很好。。。

最新更新