Karate场景大纲中空数组元素导致JSON无效的解决方法
解决方案:处理Karate Scenario Outline中空数组元素导致的无效JSON
针对你遇到的Scenario Outline中可选数组块为空时生成空对象{}导致JSON无效的问题,以下是几种可行的解决方法:
1. 直接过滤数组中的空对象
在请求发送前,对数组进行过滤,移除所有空对象:
Scenario Outline: 测试API请求 Given url 'your-api-endpoint' And request { "denominations": [ { "amount": "<amount>", "currency": "<currency>" } ] } # 过滤空对象 * def filteredDenoms = karate.filter(request.denominations, function(item) { return !karate.isEmpty(item) }) * set request.denominations = filteredDenoms When method post Then status 200 Examples: | amount | currency | | 50 | EUR | | '' | '' |
当amount和currency为空时,filteredDenoms会变成空数组[],避免发送包含{}的无效JSON。
2. 用三元表达式动态生成数组
根据参数是否存在,决定数组是否包含元素,彻底避免空对象生成:
Scenario Outline: 测试API请求 Given url 'your-api-endpoint' And request { "denominations": "#(amount && currency ? [{amount: '<amount>', currency: '<currency>'}] : [])" } When method post Then status 200 Examples: | amount | currency | | 100 | USD | | '' | '' |
这里通过三元判断,只有当amount和currency都不为空时,才生成包含对象的数组;否则直接生成空数组。
3. 先清理对象再判断是否加入数组
如果需要保留部分非空字段的对象,可以先过滤掉空值键,再判断对象是否为空:
Scenario Outline: 测试API请求 Given url 'your-api-endpoint' # 构建原始对象并清理空值键 * def rawDenom = { amount: '<amount>', currency: '<currency>' } * def cleanedDenom = karate.filterKeys(rawDenom, (value, key) => value != null && value !== '') # 根据清理后的对象是否为空,决定数组内容 * def denominations = karate.isEmpty(cleanedDenom) ? [] : [cleanedDenom] And request { "denominations": "#(denominations)" } When method post Then status 200 Examples: | amount | currency | | 75 | GBP | | '' | CAD |
这种方式适合部分参数可能为空、部分非空的场景,确保只保留有有效数据的对象。
4. 全局转换请求体
如果多个场景都有类似问题,可以定义一个通用转换函数处理请求体:
Scenario Outline: 测试API请求 Given url 'your-api-endpoint' And request { "denominations": [ { "amount": "<amount>", "currency": "<currency>" } ] } # 应用转换函数移除空对象 * def cleanRequest = function(body) { body.denominations = body.denominations.filter(item => { return Object.keys(item).some(key => item[key] != null && item[key] !== '') }); return body; } * request = cleanRequest(request) When method post Then status 200 Examples: | amount | currency | | 200 | AUD | | '' | '' |
这个函数会遍历数组元素,只保留至少有一个非空值的对象。
内容的提问来源于stack exchange,提问作者jbart18
相关产品推荐
相关产品推荐

