[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()
}
}
[SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到Excel的更多相关文章
- [SoapUI] 比较两个不同环境下XML格式的Response, 结果不同时设置Test Step的执行状态为失败
import org.custommonkey.xmlunit.* def responseTP=context.expand( '${Intraday Table_TP#Response}' ) d ...
- Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢?
参考出处: http://www.imooc.com/qadetail/76393 Nginx环境下,PHP下载,中文文件,下载失效(英文可以下载)怎么解决呢? 背景介绍: 文件名 为英文时可以下载 ...
- [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容 ...
- stm32f107vc在IAR环境下,引用库函数的工程文件的配置方法
stm32做开发很方便的一个原因是大家可以稍稍放松对于硬件寄存器等的设置,因为stm32有了非常丰富和实用的库函数,外设文件等等,所以我们在使用的时候可以更加关注程序开发的过程和逻辑关系.但是,在开发 ...
- 【NodeJs环境下bower】如何更改bower_components文件夹的位置
bower在初始化,默认是将bower_components文件夹放到项目的根目录下,若是public/index.html如何配置bower_components下的js或者css类库呢?只需要将b ...
- .NET环境下上传和下载Word文件
一.上传Word文档或者其他文档 1.简单地上传文件的web服务方法如下 [WebMethod] public void UploadFile() { using (TransactionScope ...
- VC6在win7环境下无法添加以及打开现有文件的解决办法
在VC6.0中使用键盘快捷键或者是文件菜单打开现有文件以及添加文件出现编辑器停止响应,弹出内容为Microsoft(R) Developer Studio已停止工作 Windows正在检查解决该 ...
- WAMP环境下访问PHP提示下载PHP文件
原因是服务器没有加载到PHP文件 到http.conf下加载 AddType application/x-httpd-php .php AddType application/x-httpd-php ...
- cocos2dx3.0-tinyxml在Android环境下解析xml失败的问题
本文由@呆代待殆原创,转载请注明出处. 正常情况下,我们在用tinyxml读取xml文件的的时候,会像下面这样写. std::string filePath = FileUtils::getInsta ...
随机推荐
- hash一致性算法
一致性hash算法是,1097麻省理工提出的分布式hashDHT实现算法,极倔internet的热点问题 平衡性 hash结果尽可能的分布到所有的缓存中去,缓冲空间利用率最高 单调性 保持已有的缓存能 ...
- JAVA课程设计(坦克大战)
2019-01-16 坦克大战游戏背景: 1. 需求分析 1.1环境要求 操作系统:Windows 7(SP1)以上 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 1.2角 ...
- Apache的下载安装(主要说的 64位)及问题
本文转载自:http://blog.csdn.net/qq_15096707/article/details/47319545 今天重装完win10系统,就重新下载安装 Apache.虽说之前有安装过 ...
- springboot+idea 热部署
1 配置pom.xml <!--spring-boot-devtools 热部署--> <dependency> <groupId>org.springframew ...
- ROS HTB限速失败原因分析和需注意事项
要想做限速,必须要知道以下几点: 首先要知道自己要限制什么的速度,谁的速度,于是需要用的标记,即Mangle. 其次要知道怎么限速,是限制上传,还是下载? 最后要知道所做的限速是否成功,即需要知道如何 ...
- WARN deprecation:&L - HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration
WARN deprecation:&L - HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sour ...
- IBM AIX创建lv
#lsvg 查看当前有哪些vgrootvgvgdb02vgdb01datavg#lslv maindb_index 查看maindb_index这个lv 位于哪个vg上,新的lv也要与之相同.LOGI ...
- 面试宝典:Java面试中最高频的那20%知识点!
Java目前已经不仅仅是一门开发语言,而是一整套生态体系. 作为一个Java程序员,既是幸运的,也是不幸的.幸运的是我们有很多轮子可以拿过来用,不幸的是我们有太多的轮子需要学习. 但是,无论是日常工作 ...
- python中nltk的下载安装方式
首先去http://nltk.org/install.html下载相关的安装程序,然后 在cmd窗口中,进入到python的文件夹内的 Scripts内,运行easy_install pip 安装Py ...
- 18_java之集合Collection
01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList< ...