You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate框架:如何通过字段从JSON数组获取对象并完成断言

解决方案:动态断言无序数组中的指定模块字段

核心思路是通过moduleNumero字段值精准过滤目标对象,摆脱对数组索引的依赖,再针对过滤后的对象验证certificate字段的存在性。以下是不同测试工具/语言的实现示例:

1. Postman 测试脚本

先解析响应体,封装一个根据moduleNumero获取模块的函数,再逐一断言:

// 解析API响应JSON
const responseBody = pm.response.json();

// 根据moduleNumero查找目标模块
function getModule(numero) {
    return responseBody.moduleList.find(module => module.moduleNumero === numero);
}

// 获取三个目标模块
const module1 = getModule(1);
const module2 = getModule(2);
const module3 = getModule(3);

// 执行断言
pm.test("模块1必须包含certificate字段", () => {
    pm.expect(module1).to.have.property("certificate");
});
pm.test("模块2必须包含certificate字段", () => {
    pm.expect(module2).to.have.property("certificate");
});
pm.test("模块3必须不包含certificate字段", () => {
    pm.expect(module3).to.not.have.property("certificate");
});

2. Python(PyTest + Requests)

利用生成器表达式快速定位目标模块,再做字段存在性断言:

import requests
import pytest

def test_module_certificate_requirements():
    # 发送请求并解析响应
    resp = requests.get("你的API接口地址")
    resp_body = resp.json()
    module_list = resp_body["moduleList"]

    # 按moduleNumero过滤目标模块
    module1 = next(m for m in module_list if m["moduleNumero"] == 1)
    module2 = next(m for m in module_list if m["moduleNumero"] == 2)
    module3 = next(m for m in module_list if m["moduleNumero"] == 3)

    # 验证字段规则
    assert "certificate" in module1, "模块1缺少certificate字段"
    assert "certificate" in module2, "模块2缺少certificate字段"
    assert "certificate" not in module3, "模块3不应包含certificate字段"

3. Java(JUnit + RestAssured)

通过Stream API过滤数组元素,定位目标模块后验证字段:

import io.restassured.RestAssured;
import io.restassured.path.json.JsonPath;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class ModuleApiTest {
    @Test
    public void verifyCertificateFields() {
        // 获取并解析API响应
        JsonPath jsonPath = RestAssured.get("你的API接口地址").jsonPath();
        List<Map<String, Object>> moduleList = jsonPath.getList("moduleList");

        // 查找目标模块
        Optional<Map<String, Object>> module1Opt = moduleList.stream()
                .filter(m -> 1 == (Integer) m.get("moduleNumero"))
                .findFirst();
        Optional<Map<String, Object>> module2Opt = moduleList.stream()
                .filter(m -> 2 == (Integer) m.get("moduleNumero"))
                .findFirst();
        Optional<Map<String, Object>> module3Opt = moduleList.stream()
                .filter(m -> 3 == (Integer) m.get("moduleNumero"))
                .findFirst();

        // 先确保模块存在,再验证字段
        assert module1Opt.isPresent() : "未找到moduleNumero=1的模块";
        assert module2Opt.isPresent() : "未找到moduleNumero=2的模块";
        assert module3Opt.isPresent() : "未找到moduleNumero=3的模块";

        Map<String, Object> module1 = module1Opt.get();
        Map<String, Object> module2 = module2Opt.get();
        Map<String, Object> module3 = module3Opt.get();

        assert module1.containsKey("certificate") : "模块1缺少certificate字段";
        assert module2.containsKey("certificate") : "模块2缺少certificate字段";
        assert !module3.containsKey("certificate") : "模块3不应包含certificate字段";
    }
}

关键注意点

  • 若API可能返回重复moduleNumero的模块,需根据业务场景调整过滤逻辑(比如用filter而非findFirst,再验证所有匹配模块的字段规则)。
  • 断言时建议添加自定义错误信息,方便快速定位问题。

内容的提问来源于stack exchange,提问作者Alexis G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:42:39