[SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到Excel

import static  java.lang.Math.* 

import java.text.NumberFormat

import java.awt.Color



import com.eviware.soapui.support.GroovyUtils

import com.eviware.soapui.support.XmlHolder



import org.apache.poi.ss.usermodel.RichTextString

import org.apache.poi.ss.usermodel.Cell

import org.apache.poi.ss.usermodel.Row

import org.apache.poi.ss.util.*



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



//  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 dataIdMappingPAFile = testDataPath+"\\DataIdMappingPA.xml"

String dataIdMappingDirectFile = 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/I" )

def nodesArrayTP =xmlHolderTP.getDomNodes("//B/I/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



def attributesNumber = nodesListLive.get(0).attributes.getLength()



// Failed records

int failedRecordsNumber=0



// Get Map of Data ID and Data Name

HashMap dataIDAndNameMap = new HashMap()

getMapOfDataIdAndNameFromExternelFile(dataIdMappingPAFile,dataIDAndNameMap)

getMapOfDataIdAndNameFromExternelFile(dataIdMappingDirectFile,dataIDAndNameMap)



// 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)

recordMapTP = getRecordMap(nodesListTP,recordsNumberTP,attributesNumber,dataIDAndNameMap)



// Fail message

ArrayList failMessageList = new ArrayList()

ArrayList failMessage



// Compare data value on TP and Live based on PortfolioId

Iterator iter = recordMapLive.entrySet().iterator()

while (iter.hasNext()) {

	Map.Entry entry = (Map.Entry) iter.next()

	def portfolioId = entry.getKey()

	HashMap dataMapLive = entry.getValue()

	HashMap dataMapTP =recordMapTP.get(portfolioId)

	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)

		def ticker

		if(dataValueTP==null){

			ticker = dataMapLive.get("Ticker")

			failMessage=[portfolioId,ticker,dataNameLive,"Not Exist",dataValueLive]

  			failMessageList.add(failMessage)

		}

		

		if(dataValueLive != dataValueTP){

			 ticker = dataMapLive.get("Ticker")

			

			if(dataValueLive.isFloat()&&dataValueTP.isFloat()){

				allowableDeviation = dataDeviationMap.get(dataNameLive)

				if(allowableDeviation==null){

					allowableDeviation=0

				}

				addFailMessageAboutFloatDiff(failMessageList,portfolioId,ticker,dataNameLive,dataValueTP,dataValueLive, allowableDeviation)

			}



			else{

				failMessage =[portfolioId,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



if(failedDataPointsNumber>0){

	// Get failed percentage

	def failedPercentage

	NumberFormat format = NumberFormat.getPercentInstance()

	format.setMinimumFractionDigits(2)

	failedPercentage = failedDataPointsNumber/totalDataPointsNumber



	// Get the first failed message

	def theFirstFailMessage = failMessageList.get(0)

	def theFirstErrorMessage = "Failed : "+format.format(failedPercentage)+", eg : Portfolio Id = "+theFirstFailMessage.get(0)+" , Ticker = "+theFirstFailMessage.get(1)+" , Data Point = "+theFirstFailMessage.get(2)+" , TP = "+theFirstFailMessage.get(3)+" , Live = "+theFirstFailMessage.get(4)

	log.error theFirstErrorMessage



	// Write failed data points to excel

	def testResultFile = new File(testResultPath+ currentStepName+".xlsx")  

     if (testResultFile.exists()) {

		 testResultFile.delete()

     }

     String sheetName = "Failed Data Points"

     HashMap data = new HashMap()

     data.put("1", ["Portfolio Id","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)

	assert false,theFirstErrorMessage

}



//**********************************************************************Methods**************************************************************************

// Get map of PortfolioId and other data points list

def getRecordMap(List nodesList,int recordsNumber,int attributesNumber,HashMap dataIDAndNameMap){

	HashMap map = new HashMap()

	for(int i=0;i<recordsNumber;i++){

		attributes = nodesList.get(i).getAttributes()

		portfolioId = attributes.item(5).value

		if(portfolioId!=""){

			HashMap dataMap = new HashMap()

			for(int j=3;j<attributesNumber;j++){

				dataID = attributes.item(j).name

				dataName = dataIDAndNameMap.get(dataID)

				dataValue = attributes.item(j).value

				dataMap.put(dataName,dataValue)

			}

			map.put(portfolioId,dataMap)

		}

	}

	return map

}



// Get map of Data ID and Data Name from externel file

def getMapOfDataIdAndNameFromExternelFile(String dataIdMappingFile,HashMap map){

    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)	

     }

}



// Add fail message when two float data is different

def addFailMessageAboutFloatDiff(ArrayList failMessageList,String portfolioId,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 =[portfolioId,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,15 *256)

	   sheet.setColumnWidth(1,10 *256)

        sheet.setColumnWidth(2,30 *256)

        sheet.setColumnWidth(3,20 *256)

        sheet.setColumnWidth(4,20 *256)

        sheet.setColumnWidth(5,20 *256)

        sheet.setColumnWidth(6,20 *256)



        sheet.createFreezePane( 0, 1, 0, 1 )



         XSSFCellStyle cellStyleTitle = workbook.createCellStyle()

  	   cellStyleTitle.setFillPattern( XSSFCellStyle.SOLID_FOREGROUND)

  	   cellStyleTitle.setFillForegroundColor( new XSSFColor( new Color(131, 191, 90)))



  	   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 the actual deviation > 10%, change the cell color to red in the excel

                if((item.contains("%"))&&(cellnum==7)){

                	Number number = NumberFormat.getInstance().parse(item)

                	if(number>10){

                		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)

                else if(item instanceof Float)

                    cell.setCellValue((Float)item)

                else if(item instanceof BigDecimal)

                    cell.setCellValue((BigDecimal)item)

            }

        }

        sheet.setAutoFilter(CellRangeAddress.valueOf("A1:G1"))

        try {

            FileOutputStream out = new FileOutputStream(createFile)

            workbook.write(out)

            out.close()   

        } catch (FileNotFoundException e) {

            e.printStackTrace()

        } catch (IOException e) {

            e.printStackTrace()

        }

}

  

你可能感兴趣的:(response)