如何在Karate中接收Java API的多值/数组及传递Excel读取的WSDL与XML请求
我来帮你搞定这两个问题,结合你已经在Java端完成Excel读取的前提,给你具体的实现方案:
一、传递WSDL路径和XML请求两个独立参数
你之前已经掌握了单个值的传递方式,要传两个参数其实很简单,只要在Java方法里定义多参数输入,然后在Karate中直接传入对应变量即可:
Java端代码示例
package com.org.utilities; public class APIHelperClass { // 接收WSDL路径和XML请求两个参数,可根据你的需求处理后返回结果 public static String processWsdlRequest(String wsdlPath, String xmlRequest) { // 这里可以加入你的业务逻辑,比如基于WSDL校验XML、生成请求等 return "处理后的响应结果"; } }
Karate Feature文件调用示例
# 假设你已经通过Java读取Excel,把WSDL路径和XML请求存入以下变量 * def targetWsdl = "从Excel读取的WSDL路径" * def requestXml = "从Excel读取的XML请求内容" # 引入Java工具类 * def APIHelperClass = Java.type('com.org.utilities.APIHelperClass') # 直接传入两个参数调用方法 * def processResult = APIHelperClass.processWsdlRequest(targetWsdl, requestXml) # 后续可使用processResult做断言或其他操作 * print "处理结果:", processResult
如果需要传递更多参数,或者想让参数结构更清晰,也可以把WSDL和XML封装成一个Java DTO对象,在Karate中直接传递对象实例,调用时通过.访问属性即可。
二、从Java API获取值数组/列表
如果Excel里有多行数据(比如多组WSDL+XML请求),你可以让Java方法返回数组或List集合,Karate原生支持直接操作Java集合,下面分两种常见场景说明:
场景1:Java返回数组/List,在Karate中遍历处理
Java端代码示例
package com.org.utilities; import java.util.List; import java.util.ArrayList; public class APIHelperClass { // 返回多组WSDL+XML数据,用List<Object[]>存储每行数据 public static List<Object[]> getBatchExcelData() { List<Object[]> batchData = new ArrayList<>(); // 模拟从Excel读取的多行数据,每个数组元素是[WSDL路径, XML请求] batchData.add(new Object[]{"wsdl_path_1", "<xml>请求内容1</xml>"}); batchData.add(new Object[]{"wsdl_path_2", "<xml>请求内容2</xml>"}); return batchData; } // 也可以返回自定义对象的List,可读性更强 public static List<ExcelRequest> getBatchRequestObjects() { List<ExcelRequest> requestList = new ArrayList<>(); requestList.add(new ExcelRequest("wsdl_path_1", "<xml>请求内容1</xml>")); requestList.add(new ExcelRequest("wsdl_path_2", "<xml>请求内容2</xml>")); return requestList; } // 自定义DTO类,用于封装每组请求数据 public static class ExcelRequest { private String wsdlPath; private String xmlContent; public ExcelRequest(String wsdlPath, String xmlContent) { this.wsdlPath = wsdlPath; this.xmlContent = xmlContent; } // 提供getter方法,Karate才能访问属性 public String getWsdlPath() { return wsdlPath; } public String getXmlContent() { return xmlContent; } } }
Karate端调用与遍历示例
* def APIHelperClass = Java.type('com.org.utilities.APIHelperClass') // 方式1:处理Object[]类型的List * def batchData = APIHelperClass.getBatchExcelData() * batchData.forEach(item => { def currentWsdl = item[0] def currentXml = item[1] print "当前处理:WSDL=", currentWsdl, ",XML请求=", currentXml // 这里可以加入你的接口调用逻辑,比如: // Given url currentWsdl // And request currentXml // When method post // Then status 200 }) // 方式2:处理自定义对象的List(可读性更好) * def requestObjects = APIHelperClass.getBatchRequestObjects() * requestObjects.forEach(obj => { print "WSDL路径:", obj.wsdlPath, ",XML内容:", obj.xmlContent // 同样可以在这里执行接口请求逻辑 })
场景2:把数组传递给子Feature文件使用
如果需要把数组数据传递给另一个Feature文件复用,可以通过call关键字传入:
主Feature文件
* def APIHelperClass = Java.type('com.org.utilities.APIHelperClass') * def batchRequestData = APIHelperClass.getBatchRequestObjects() // 调用子Feature,把数组数据传进去 * call read('batch-process.feature') { requestList: batchRequestData }
子Feature文件(batch-process.feature)
Feature: 批量处理WSDL请求 Scenario Outline: 处理每组请求数据 Given url <wsdlPath> And request <xmlContent> When method post Then status 200 Examples: | requestList |
Karate会自动把requestList中的每个对象拆分成Scenario Outline的参数,自动遍历执行所有用例。
内容的提问来源于stack exchange,提问作者Karunagara
相关产品推荐
相关产品推荐

