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) }
关键修改点说明
- 删掉了错误的
scenario1/scenario2/scenario3定义,不再试图在场景内部调用inject()。 - 把所有负载注入逻辑移到
setUp()中,直接给基础场景userScenario绑定不同的负载模式。 - 每个场景分支通过
.protocols()指定HTTP基础配置(也可以提前定义全局HTTP配置复用)。 - 移除了无效的
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
相关产品推荐
相关产品推荐

