在 Gatling 场景和模拟之间传递参数
Passing arguments between Gatling scenarios and simulation
我目前正在创建一些 Gatling 模拟来测试 REST API。我不太懂Scala。
我创建了一个包含多个 exec 和 pause 的场景;
object MyScenario {
val ccData = ssv("cardcode_fr.csv").random
val nameData = ssv("name.csv").random
val mobileData = ssv("mobile.csv").random
val emailData = ssv("email.csv").random
val itemData = ssv("item_fr.csv").random
val scn = scenario("My use case")
.feed(ccData)
.feed(nameData)
.feed(mobileData)
.feed(emailData)
.feed(itemData)
.exec(
http("GetCustomer")
.get("/rest/customers/${CardCode}")
.headers(Headers.headers)
.check(
status.is(200)
)
)
.pause(3, 5)
.exec(
http("GetOffers")
.get("/rest/offers")
.queryParam("customercode", "${CardCode}")
.headers(Headers.headers)
.check(
status.is(200)
)
)
}
我有一个简单的模拟:
class MySimulation extends Simulation {
setUp(MyScenario.scn
.inject(
constantUsersPerSec (1 ) during (1)))
.protocols(EsbHttpProtocol.httpProtocol)
.assertions(
global.successfulRequests.percent.is(100))
}
我要模拟的应用程序是一个多位置移动应用程序,因此我为每个区域设置(美国、法国、意大利...)准备了一组示例数据
我的 REST API 处理所有语言环境,因此我想让模拟同时执行多个 MyScenario 实例,每个实例都有不同的语言环境样本,以模拟全局负载。
是否可以执行我的模拟而不必 create/duplicate 场景并更改 val ccData = ssv("cardcode_fr.csv").random 每个一个?
此外,每个地区都有自己的负载,我如何创建一个模拟,采用单个场景并使用不同的负载和馈线同时执行多次?
提前致谢。
根据你所说的,我认为这可能是一个很好的方法:
首先对您的数据进行分组,以便您可以根据当前区域设置查找要发送的每个项目。为此,我建议使用一个映射,该映射将语言环境字符串(例如 "FR")匹配到与您要填写的字段的语言环境相匹配的项目。然后,在每次迭代开始时在这种情况下,您只需从列表中选择要用于当前迭代的语言环境。它看起来像这样:
val locales = List("US", "FR", "IT")
val names = Map( "US" -> "John", "FR" -> "Pierre", "IT" -> "Guillame")
object MyScenario {
//These two lines pick a random locale from your list
val random_index = rand.nextInt(locales.length);
val currentLocale = locales(random_index);
//This line gets the name
val name = names(currentLocale)
//Do the rest of your logic here
}
这是一个非常简化的示例 - 您必须弄清楚您实际想要如何从文件中检索数据并将其放入 Map 结构中,因为我假设您不想对每个项目进行硬编码对于代码中的每个字段。
我目前正在创建一些 Gatling 模拟来测试 REST API。我不太懂Scala。
我创建了一个包含多个 exec 和 pause 的场景;
object MyScenario {
val ccData = ssv("cardcode_fr.csv").random
val nameData = ssv("name.csv").random
val mobileData = ssv("mobile.csv").random
val emailData = ssv("email.csv").random
val itemData = ssv("item_fr.csv").random
val scn = scenario("My use case")
.feed(ccData)
.feed(nameData)
.feed(mobileData)
.feed(emailData)
.feed(itemData)
.exec(
http("GetCustomer")
.get("/rest/customers/${CardCode}")
.headers(Headers.headers)
.check(
status.is(200)
)
)
.pause(3, 5)
.exec(
http("GetOffers")
.get("/rest/offers")
.queryParam("customercode", "${CardCode}")
.headers(Headers.headers)
.check(
status.is(200)
)
)
}
我有一个简单的模拟:
class MySimulation extends Simulation {
setUp(MyScenario.scn
.inject(
constantUsersPerSec (1 ) during (1)))
.protocols(EsbHttpProtocol.httpProtocol)
.assertions(
global.successfulRequests.percent.is(100))
}
我要模拟的应用程序是一个多位置移动应用程序,因此我为每个区域设置(美国、法国、意大利...)准备了一组示例数据
我的 REST API 处理所有语言环境,因此我想让模拟同时执行多个 MyScenario 实例,每个实例都有不同的语言环境样本,以模拟全局负载。
是否可以执行我的模拟而不必 create/duplicate 场景并更改 val ccData = ssv("cardcode_fr.csv").random 每个一个?
此外,每个地区都有自己的负载,我如何创建一个模拟,采用单个场景并使用不同的负载和馈线同时执行多次?
提前致谢。
根据你所说的,我认为这可能是一个很好的方法:
首先对您的数据进行分组,以便您可以根据当前区域设置查找要发送的每个项目。为此,我建议使用一个映射,该映射将语言环境字符串(例如 "FR")匹配到与您要填写的字段的语言环境相匹配的项目。然后,在每次迭代开始时在这种情况下,您只需从列表中选择要用于当前迭代的语言环境。它看起来像这样:
val locales = List("US", "FR", "IT")
val names = Map( "US" -> "John", "FR" -> "Pierre", "IT" -> "Guillame")
object MyScenario {
//These two lines pick a random locale from your list
val random_index = rand.nextInt(locales.length);
val currentLocale = locales(random_index);
//This line gets the name
val name = names(currentLocale)
//Do the rest of your logic here
}
这是一个非常简化的示例 - 您必须弄清楚您实际想要如何从文件中检索数据并将其放入 Map 结构中,因为我假设您不想对每个项目进行硬编码对于代码中的每个字段。