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
相关产品推荐
相关产品推荐

