Gatling:登录后循环请求如何从独立随机Feeder拉取数据
结论
你提出的整套Gatling场景逻辑完全可以通过原生Feeder机制实现,循环内逐次拉取独立Feeder参数的核心实现非常简单:只需要将feed()操作直接嵌入repeat循环的执行块内部,每次循环触发时都会独立从绑定的Feeder中拉取一条新数据,写入当前虚拟用户的会话上下文,供后续HTTP请求的表达式引用。
修正后的可运行代码实现
// 原有Feeder定义部分保持不变 val userFeeder = csv("users.csv") // pages.csv需包含对应uri字段,随机模式配置保持不变 val randomPagesFeeder = csv("pages.csv").random object login { val dologin = exec( http("login page") .get("/login") .headers(standardHeaders) ) .exec( http("post login form") .post("/loginaction") .headers(standardHeaders) .formParam("loginid", "${loginid}") .formParam("password", "${password}") ) } object randompages { val visitrandom = repeat(10) { // 核心实现:将Feeder拉取操作嵌入循环内部 feed(randomPagesFeeder) .exec( http("randompage") .get("${uri}") // 引用pages.csv中与列名匹配的参数即可 ) } } def myload() = { feed(userFeeder) .exec(login.dologin) .exec(randompages.visitrandom) } val scn = scenario("My scenario").exec(myload()) setUp( scn.inject(rampUsers(userCount).during(userWarmup.toInt seconds)) ).protocols(httpProtocol)
关键逻辑说明
- 全局用户数据拉取:
feed(userFeeder)位于流程最外层,每个虚拟用户启动时仅拉取一次账号、密码数据,完成登录后这组用户数据会保留在用户会话中,贯穿后续所有执行步骤。 - 循环内随机参数拉取:
feed(randomPagesFeeder)嵌在repeat循环块内,每一次循环迭代都会触发一次独立的Feeder拉取操作,从配置了随机选择模式的Feeder中抽取一条新的页面URI,写入当前会话供后续请求引用。 - 注意避坑点:
- 不要将
feed(randomPagesFeeder)放到repeat循环外部,否则只会在循环启动前拉取一次随机页面数据,10次循环都会复用同一个URI,达不到每次请求随机页面的预期效果。 - Feeder拉取的参数会自动写入会话上下文,同一次迭代中的后续执行块可直接通过
${列名}的表达式语法引用,和全局Feeder的使用规则完全一致。 - 配置了
.random模式的Feeder会在所有虚拟用户间共享数据源,每次拉取时随机选取条目、不会按固定顺序遍历,非常适配随机访问类的测试场景。
- 不要将
内容的提问来源于stack exchange,提问作者dom_watson
相关产品推荐
相关产品推荐

