标签:
import static java.lang.Math.*
import java.text.NumberFormat
import com.eviware.soapui.support.GroovyUtils
import com.eviware.soapui.support.XmlHolder
import org.apache.poi.ss.usermodel.Cell
import org.apache.poi.ss.usermodel.Row
import org.apache.poi.xssf.usermodel.XSSFSheet
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.xssf.usermodel.XSSFCellStyle
import org.apache.poi.xssf.usermodel.XSSFColor
import org.apache.poi.ss.usermodel.RichTextString
import java.awt.Color
// Get test steps
def currentStepIndex = context.currentStepIndex
String currentStepName = testRunner.testCase.getTestStepAt(currentStepIndex).name
String previousStepName = testRunner.testCase.getTestStepAt(currentStepIndex-1).name
String prePreStepName = testRunner.testCase.getTestStepAt(currentStepIndex-2).name
// File path
String testDataPath = testRunner.testCase.testSuite.project.getPropertyValue( "testDataPath" )
String dataIdMappingFile = testDataPath+"\\DataIdMappingPA.xml"
String dataDeviationFile = testDataPath+"\\RTQDataAllowableDeviation.xlsx"
String testResultPath = testRunner.testCase.testSuite.project.getPropertyValue( "testResultPath" )
// Get allowable deviation
def allowableDeviation
HashMap dataDeviationMap = getAllowableDeviation(dataDeviationFile)
// Get response
def groovyUtils = new GroovyUtils( context )
def xmlHolderLive = groovyUtils.getXmlHolder( prePreStepName+"#ResponseAsXml" )
def xmlHolderTP = groovyUtils.getXmlHolder( previousStepName+"#ResponseAsXml" )
// Get records
def nodesArrayLive = xmlHolderLive.getDomNodes("//B/I" )
def nodesArrayTP =xmlHolderTP.getDomNodes("//B/I")
List nodesListLive = nodesArrayLive.toList()
List nodesListTP = nodesArrayTP.toList()
int recordsNumberLive = nodesListLive.size()
int recordsNumberTP = nodesListTP.size()
log.info "Total Records Number on Live = "+recordsNumberLive
log.info "Total Records Number on TP = "+recordsNumberTP
// Failed records
int failedRecordsNumber=0
// Get Map of Data ID and Data Name
getMapOfDataIdAndNameFromExternelFile(dataIdMappingFile)
HashMap dataIDAndNameMap = new HashMap()
dataIDAndNameMap = getMapOfDataIdAndNameFromExternelFile(dataIdMappingFile)
def attributesNumber = nodesListLive.get(0).attributes.getLength()
// Get Map of Data Name and Data Value
HashMap recordMapLive = new HashMap()
HashMap recordMapTP = new HashMap()
def dataName
def dataValue
recordMapLive = getRecordMap(nodesListLive,recordsNumberLive,attributesNumber,dataIDAndNameMap,recordMapLive)
recordMapTP = getRecordMap(nodesListTP,recordsNumberTP,attributesNumber,dataIDAndNameMap,recordMapTP)
// Fail message
ArrayList failMessageList = new ArrayList()
ArrayList failMessage
// Compare data value on TP and Live based on ticker
Iterator iter = recordMapLive.entrySet().iterator()
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next()
def ticker = entry.getKey()
HashMap dataMapLive = entry.getValue()
HashMap dataMapTP =recordMapTP.get(ticker)
Iterator iter2 = dataMapLive.entrySet().iterator()
while (iter2.hasNext()) {
Map.Entry entry2 = (Map.Entry) iter2.next()
def dataNameLive = entry2.getKey()
def dataValueLive = entry2.getValue()
def dataValueTP = dataMapTP.get(dataNameLive)
if(dataValueTP==null){
failMessage=[ticker,dataNameLive,"Not Exist",dataValueLive]
failMessageList.add(failMessage)
}
if(dataValueLive != dataValueTP){
if(((dataValueTP=="")&&(dataValueTP!=""))||((dataValueTP!="")&&(dataValueTP==""))){
failMessage = [ticker,dataNameLive,dataValueTP,dataValueLive]
failMessageList.add(failMessage)
}
if(dataValueLive.isFloat()&&dataValueTP.isFloat()){
allowableDeviation = dataDeviationMap.get(dataNameLive)
if(allowableDeviation==null){
allowableDeviation=0
}
addFailMessageAboutFloatDiff(failMessageList,ticker,dataNameLive,dataValueTP,dataValueLive, allowableDeviation)
}
else{
failMessage =[ticker,dataNameLive,dataValueTP,dataValueLive]
failMessageList.add(failMessage)
}
}
}
}
// Get total data points number
int totalDataPointsNumber = recordsNumberLive*attributesNumber
log.info "Total Data Points Number = "+totalDataPointsNumber
// Get failed data points number
int failedDataPointsNumber = failMessageList.size()
log.info "Failed Data Points Number = "+failedDataPointsNumber
def failedPercentage = failedDataPointsNumber/totalDataPointsNumber
NumberFormat format = NumberFormat.getPercentInstance()
format.setMinimumFractionDigits(2)
log.error "Failed Data Points Percentage = "+format.format(failedPercentage)
// Print out all failed data points
if(failedDataPointsNumber>0){
def testResultFile = new File(testResultPath+ currentStepName+".xlsx")
if (testResultFile.exists()) {
testResultFile.delete()
}
String sheetName = "Failed Data Points"
HashMap data = new HashMap()
data.put("1", ["Ticker","Data Point","TP","Live","Allowable Deviation","Actual Deviation"])
for(j=0; j<failedDataPointsNumber; j++){
data.put((j+2).toString(), failMessageList.get(j))
}
createExcelFile(testResultFile,sheetName,data)
def theFirstFailMessage = failMessageList.get(0)
assert false,"Ticker = "+theFirstFailMessage.get(0)+" , Data Point = "+theFirstFailMessage.get(1)+" , TP = "+theFirstFailMessage.get(2)+" , Live = "+theFirstFailMessage.get(3)
}
//**********************************************************************Methods**************************************************************************
// Get map of ticker and other data points list
def getRecordMap(List nodesList,int recordsNumber,int attributesNumber,HashMap dataIDAndNameMap,HashMap recordMap){
HashMap map = new HashMap()
for(int i=0;i<recordsNumber;i++){
attributes = nodesList.get(i).getAttributes()
ticker = attributes.item(3).value
if(ticker!=""){
HashMap dataMap = new HashMap()
for(int j=4;j<attributesNumber;j++){
dataID = attributes.item(j).name
dataName = dataIDAndNameMap.get(dataID)
dataValue = attributes.item(j).value
dataMap.put(dataName,dataValue)
}
map.put(ticker,dataMap)
}
}
return map
}
// Get map of Data ID and Data Name from externel file
def getMapOfDataIdAndNameFromExternelFile(String dataIdMappingFile){
HashMap map = new HashMap()
def xmlDataIdMapping= new XmlParser().parse(dataIdMappingFile)
for(it in xmlDataIdMapping.f){
String mapDataID = "${it.attribute("i")}"
String mapDataName = "${it.attribute("udlbl")}"
map.put(mapDataID, mapDataName)
}
return map
}
// Add fail message when two float data is different
def addFailMessageAboutFloatDiff(ArrayList failMessageList,String ticker,String dataName,String dataValueStringTP,String dataValueStringLive,def allowableDeviation){
def dataValueTP = dataValueStringTP.toFloat()
def dataValueLive = dataValueStringLive.toFloat()
if ((dataValueLive ==0)&&(dataValueTP == 0)){
return
}
NumberFormat format = NumberFormat.getPercentInstance()
format.setMinimumFractionDigits(2)
Float benchmark = dataValueLive
if (dataValueLive ==0){
benchmark = dataValueTP
}
def actualDeviation = Math.abs((dataValueLive-dataValueTP )/benchmark)
if(actualDeviation>allowableDeviation){
failMessage =[ticker,dataName,dataValueStringTP,dataValueStringLive,format.format(allowableDeviation),format.format(actualDeviation)]
failMessageList.add(failMessage)
}
}
// Get allowable deviation from externel file
def getAllowableDeviation(String dataDeviationFile){
HashMap map = new HashMap()
File file = new File(dataDeviationFile)
try{
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(dataDeviationFile))
XSSFSheet sheet = wb.getSheetAt(0)
Row row
Cell cellDataName
Cell cellDataDeviation
int rows = sheet.physicalNumberOfRows
def dataName
def dataDeviation
(1..<rows).each{ r ->
row = sheet.getRow(r)
if (row != null){
cellDataName = row.getCell(1)
cellDataDeviation = row.getCell(2)
if (cellDataName != null){
dataName = cellDataName.getStringCellValue()
}
if (cellDataDeviation != null){
switch (cellDataDeviation.getCellType()){
case cellDataDeviation.CELL_TYPE_NUMERIC:
dataDeviation = cellDataDeviation.getNumericCellValue()
break
case cellDataDeviation.CELL_TYPE_STRING:
dataDeviation = cellDataDeviation.getStringCellValue()
break
case cellDataDeviation.CELL_TYPE_BLANK:
break
default:
break
}
}
}
map.put(dataName,dataDeviation)
}
return map
}
catch (Exception e){
log.info "Exception :" + e.getMessage()
}
}
def createExcelFile(File createFile,String sheetName, HashMap data){
XSSFWorkbook workbook = new XSSFWorkbook()
XSSFSheet sheet = workbook.createSheet(sheetName)
sheet.setColumnWidth(0,10 *256)
sheet.setColumnWidth(1,30 *256)
sheet.setColumnWidth(2,20 *256)
sheet.setColumnWidth(3,20 *256)
sheet.setColumnWidth(4,20 *256)
sheet.setColumnWidth(5,20 *256)
sheet.createFreezePane( 0, 1, 0, 1 )
XSSFCellStyle cellStyleTitle = workbook.createCellStyle()
cellStyleTitle.setFillPattern( XSSFCellStyle.SOLID_FOREGROUND)
cellStyleTitle.setFillForegroundColor( new XSSFColor( new Color(111, 187, 195)))
XSSFCellStyle cellStyleFailed = workbook.createCellStyle()
cellStyleFailed.setFillPattern( XSSFCellStyle.SOLID_FOREGROUND)
cellStyleFailed.setFillForegroundColor( new XSSFColor( new Color(255, 0, 0)))
Set<String> keySet=data.keySet()
ArrayList keyList=new ArrayList (keySet)
Collections.sort(keyList)
int rownum = 0
for (String key : keyList) {
Row row = sheet.createRow(rownum++)
ArrayList arrayList = data.get(key)
int cellnum = 0
for (def item : arrayList) {
Cell cell = row.createCell(cellnum++)
if(rownum==1){
cell.setCellStyle(cellStyleTitle)
}
if((item.contains("%"))&&(cellnum==6)&&(new Float(item.substring(0,item.indexOf("%")))/100>0.1)){
cell.setCellStyle(cellStyleFailed)
}
if(item instanceof Date)
cell.setCellValue((RichTextString)item)
else if(item instanceof Boolean)
cell.setCellValue((Boolean)item)
else if(item instanceof String)
cell.setCellValue((String)item)
else if(item instanceof Double)
cell.setCellValue((Double)item)
}
}
try {
FileOutputStream out = new FileOutputStream(createFile)
workbook.write(out)
out.close()
} catch (FileNotFoundException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
}
}
[SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到Excel
标签:
原文地址:http://www.cnblogs.com/MasterMonkInTemple/p/4636446.html