悠悠楠杉
网站页面
正文:
在自动化测试或数据处理中,嵌套列表的扁平化是高频需求。比如从API返回的JSON中提取所有ID,或遍历树形结构数据时,多层嵌套会让逻辑变得复杂。Karate作为一款集API测试、Mock服务于一体的工具,其内置的Java互操作能力能轻松解决这类问题。
假设你遇到如下嵌套结构:json
{
"orders": [
{ "items": ["A", "B"] },
{ "items": ["C", ["D", "E"]] }
]
}
若想提取所有商品项(A/B/C/D/E),直接遍历需要递归或多层循环。而扁平化能将嵌套结构“拍平”为单层列表:["A", "B", "C", "D", "E"],极大简化后续操作。
通过Karate的Java.type()调用自定义工具类:
def flattenList = """
function(items) {
var result = [];
for (var i = 0; i < items.length; i++) {
if (Array.isArray(items[i])) {
result = result.concat(flattenList(items[i]));
} else {
result.push(items[i]);
}
}
return result;
}
""";
# 调用示例
* def nested = [1, [2, [3, 4], 5]]
* def flat = flattenList(nested)
* match flat == [1, 2, 3, 4, 5]
对于大规模数据,推荐使用Java的Stream:
* def flatten = """
function(items) {
var List = Java.type('java.util.ArrayList');
var Stream = Java.type('java.util.stream.Stream');
return items.stream()
.flatMap(x -> x instanceof List ? flatten(x).stream() : Stream.of(x))
.collect(Java.type('java.util.stream.Collectors').toList());
}
""";
instanceof检查元素类型,避免无谓递归;parallelStream()提升速度。假设测试时需要验证所有订单的商品总数量:
* def response = call read('getOrders.feature')
* def allItems = flatten(response.orders..items)
* match allItems.size() == 5
通过Karate的灵活组合,原本繁琐的嵌套操作只需几行代码即可解决。这种“声明式”处理思维,正是高效自动化测试的核心所在。