zoukankan      html  css  js  c++  java
  • [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()
            }
    }
    

      

  • 相关阅读:
    Iaas、Paas、Saas对比分析
    一个不一样的Python教程
    传销的那些年
    availableProcessors is already set to [8], rejecting [8]
    脚本是个好东西
    《设计模式之禅》之桥梁模式
    博文视点之传奇程序员修炼之道观后感
    《设计模式之禅》之享元模式
    《设计模式之禅》之解释器模式
    Git修改commit提交信息
  • 原文地址:https://www.cnblogs.com/MasterMonkInTemple/p/4636446.html
Copyright © 2011-2022 走看看