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

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)
  )
}

关键注意点

  1. callSingle的作用:确保Admin登录在所有测试开始前仅执行一次,生成的JWT全局唯一,不会重复生成。
  2. 串行执行的保证:通过设置atOnceUsers(1),让整个流程由单个虚拟用户执行,避免Gatling默认并行导致的上下文混乱。
  3. 文件读取的正确性:确保user-emails.txt路径正确,若放在resources目录下,需用classpath:user-emails.txt读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:13:10