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

如何在Gatling 3.8.4中基于Java创建自定义扩展?

Gatling 3.8.4 Java自定义扩展实现步骤

一、环境准备

  • 项目中引入Gatling核心及Java API依赖,Maven配置如下:
<dependency>
    <groupId>io.gatling</groupId>
    <artifactId>gatling-core</artifactId>
    <version>3.8.4</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.gatling</groupId>
    <artifactId>gatling-java-api</artifactId>
    <version>3.8.4</version>
    <scope>test</scope>
</dependency>

Gradle配置:

testImplementation 'io.gatling:gatling-core:3.8.4'
testImplementation 'io.gatling:gatling-java-api:3.8.4'

二、自定义Action(核心执行单元)

Action是Gatling模拟用户行为的最小执行单元,Java实现需适配Scala底层接口:

  1. 继承AbstractAction实现自定义逻辑
import io.gatling.core.action.AbstractAction;
import io.gatling.core.action.Action;
import io.gatling.core.session.Session;

public class CustomAction extends AbstractAction {

    private final Action next;
    private final String customParam;

    public CustomAction(Action next, String customParam) {
        super(next);
        this.next = next;
        this.customParam = customParam;
    }

    @Override
    public void execute(Session session) {
        // 自定义业务逻辑:比如调用外部服务、修改Session属性
        System.out.println("执行自定义Action,参数:" + customParam);
        Session updatedSession = session.set("customAttr", "customValue");
        // 传递Session到下一个Action
        next.execute(updatedSession);
    }
}
  1. 实现ActionBuilder供DSL调用
import io.gatling.core.action.Action;
import io.gatling.core.action.builder.ActionBuilder;
import scala.collection.immutable.Map;
import scala.concurrent.ExecutionContext;
import scala.concurrent.duration.FiniteDuration;

public class CustomActionBuilder implements ActionBuilder {

    private final String customParam;

    public CustomActionBuilder(String customParam) {
        this.customParam = customParam;
    }

    @Override
    public Action build(Action next, Map<String, FiniteDuration> throttles, ExecutionContext ec) {
        return new CustomAction(next, customParam);
    }

    // 暴露DSL方法,简化调用
    public static CustomActionBuilder customAction(String param) {
        return new CustomActionBuilder(param);
    }
}
  1. 在Simulation中使用自定义Action
import io.gatling.javaapi.core.Simulation;
import static io.gatling.javaapi.core.CoreDsl.*;
import static your.package.CustomActionBuilder.customAction;

public class CustomActionSimulation extends Simulation {

    {
        scenario("自定义Action测试场景")
                .exec(customAction("测试参数"))
                .exec(session -> {
                    System.out.println("Session自定义属性值:" + session.getString("customAttr"));
                    return session;
                });

        setUp(
                scenario("自定义Action测试场景").injectOpen(atOnceUsers(1))
        );
    }
}

三、自定义Check(响应校验逻辑)

针对HTTP请求的响应自定义校验,步骤如下:

  1. 实现HttpCheck接口
import io.gatling.core.check.CheckResult;
import io.gatling.core.session.Session;
import io.gatling.http.check.HttpCheck;
import io.gatling.http.response.Response;

public class CustomHttpCheck implements HttpCheck {

    private final String expectedContent;

    public CustomHttpCheck(String expectedContent) {
        this.expectedContent = expectedContent;
    }

    @Override
    public CheckMaterializer<? extends Check<Response>, Response, ?, ?> materializer() {
        return HttpCheck.DefaultMaterializer.instance();
    }

    @Override
    public CheckResult check(Session session, Response response) {
        // 自定义校验逻辑:检查响应体是否包含指定内容
        boolean isMatch = response.body().string().contains(expectedContent);
        if (isMatch) {
            return CheckResult.success(session);
        } else {
            return CheckResult.failure("响应体未包含预期内容:" + expectedContent, session);
        }
    }

    // 暴露DSL方法
    public static CustomHttpCheck customCheck(String expected) {
        return new CustomHttpCheck(expected);
    }
}
  1. 在HTTP请求中使用自定义Check
import io.gatling.javaapi.core.Simulation;
import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.http;
import static io.gatling.javaapi.http.HttpDsl.status;
import static your.package.CustomHttpCheck.customCheck;

public class CustomCheckSimulation extends Simulation {

    {
        http("自定义校验测试请求")
                .get("https://example.com")
                .check(status().is(200))
                .check(customCheck("Example Domain"));

        setUp(
                scenario("自定义校验测试场景").injectOpen(atOnceUsers(1))
        );
    }
}

四、关键注意事项

  • 处理Scala与Java的互操作:可使用scala.jdk.CollectionConverters进行集合类型转换
  • 保证自定义组件线程安全:Gatling是高并发场景,避免使用非线程安全的变量
  • 调试时可通过session.log()或打印日志追踪执行流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:05:32