如何在加特林中为每个用户(线程运行)设置不同的协议
How to set different protocol for each user (threads running) in gatling
我正在尝试创建一个性能测试套件,其中我有一组将随机选择的 ID。对于每个 ID,都有一个指定的 auth_token 赋值。
在协议中,如果我传递随机 ID 将采用的方法,它始终将其设置为整个操作的特定 ID。
我期待这样的事情,我正在定义 10 个虚拟用户,并且对于每个用户,协议应该更改 ID 并继续场景执行。
目前Gatling在最先设置协议,10个用户都使用同一个协议
id = random.generate //generate random id
authHeader = Method(id);
def method (id:String) : String{
if(id=="id1")
return token1
else if(id=="id2")
return token2
""
}
val httpProtocol = http.baseUrl(baseURI)
.acceptHeader(header)
.authorizationHeader(authHeader)
.contentTypeHeader(contentType)
.userAgentHeader(agentHeader)
val scn1: ScenarioBuilder = scenario("name")
.exec(http("scenario1")
.post(device_context)
.body(payload)
.check(status.is(202)))
setUp(scn1.inject(atOnceUsers(2)).protocols(httpProtocol))```
In the above code i need the suite to run for 2 different id.
要完成这项工作,您将不得不使用 session 变量来保存您的 authHeader。 DSL 方法定义了只执行一次的构建器——这解释了你所看到的。
最好的方法是构建一个馈线来保存您的 ID 和身份验证令牌(我假设您没有在其他任何地方使用该 ID)
因此定义一个将密钥(只是一个字符串)映射到包含 id 和 auth 令牌的映射的馈线
//a list of strings to hold the auth tokens
private val ids = List(Map("id" -> "id1", "auth" -> "token1"), Map("id" -> "id2", "auth" -> "token2"), ...)
//the feeder to put a random token into the session
private val idFeeder = Iterator.continually(Map("id" -> Random.shuffle(ids).head))
现在,当您在 idFeeder 上调用 .feed 时,您会得到一个随机映射,该映射在 session 变量 "id"[=12= 中具有 "id" 和 "auth" 的键]
因此请更新您的场景以使用馈线并设置授权 header(并从您的协议定义中删除 .authorizationHeader)
val scn1: ScenarioBuilder = scenario("name")
.feed(idFeeder)
.exec(http("scenario1")
.header("Authorization", "${id.auth})"
.post(device_context)
.body(payload)
.check(status.is(202)))
在您的 body 中,您可以使用“${id.id}”
访问用户 ID 字符串
或者您可以更新您的协议定义以具有 ${id} 引用,但我发现在与调用 .feed
的同一块中使用馈线值更好
我正在尝试创建一个性能测试套件,其中我有一组将随机选择的 ID。对于每个 ID,都有一个指定的 auth_token 赋值。
在协议中,如果我传递随机 ID 将采用的方法,它始终将其设置为整个操作的特定 ID。
我期待这样的事情,我正在定义 10 个虚拟用户,并且对于每个用户,协议应该更改 ID 并继续场景执行。
目前Gatling在最先设置协议,10个用户都使用同一个协议
id = random.generate //generate random id
authHeader = Method(id);
def method (id:String) : String{
if(id=="id1")
return token1
else if(id=="id2")
return token2
""
}
val httpProtocol = http.baseUrl(baseURI)
.acceptHeader(header)
.authorizationHeader(authHeader)
.contentTypeHeader(contentType)
.userAgentHeader(agentHeader)
val scn1: ScenarioBuilder = scenario("name")
.exec(http("scenario1")
.post(device_context)
.body(payload)
.check(status.is(202)))
setUp(scn1.inject(atOnceUsers(2)).protocols(httpProtocol))```
In the above code i need the suite to run for 2 different id.
要完成这项工作,您将不得不使用 session 变量来保存您的 authHeader。 DSL 方法定义了只执行一次的构建器——这解释了你所看到的。
最好的方法是构建一个馈线来保存您的 ID 和身份验证令牌(我假设您没有在其他任何地方使用该 ID)
因此定义一个将密钥(只是一个字符串)映射到包含 id 和 auth 令牌的映射的馈线
//a list of strings to hold the auth tokens
private val ids = List(Map("id" -> "id1", "auth" -> "token1"), Map("id" -> "id2", "auth" -> "token2"), ...)
//the feeder to put a random token into the session
private val idFeeder = Iterator.continually(Map("id" -> Random.shuffle(ids).head))
现在,当您在 idFeeder 上调用 .feed 时,您会得到一个随机映射,该映射在 session 变量 "id"[=12= 中具有 "id" 和 "auth" 的键]
因此请更新您的场景以使用馈线并设置授权 header(并从您的协议定义中删除 .authorizationHeader)
val scn1: ScenarioBuilder = scenario("name")
.feed(idFeeder)
.exec(http("scenario1")
.header("Authorization", "${id.auth})"
.post(device_context)
.body(payload)
.check(status.is(202)))
在您的 body 中,您可以使用“${id.id}”
访问用户 ID 字符串或者您可以更新您的协议定义以具有 ${id} 引用,但我发现在与调用 .feed
的同一块中使用馈线值更好