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() } }