一、创建项目
使用mvn创建项目模板
请进入您计划创建项目的文件夹。
2、输入:mvn archetype:generate # 加载完毕后
您可以使用以下 Maven 命令来筛选出 gatling 的 Maven 原型模板:
“`shell
mvn archetype:generate -Dfilter=gatling
“`
这样可以根据输入的 gatling 来筛选出相应的 Maven 原型模板。
输入一个即可,因为只筛选出一个。
输入: 在选择安装的版本时输入 20,对应的版本是 gatling2.3.1。
输入: com.klicen # groupid The group name, usually in the format of XX.XX, where the first XX represents the domain (e.g. com, cn, org) and the second XX represents the company name.
输入: `mkdir klicen` # 创建坐标ID对应的文件夹,并且命名为与坐标ID相同
输入:v1.0 # version 版本名称
package klicen 是什么类型的包?
10、输入:Y # 确认
可以按照以下步骤在IntelliJ IDEA中导入项目:
1. 打开IntelliJ IDEA开发工具。
2. 点击菜单栏中的“File”(文件)选项。
3. 选择“Open”(打开)或者“Open Project”(打开项目)。
4. 在弹出的对话框中,浏览并选择项目所在的文件夹。
5. 点击“OK”以打开项目。
通过这些步骤,你就可以在IntelliJ IDEA中成功导入你的项目。
请点击“文件”-“打开”-选择刚才新建的项目模板来导入项目。
要安装Scala插件,你可以通过将插件的zip文件直接安装到本地来完成。
请在项目的src/test/scala目录下创建一个Scala类。
如下示例:
package cnblogsCase
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class postdemo extends Simulation{
val url="https://XXXXXXX.com"
val path="/path/confirm"
val content="{\"date\":\"20190123\"}"
val headers_json=Map{"Content-Type"->"application/json"}
val dates=csv("test.csv").random
val httpConf=http.baseUrl(url)
val scn=scenario("post json of api")
.feed(dates)
.exec(
http("post api")
.post(path)
.headers(headers_json)
.check(status.is(200))
.body(StringBody("{\"date\":\"${times}\"}"))
)
}
上面的代码示例里实现了一个 post 方法来请求一个 API,并且设置了请求的格式以及返回的状态。
请将这个文件夹拷贝到E:\All\gatling\gatling-exe\user-files\simulations下。
5、在E:\All\gatling\gatling-exe\bin 下执行 gatling.bat 文件
E:\All\gatling\gatling-exe\bin>gatling.bat
GATLING_HOME is set to "E:\All\gatling\gatling-exe"
JAVA=""D:\Program Files\Java\jdk1.8.0_131\\bin\java.exe""
Choose a simulation number:
[0] cnblogsCase.baidu
[1] computerdatabase.BasicSimulation
[2] computerdatabase.advanced.AdvancedSimulationStep01
[3] computerdatabase.advanced.AdvancedSimulationStep02
[4] computerdatabase.advanced.AdvancedSimulationStep03
[5] computerdatabase.advanced.AdvancedSimulationStep04
[6] computerdatabase.advanced.AdvancedSimulationStep05
我选择列表中的第 0 项,即 `[0] cnblogsCase.baidu,我们写好的脚本`。
7、可以查看报告:如下:
Simulation cnblogsCase.baidu completed in 104 seconds
Parsing log file(s)...
Parsing log file(s) done
Generating reports...
Global Information
> request count 36 (OK=36 KO=0 )
> min response time 18 (OK=18 KO=- )
> max response time 1106 (OK=1106 KO=- )
> mean response time 518 (OK=518 KO=- )
> std deviation 288 (OK=288 KO=- )
> response time 50th percentile 573 (OK=573 KO=- )
> response time 75th percentile 671 (OK=671 KO=- )
> response time 95th percentile 991 (OK=991 KO=- )
> response time 99th percentile 1100 (OK=1100 KO=- )
> mean requests/sec 0.346 (OK=0.346 KO=- )
Response Time Distribution
> t < 800 ms 31 ( 86%)
> 800 ms < t < 1200 ms 5 ( 14%)
> t > 1200 ms 0 ( 0%)
> failed 0 ( 0%)
或
Gatling的变量的值可以从以下几种来源获取:
使用数据源——文件和数据库
从响应中提取数据并保存,比如可以使用 HTTP Check 中的 saveAs 功能。
使用Session API来进行手动操作,虽然可以利用Java提供的各种函数来生成,但缺点是可能会稍微影响性能。
三、虚拟用户场景
例如: 使用`setUp`方法设置模拟场景,并在其中注入`nothingFor(4 seconds)`的行为,使用`protocols`方法指定使用`httpConf`协议。
nothingFor(duration):指定一个持续时间期间内停止处理任何内容。
2、atOnceUsers(nbUsers):立即注入一定数量的虚拟用户;
使用以下代码来设置50个并发用户,并将协议设置为“httpConf”:
“`scala
setUp(scn.inject(atOnceUsers(50)).protocols(httpConf))
“`
在指定时间内,通过rampUsers(nbUsers) over(duration)方法,可以逐步增加虚拟用户数量,实现逐步注入的效果。
使用以下代码来设置并发用户数为50,在30秒内启动:
“`scala
setUp(
scn.inject(rampUsers(50) during(30 seconds))
).protocols(httpConf)
“`
在指定的时间段内,定义一个恒定的每秒并发用户数。
使用以下代码来设置每秒常量用户数为30,持续时间为15秒,并使用httpConf作为协议:
“`scala
setUp(
scn.inject(constantUsersPerSec(30) during(15 seconds))
.protocols(httpConf)
)
“`
在指定的持续时间内,创建一个随机增减并发的过程,其并发数围绕着给定的每秒固定并发数在波动。
配置每秒30个常量用户注入,并在15秒内随机化注入,使用HTTP协议。
在一定时间内,逐渐增加并发用户数,增长速度符合规律性的变化。
“`
val userNum=50
val rampTime=15
val protocol=httpConf
setUp(scn.inject(rampUsers(userNum) during(rampTime seconds)).protocols(protocol))
“`
定义一个并发用户数,每秒逐渐增加至指定值,持续一段时间,增长速率呈随机变化。
setUp(scn.inject(rampUsersPerSec(30)to(50)during(15seconds) randomized).protocols(httpConf))
定义一个持续的并发量,其增长受到海维赛德函数平滑逼近的影响,在指定的时间内不断增加。在此过程中,海维赛德函数是一种特殊的曲线函数,当 x 大于 0 时返回 1,小于 0 时返回 0,等于 0 时返回 0.5。因此,在实际操作中,并发数会按照平滑抛物线形状逐渐增加。
使用Scala语言编写性能测试时,可以使用以上代码来设置每秒钟模拟50个用户访问系统,持续15秒。同时使用HTTP协议。
9、splitUsers(nbUsers) into(injectionStep) separatedBy(duration):定义一个周期,执行injectionStep里面的注入,将nbUsers的请求平均分配;
setUp(scn.inject(splitUsers(50) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds)).protocols(httpConf))
将用户数量(nbUsers)进行拆分,使用injectionStep2的注入作为周期,分隔injectionStep1的注入,直到用户数达到nbUsers。
rampUsers(10) over(10 seconds).inject(splitUsers(100)).separatedBy(atOnceUsers(30)).protocols(httpConf)
请求限制是一种控制和限制网络请求频率的技术手段,它可以防止网络流量过载,并保护服务器免受滥用。
如果您希望限制每秒钟的请求数量而不是并发数,可以考虑使用constantUsersPerSec(…)方法来设置用户到达的速率。在大多数情况下,不需要使用请求限制,或者至少是多余的。
在特定情况下,我们会需要利用Gatling自带的throttle方法,来限制请求的数量。
注意:
我们仍然需要在场景中引入虚拟用户。请求限制被用来在特定场景中设置确定的吞吐量、用户数量和持续时间。这相当于设定了一个瓶颈,即一个上限。如果没有设置足够的用户数,那么便无法达到这个限制。如果注入持续的时间未达到请求限制的设定,那么在所有虚拟用户执行完毕后,模拟将被终止。相反,如果注入的时间超过了请求限制的设定,那么请求限制将会生效,阻止模拟的执行。
可以在每个场景中配置请求限制,详细信息请参考:http://gatling.io/docs/2.1.7/general/scenario.html#scenario-throttling
setUp(scn.inject(constantUsersPerSec(100) during(30 minutes))).throttle(
reachRps(100) in (10 seconds),
holdFor(1 minute),
jumpToRps(50),
holdFor(2 hours)
)
解释下上述代码:
我们在模拟中对每秒的请求进行了限制。在10秒内,我们限制每秒钟只有100个请求,并在接下来的1分钟内保持这个吞吐量。然后我们将限制每秒钟50个请求,并在接下来的2个小时内保持这个吞吐量。
这段代码块中所设置的请求限制如下:
在一段时间内达到目标吞吐量。
切换到指定的另一个吞吐量。
保持持续一段时间的吞吐量:holdFor(duration)。
如若转载,请注明出处:https://www.zhangfen6.com/42802.html