在 groovy 驱动的数据中遇到异常

Encountered Exception in Data Driven with groovy

无法将 excel sheet 中的值放入请求中。 使用以下代码,我可以从 excel sheet 中读取值,但无法将其放入请求中。

import com.eviware.soapui.support.XmlHolder
import java.io.File;
import java.io.IOException;
import jxl.*;
import jxl.read.biff.BiffException;
import jxl.write.*;

log.info("Testing Started")
def reqOperationName = "getInsuranceDetails_1_FTC_005";
def inputDataFileName = "D:/SOAP UI Pro/MPI.xls"
def inputDataSheetName = "MPI"

Workbook workbook = Workbook.getWorkbook(new File(inputDataFileName));
WritableWorkbook copy = Workbook.createWorkbook(new File(inputDataFileName),workbook);
WritableSheet sheet1 = copy.getSheet(inputDataSheetName);

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def reqholder = groovyUtils.getXmlHolder(reqOperationName+"#Request")
try{
    rowcount = sheet1.getRows();
    colcount = sheet1.getColumns();
    for(Row in 1..rowcount-1){
        for(Col in 2..colcount-1){
            String reqTagName = sheet1.getCell(Col,0).getContents()
            def TagCount = reqholder["count(//*:"+reqTagName+")"]
            if(TagCount!=0){
                String reqTagValue = sheet1.getCell(Col,Row).getContents()
                reqholder.setNodeValue("//*:"+reqTagName, reqTagValue)
                reqholder.updateProperty()                              
            }
        }
        //test the request
        testRunner.runTestStepByName(reqOperationName)
    //Read Response xml

def resholder = groovyUtils.getXmlHolder(reqOperationName+"#Response")
resTagValue1= resholder.getNodeValues("//*:productID")
resTagValue2= resholder.getNodeValues("//*:accountNumber")
resTagValue3= resholder.getNodeValues("//*:insuranceCategory")
resTagValue4= resholder.getNodeValues("//*:imei")
resTagValue5= resholder.getNodeValues("//*:handsetMake")
resTagValue6= resholder.getNodeValues("//*:handsetModel")
resTagValue7= resholder.getNodeValues("//*:insurancePolicyName")
resTagValue8= resholder.getNodeValues("//*:insuranceStartTimestamp")        
//Write Response into excel sheet

Label resValue1= new Label(4,Row,resTagValue1);
sheet1.addCell(resValue1);   
Label resValue2= new Label(5,Row,resTagValue1);
sheet1.addCell(resValue1);
Label resValue3= new Label(6,Row,resTagValue1);
sheet1.addCell(resValue1);
Label resValue4= new Label(7,Row,resTagValue1);
sheet1.addCell(resValue1);
Label resValue5= new Label(8,Row,resTagValue1);
sheet1.addCell(resValue1);
Label resValue6= new Label(9,Row,resTagValue1);
sheet1.addCell(resValue1);
Label resValue7= new Label(10,Row,resTagValue1);
sheet1.addCell(resValue1);
Label resValue8= new Label(11,Row,resTagValue1);
sheet1.addCell(resValue1);

    }

}catch (Exception e) {log.info(e)}
finally{
    copy.write();
    copy.close();
    workbook.close();
}
log.info("Testing Over")

以下是我在控制台中遇到的异常:

