Karate Gatling性能测试中循环调用用户的实现方案咨询
解决方案
核心思路
要实现Admin仅登录一次→串行处理所有用户登录→Admin登出的流程,关键是避免Gatling默认的并行虚拟用户机制干扰全局上下文,同时利用Karate的单例调用和串行循环保证流程顺序。
方案1:基于Karate脚本的纯场景实现(推荐)
这种方式无需编写过多Scala代码,完全用Karate特性文件实现流程控制:
1. 拆分功能模块
- admin-login.feature(Admin登录获取JWT)
Feature: Admin登录 Scenario: 获取Admin的JWT Token Given url baseUrl + "/admin/login" And request { username: "admin", password: "your-admin-pass" } When method post Then status 200 And def adminJwt = response.token
- user-login.feature(单个用户登录)
Feature: 用户登录 Scenario: 用指定邮箱登录用户 Given url baseUrl + "/user/login" And request { email: "#(email)" } When method post Then status 200
- admin-logout.feature(Admin登出)
Feature: Admin登出 Scenario: 销毁Admin的JWT Token Given url baseUrl + "/admin/logout" And header Authorization = "Bearer #(adminJwt)" When method post Then status 200
2. 主流程控制脚本(main-flow.feature)
Feature: 完整性能测试流程 Scenario: 按顺序执行Admin登录→用户登录→Admin登出 # 1. 仅执行一次Admin登录,全局保留JWT * call("classpath:admin-login.feature") # 2. 读取生成的用户邮箱文件,拆分为列表 * def userEmails = read("user-emails.txt").split("\n") # 3. 逐个串行执行用户登录 * karate.forEach(userEmails, function(email) { call("classpath:user-login.feature", { email: email }) }) # 4. 执行Admin登出 * call("classpath:admin-logout.feature")
3. Gatling仿真类(MainSimulation.scala)
import com.intuit.karate.gatling.PreDef._ import io.gatling.core.Predef._ class MainSimulation extends Simulation { // 加载主流程脚本,设置仅1个虚拟用户(保证串行执行) val fullFlow = karateFeature("classpath:main-flow.feature") setUp( fullFlow.inject(atOnceUsers(1)) .protocols(karateProtocol) ) }
方案2:基于Gatling API的流程控制
如果需要更灵活的Gatling场景编排,可以用Scala代码控制流程:
import com.intuit.karate.gatling.PreDef._ import io.gatling.core.Predef._ import scala.io.Source class UserPerformanceSimulation extends Simulation { // 读取用户邮箱文件 val userEmails = Source.fromFile("user-emails.txt").getLines().toList // 仅执行一次Admin登录,全局共享JWT val adminLogin = karateFeature("classpath:admin-login.feature") val adminJwt = callSingle(adminLogin).env("adminJwt") // 用户登录场景:逐个读取邮箱执行 val userLoginScenario = scenario("用户登录") .feed(userEmails.map(email => Map("email" -> email))) .exec(karateFeature("classpath:user-login.feature")) // Admin登出场景 val adminLogout = karateFeature("classpath:admin-logout.feature").env(adminJwt) // 组装完整串行流程 val fullFlow = scenario("完整测试流程") .exec(adminLogin) .repeat(userEmails.size)(exec(userLoginScenario)) .exec(adminLogout) // 启动测试,仅1个虚拟用户保证串行 setUp( fullFlow.inject(atOnceUsers(1)) .protocols(karateProtocol) ) }
关键注意点
callSingle的作用:确保Admin登录在所有测试开始前仅执行一次,生成的JWT全局唯一,不会重复生成。- 串行执行的保证:通过设置
atOnceUsers(1),让整个流程由单个虚拟用户执行,避免Gatling默认并行导致的上下文混乱。 - 文件读取的正确性:确保
user-emails.txt路径正确,若放在resources目录下,需用classpath:user-emails.txt读取。
内容的提问来源于stack exchange,提问作者Navvi Reddy
相关产品推荐
相关产品推荐

