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

Karate Gatling如何模拟多账号同时登录负载测试

多用户同时登录负载测试实现方案

问题描述

需要开展多用户同时登录的负载测试,当前通过Scenario Outline配置登录凭证会导致串行执行,无法满足多账号同时登录的需求。现有示例仅配置3个测试账号,实际需测试100个账号的同时登录,如何实现该场景?

原Feature文件

Feature: Login for users

  Scenario Outline: login for -  <accountNumber>
   
    * def myAccountNumber = <accountNumber>
    * def myCardNumber = <cardNumber>

Given url baseUrl+'/session/loginchallenge?accountNumber='+myAccountNumber+'&cardNumber='+myCardNumber
And header Authorization = call read('classpath:basic-auth.js'){ username: '#(username)', password: '#(password)' }
When method GET
Then status 200

 Examples:
      | accountNumber | cardNumber |
      | 491081000     | 123        | 
      | 106807111     | 999        | 
      | 102005222     | 090        | 

原Scala文件

import com.intuit.karate.gatling.PreDef._
import io.gatling.core.Predef._

import scala.concurrent.duration.DurationInt
import scala.language.postfixOps

class PerfPushDevicesBulk extends Simulation {

  before {
    println("Perf tests started")
  }

 
  val getTest1 = scenario("Login  for 100 different users").exec(karateFeature("classpath:features/Performance/LoginPerformance.feature"))
 
  setUp(

    getTest1.inject(atOnceUsers(1))
  

  ).assertions(
    global.responseTime.max.lt(2000)

  )

  after {
    println("Perf tests ended")
  }
}

解决方案

核心逻辑

Scenario Outline的Examples是串行遍历数据的,不适合并发场景。要实现多账号同时登录,需让每个Gatling虚拟用户独立获取唯一账号,通过Gatling的Feeder机制分配数据源即可。

步骤1:准备账号数据源

创建accounts.json文件放在项目classpath下,存入100个账号数据:

[
  {"accountNumber": "491081000", "cardNumber": "123"},
  {"accountNumber": "106807111", "cardNumber": "999"},
  {"accountNumber": "102005222", "cardNumber": "090"},
  // 补充剩余97个账号数据...
]

步骤2:修改Feature文件

去掉Scenario Outline,改用普通Scenario,直接使用Gatling传入的账号变量:

Feature: Login for users

  Scenario: Concurrent login with unique account
    * def myAccountNumber = accountNumber
    * def myCardNumber = cardNumber

    Given url baseUrl + '/session/loginchallenge?accountNumber=' + myAccountNumber + '&cardNumber=' + myCardNumber
    And header Authorization = call read('classpath:basic-auth.js'){ username: '#(username)', password: '#(password)' }
    When method GET
    Then status 200

步骤3:调整Scala配置并发用户

通过Gatling Feeder分配账号,同时启动100个虚拟用户:

import com.intuit.karate.gatling.PreDef._
import io.gatling.core.Predef._

import scala.concurrent.duration.DurationInt
import scala.language.postfixOps

class PerfPushDevicesBulk extends Simulation {

  before {
    println("Perf tests started")
  }

  // 加载账号数据源,queue模式保证每个账号仅被使用一次
  val accountFeeder = jsonFile("accounts.json").queue

  val getTest1 = scenario("Login for 100 different users")
    .feed(accountFeeder) // 为每个虚拟用户分配唯一账号
    .exec(karateFeature("classpath:features/Performance/LoginPerformance.feature")
      .set("accountNumber", "${accountNumber}")
      .set("cardNumber", "${cardNumber}"))
 
  setUp(
    getTest1.inject(atOnceUsers(100)) // 同时启动100个并发用户
  ).assertions(
    global.responseTime.max.lt(2000)
  )

  after {
    println("Perf tests ended")
  }
}

关键说明

  • 若需循环使用账号(比如压测时长超过100次登录),将queue改为circular即可
  • Gatling Feeder会自动为每个虚拟用户分配独立账号,彻底解决串行执行问题
  • 后续扩展账号数量只需修改accounts.json,无需调整测试逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:16:01