信息:java.lang.RuntimeException:net.sf.saxon.trans.XPathException:{\ncount(//*:)} 中第 2 行字符 11 的 XPath 语法错误:预期为“”,已找到")"

任何帮助将不胜感激。 谢谢,

excelsheet 和请求

的屏幕截图

下面是 excel sheet 和请求

的附加屏幕截图

excel sheet

谢谢,

下面是我在 groovy 脚本中实现的代码......

Code part1

code part-2

我想我已经找到问题所在了。您收到该错误的原因是因为您从 excel sheet 中获取特定行和列组合的空值(这意味着该单元格中没有数据)。您不需要列循环,因为您只有一个列。

试试下面的代码:

import com.eviware.soapui.support.XmlHolder
import java.io.File
import java.io.IOException
import jxl.*
import jxl.read.biff.BiffException
import jxl.write.*

log.info("Testing Started")
def reqOperationName = "getInsuranceDetails_1_FTC_005"
def inputDataFileName = "D:/SOAP UI Pro/MPI.xls"
def inputDataSheetName = "MPI"
Workbook workbook = Workbook.getWorkbook(new File(inputDataFileName))
WritableWorkbook copy = Workbook.createWorkbook(new File(inputDataFileName),workbook)
WritableSheet sheet1 = copy.getSheet(inputDataSheetName)

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def reqholder = groovyUtils.getXmlHolder(reqOperationName+"#Request")
try{
    rowcount = sheet1.getRows()
    colcount = sheet1.getColumns()

    for(Row in 1..rowcount-1){
    def cell = sheet1.getCell(0,0)
    cell.setCellType(Cell.CELL_TYPE_STRING)
    String reqTagName = cell.getContents()
        log.info reqTagName
        def TagCount = reqholder["count(//*:"+reqTagName+")"]
        if(TagCount!=0){
            String reqTagValue = sheet1.getCell(0,Row).getContents()
            reqholder.setNodeValue("//*:"+reqTagName, reqTagValue)
            reqholder.updateProperty()                              
        }

    //test the request
    testRunner.runTestStepByName(reqOperationName)


    }

}
catch (Exception e) {log.info(e)}
finally{
    copy.write()
    copy.close()
    workbook.close()
}
log.info("Testing Over")

此外,最好将测试数据输入和测试输出结果移动到不同的 excel sheet。您的代码现在使用单个 sheet 进行测试数据输入,并保存到导致问题的测试结果。

让我知道它是否有效。希望这会有所帮助:)

这只是一个建议,但您有什么理由不能使用 CSV 文件来实现您想要实现的目标吗?

我只问,因为我过去使用 Excel 进行数据驱动测试时,经常发现可以添加额外的 characters/spaces。

尝试使用下面提到的代码....它对我有用,现在可能对你也有帮助....

    import com.eviware.soapui.support.XmlHolder
    import java.io.File
    import java.io.IOException
    import jxl.*
    import jxl.read.biff.BiffException
    import jxl.write.*
    import jxl.write.Label
    log.info("Testing Started")
    def reqOperationName = "getInsuranceDetails_1_FTC_005"
    def inputDataFileName = "D:/SOAP UI Pro/MPI.xls"
    def inputDataSheetName = "MPI"
    Workbook workbook = Workbook.getWorkbook(new File(inputDataFileName))
    Sheet  sheet1 = workbook.getSheet(inputDataSheetName)


    def myList = new ArrayList<String>();
    def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
    String xmlResponse = reqOperationName+"#Request"
    def reqholder = groovyUtils.getXmlHolder(xmlResponse)
    try{
        rowcount = sheet1.getRows()
        colcount = sheet1.getColumns()

        for(Row in 1..rowcount-1){

        String reqTagName = sheet1.getCell(0,0).getContents()

        def TagCount = reqholder["count(//*:"+reqTagName+")"]

        if(TagCount!=0){
            String reqTagValue = sheet1.getCell(0,Row).getContents()
            if(reqTagValue!=null && !reqTagValue.isEmpty() && reqTagValue!="")
                    {
                        reqholder = groovyUtils.getXmlHolder(xmlResponse)
                        log.info "extracted value : " + reqTagValue
                    reqholder.setNodeValue("//*:"+reqTagName, reqTagValue)
                    reqholder.updateProperty()        
                    log.info "node value : " + reqholder.getNodeValue("//*:"+reqTagName)
                    //test the request
                    testRunner.runTestStepByName(reqOperationName)
                    reqholder = groovyUtils.getXmlHolder(reqOperationName+"#Response")
                    myList.add(reqholder.getPrettyXml().toString())
                    log.info myList[Row-1]
                    }                      
        }

        }
    }
    catch (Exception e) {log.info(e)}
    finally{
        workbook.close()
    }
    Workbook existingWorkbook = Workbook.getWorkbook(new File(inputDataFileName));
    WritableWorkbook workbookCopy = Workbook.createWorkbook(new File(inputDataFileName), existingWorkbook);

    try
    {
        WritableSheet sheetToEdit = workbookCopy.getSheet(inputDataSheetName);
        WritableCell cell;
        for (int i =1;i<myList.size();i++)
        {
        def resholder = groovyUtils.getXmlHolder(myList[i])

        resTagValue1= resholder.getNodeValue("//*:productID")
        Label l = new Label(2, i+1, resTagValue1.toString());
        cell = (WritableCell) l;
        sheetToEdit.addCell(cell);

        resTagValue2= resholder.getNodeValue("//*:accountNumber")
        Label m = new Label(3, i+1, resTagValue2.toString());
        cell = (WritableCell) m;
        sheetToEdit.addCell(cell);

        resTagValue3= resholder.getNodeValue("//*:insuranceCategory")
        Label n = new Label(4, i+1, resTagValue3.toString());
        cell = (WritableCell) n;
        sheetToEdit.addCell(cell);

        resTagValue4= resholder.getNodeValue("//*:imei")
        Label o = new Label(5, i+1, resTagValue4.toString());
        cell = (WritableCell) o;
        sheetToEdit.addCell(cell);

        resTagValue5= resholder.getNodeValue("//*:handsetMake")
        Label p = new Label(6, i+1, resTagValue5.toString());
        cell = (WritableCell) p;
        sheetToEdit.addCell(cell);

        resTagValue6= resholder.getNodeValue("//*:handsetModel")
        Label q = new Label(7, i+1, resTagValue6.toString());
        cell = (WritableCell) q;
        sheetToEdit.addCell(cell);

        resTagValue7= resholder.getNodeValue("//*:insurancePolicyName")
    Label r = new Label(8, i+1, resTagValue7.toString());
    cell = (WritableCell) r;
    sheetToEdit.addCell(cell);

    resTagValue8= resholder.getNodeValue("//*:insuranceStartTimestamp")
    Label s = new Label(9, i+1, resTagValue8.toString());
    cell = (WritableCell) s;
    sheetToEdit.addCell(cell);

    resTagValue9= resholder.getNodeValue("//*:insuranceEndTimestamp")
    Label t = new Label(10, i+1, resTagValue9.toString());
    cell = (WritableCell) t;
    sheetToEdit.addCell(cell);
    }
  }
catch (Exception e) {log.info(e)}
finally{
     workbookCopy.write();
 workbookCopy.close();
 existingWorkbook.close();
}
log.info("Testing Over")

如果对您有用或对您有帮助,请告诉我。