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

Gatling Java测试:提取JSON响应首个title并保存打印

Gatling测试:提取JSON响应首个元素的Title并输出

问题描述

我用于Gatling测试的Java代码如下:

package computerdatabase;

import io.gatling.javaapi.core.ScenarioBuilder;
import io.gatling.javaapi.core.Simulation;
import io.gatling.javaapi.http.HttpProtocolBuilder;

import java.time.Duration;

import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.http;
import static io.gatling.javaapi.http.HttpDsl.status;

public class ProductSimulation extends Simulation {

HttpProtocolBuilder httpProtocol = http.baseUrl("https://dummyjson.com")
        .header("Content-Type", "application/json")
        .header("Accept-Encoding", "gzip")
        .check(status().is(200));

ScenarioBuilder scn = scenario("GetProducts")
        .exec(http("products").get("/products").body(StringBody("{}"))
                .check((jsonPath("$.*").saveAs("response"))))
        .exec(session -> {
            System.out.println(session.getString("response"));
            return session;
        });

{
    setUp(scn.injectOpen(constantUsersPerSec(1).during(Duration.ofSeconds(1)))).protocols(httpProtocol);
}
}

目前我能获取完整响应体,但希望提取JSON响应数组中第一个元素的title(示例值为"Essence Mascara Lash Princess"),并将该title保存到变量后像打印整个响应那样输出,请问该如何实现?

解决方案

只需调整jsonPath的定位表达式,精准提取目标字段并保存到Session变量即可。以下是修改后的完整代码:

package computerdatabase;

import io.gatling.javaapi.core.ScenarioBuilder;
import io.gatling.javaapi.core.Simulation;
import io.gatling.javaapi.http.HttpProtocolBuilder;

import java.time.Duration;

import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.http;
import static io.gatling.javaapi.http.HttpDsl.status;

public class ProductSimulation extends Simulation {

    HttpProtocolBuilder httpProtocol = http.baseUrl("https://dummyjson.com")
            .header("Content-Type", "application/json")
            .header("Accept-Encoding", "gzip")
            .check(status().is(200));

    ScenarioBuilder scn = scenario("GetProducts")
            .exec(http("products").get("/products").body(StringBody("{}"))
                    // 可选:保留完整响应提取(不需要可删除)
                    .check(jsonPath("$.*").saveAs("response"))
                    // 提取第一个产品的title,存入firstProductTitle变量
                    .check(jsonPath("$.products[0].title").saveAs("firstProductTitle")))
            .exec(session -> {
                // 可选:打印完整响应
                System.out.println("完整响应: " + session.getString("response"));
                // 打印提取到的首个产品title
                System.out.println("首个产品Title: " + session.getString("firstProductTitle"));
                return session;
            });

    {
        setUp(scn.injectOpen(constantUsersPerSec(1).during(Duration.ofSeconds(1)))).protocols(httpProtocol);
    }
}

关键说明

  • JSON路径定位:$.products[0].title是适配dummyjson接口的正确表达式——接口返回的产品数组嵌套在products字段下,[0]指定取数组第一个元素,.title提取该元素的title属性。
  • 变量存储:通过saveAs("firstProductTitle")将提取结果存入Gatling的Session,后续步骤可随时调用。
  • 输出逻辑:在exec步骤中用session.getString("firstProductTitle")读取变量值并打印,实现需求效果。

若不需要保留完整响应的提取,可直接删除对应的check语句和打印代码,减少资源消耗。

内容的提问来源于stack exchange,提问作者Magnus Jensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:25:59