如何创建Karate测试验证WSDL文件 解决响应匹配类型不匹配报错
问题背景
需要通过比对接口响应与本地基准文件内容的方式,校验WSDL接口契约未发生变更,初始编写的Karate测试脚本如下:
Scenario: Get demo.wsdl Given path '/demo' And param wsdl = 'demoLookup.wsdl' When method get Then status 200 # note how we focus only on the relevant part of the payload and read expected XML from a file # And print 'response: ', response * def expected = read('expected-demo.wsdl') And match response contains expected
脚本执行后抛出如下报错:
match failed: CONTAINS / | data types don't match (XML:LIST) [60,119,115,100,108,58,100,101,10....
初步判断当前写法的匹配逻辑不被框架支持,需要寻找可实现原始文件匹配的替代方案。
报错原因
报错核心是两边待匹配的数据类型不一致:
- Karate默认会根据响应头的Content-Type自动把返回内容解析为XML结构化对象,WSDL内容因为存在多级同级节点,会被识别为XML节点列表(即报错里的
XML:LIST类型) - 直接通过
read('expected-demo.wsdl')读取的本地文件未指定读取格式时,默认和结构化解析后的响应类型不匹配,且contains操作符仅支持同类型结构化数据的包含校验,无法直接完成全量文件匹配。
可行替代方案
根据对校验严格度的要求,三选一即可:
方案1:逐字节全量匹配(最严格,推荐用于契约强管控场景)
完全不做结构化解析,直接比对原始响应字节和本地文件字节,任何内容差异(包括空格、换行、注释、属性顺序)都会被识别出来,最适合契约不允许任何变更的校验场景。
将脚本中匹配相关的两行替换为以下代码即可:
# 以二进制字节格式读取本地基准WSDL文件 * def expected = read('expected-demo.wsdl', 'binary') # 用内置的responseBytes(原始响应字节数组)做全等匹配 * match responseBytes == expected
方案2:纯文本匹配(宽松度适中,忽略结构化解析差异)
将响应和本地文件都按指定编码转为纯文本后做全等比对,不会因为XML解析规则差异导致类型报错,可通过统一编码规避BOM头、特殊字符转义导致的误判。
替换匹配逻辑为以下代码:
# 统一指定编码为UTF-8 * configure charset = 'UTF-8' # 以UTF-8文本格式读取本地基准文件 * def expected = read('expected-demo.wsdl', 'utf-8') # 用内置的responseAsString(原始响应字符串)做全等匹配 * match responseAsString == expected
方案3:XML语义匹配(最宽松,忽略无意义格式差异)
如果允许WSDL存在空格、换行、属性顺序这类不影响契约逻辑的格式差异,可以把两边都统一为XML结构化对象后做全等匹配,注意不要用contains(contains仅用于匹配部分子节点,全量契约校验用全等即可)。
替换匹配逻辑为以下代码:
* def expected = read('expected-demo.wsdl') # 手动指定将响应转为XML类型,避免被识别为节点列表 * xml response = response * match response == expected
注意事项
- 本地基准文件
expected-demo.wsdl建议直接从稳定版本的接口导出,不要手动编辑,避免引入无关的格式差异 - 用字节/文本匹配时,注意统一文件的换行符格式(Windows端保存文件默认用CRLF,服务端返回一般是LF),避免无意义的用例失败
内容的提问来源于stack exchange,提问作者Mark Diskin
相关产品推荐
相关产品推荐

