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

Gatling Scala项目中exec重载方法无法解析问题求助

问题解决:Gatling中"Cannot resolve overloaded method 'exec'"错误

错误根源

你代码里的核心问题是混淆了场景定义和负载注入配置的边界:

  • inject() 方法返回的是 PopulationBuilder,用于在setUp()中配置用户负载模式,根本不能作为exec()的参数(exec()只接受请求、自定义动作这类ActionBuilder类型)。
  • 不能用exec()嵌套调用另一个ScenarioBuilder,场景间的组合逻辑要放在setUp()里实现,而非场景内部。

修正后的完整代码

package gatlingAssignment

import io.gatling.core.Predef._
import io.gatling.core.structure.ScenarioBuilder
import io.gatling.http.Predef._
import io.gatling.http.request.builder.HttpRequestBuilder

import scala.concurrent.duration._

class GetUsers extends Simulation {

  val baseUrl = "https://reqres.in/api"

  object HttpRequests {
    val baseUrl = "https://reqres.in/api"

    val createUserInfo: HttpRequestBuilder = http("Create user info")
      .post(baseUrl + "/users")
      .body(
        StringBody(
          """{ "name": "${name}", "job": "${job}", "id": "${id}" }"""
        )
      )
      .asJson
      .header("content-type", "application/json")
      .check(status is 201)

    val getUsers: HttpRequestBuilder = http("Get all users")
      .get(baseUrl + "/users")
      .queryParam("page", "2")
      .check(status is 200)

    val updateUserInfo: HttpRequestBuilder = http("Update user info")
      .put(baseUrl + "/users/2")
      .body(
        StringBody(
          """{ "name": "${name}", "job": "${job}", "id": "${id}" }"""
        )
      )
      .asJson
      .header("content-type", "application/json")
      .check(status is 200)
  }

  object Scenarios {
    import HttpRequests._

    val feeder = csv("src/user_data.csv").random

    // 基础业务场景:只定义用户要执行的动作流程
    val userScenario: ScenarioBuilder = scenario("User scenario")
      .feed(feeder)
      .exec(createUserInfo)
      .exec(getUsers)
      .exec(updateUserInfo)
  }

  import Scenarios._

  // 在setUp中统一配置负载模式与场景组合
  setUp(
    // 场景1:立即注入50个用户
    userScenario.inject(atOnceUsers(50)).protocols(http.baseUrl(baseUrl)),
    // 场景2:15秒内每秒恒定启动20个用户
    userScenario.inject(constantUsersPerSec(20) during (15 seconds)).protocols(http.baseUrl(baseUrl)),
    // 场景3:30秒内从每秒1个用户递增到100个
    userScenario.inject(rampUsersPerSec(1) to 100 during (30 seconds)).protocols(http.baseUrl(baseUrl))
  ).assertions(
    global.responseTime.max.lt(4000)
  ).maxDuration(1 minute)
}

关键修改点说明

  1. 删掉了错误的scenario1/scenario2/scenario3定义,不再试图在场景内部调用inject()。
  2. 把所有负载注入逻辑移到setUp()中,直接给基础场景userScenario绑定不同的负载模式。
  3. 每个场景分支通过.protocols()指定HTTP基础配置(也可以提前定义全局HTTP配置复用)。
  4. 移除了无效的chainedScenario,场景的并行/串行组合直接在setUp()里配置。

串行执行场景的补充方案

如果需要让三个负载场景按顺序执行(先跑场景1,再跑场景2,最后场景3),可以修改setUp()部分为:

setUp(
  userScenario.inject(atOnceUsers(50)).protocols(http.baseUrl(baseUrl))
    .andThen(userScenario.inject(constantUsersPerSec(20) during (15 seconds)))
    .andThen(userScenario.inject(rampUsersPerSec(1) to 100 during (30 seconds)))
).assertions(
  global.responseTime.max.lt(4000)
).maxDuration(1 minute)

内容的提问来源于stack exchange,提问作者Adii-knolder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:15:20