前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gatling 之性能测试

gatling 之性能测试

作者头像
Wu_Candy
发布2022-07-04 15:16:53
8430
发布2022-07-04 15:16:53
举报
文章被收录于专栏:无量测试之道

一、创建项目

使用mvn创建项目模板

1、“cd 到你要创建这个项目的文件夹下”

2、输入:mvn archetype:generate # 加载完毕后

3、输入:gatling # 筛选出gatling的mvn原型模板

4、 输入:1 # 因为只筛选出一个,所以输入1即可

5、输入: 20 # 要安装的版本的序号",20为 gatling2.3.1

6、输入:com.klicen # groupid 组名,一般为XX.XX 第一个XX为域com、cn、org等,第二个XX为公司名称

7、输入:klicen # artifactId 坐标ID,一般为项目名称,会在当前目录创建一个同名的文件夹

8、输入:1.0 # version 版本名称

9、输入: klicen # package 包名

10、输入:Y # 确认

二、IntelliJ IDEA导入项目

1、导入项目--点击file-open-选择我们刚才新建的项目模板进行导入

2、安装scala插件,可以直接用zip 安装到本地

3、在项目src/test/scala 下创建scala class

如下示例:

package cnblogsCase

import io.gatling.core.Predef._

import io.gatling.http.Predef._

import scala.concurrent.duration._

class baidu extends Simulation{

//第一步:定义一个要方法的协议

val httpProtocol = http.baseUrl("https://www.baidu.com")

.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")

.doNotTrackHeader("1")

.acceptLanguageHeader("en-US,en;q=0.5")

.acceptEncodingHeader("gzip, deflate")

.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")

//第二步:定义要操作的步骤1,打开百度首页

val homepage=repeat(5){ //重新五次

exec(http("home page").get("/").check(status.is(200))).pause(10 seconds)

}

//第三步:定义要操作的步骤2,在百度首页搜索AI 关键字

val searchcb=repeat(5){//重新五次

exec(http("search cnblogs").get("/s").queryParam("wd","AI").check(status.is(200))).pause(10 seconds)

}

//第四步:定义场景模式

val scn=scenario("search baidu home page").exec(homepage,searchcb)

//第五步:加载场景执行

setUp(scn.inject(atOnceUsers(5)).protocols(httpProtocol))

}

4、拷贝此package 文件夹到 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

6、在列表中选择 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的变量的值至少有如下几种来源:

1、using Feeders——文件、数据库

2、extracting data from responses and saving them, e.g. with HTTP Check’s saveAs——从请求的返回值中提取和保存内容

3、manually with the Session API——用各种java提供的函数生成,缺点是可能影响一点性能

三、虚拟用户场景

例如:setUp( scn.inject( nothingFor(4 seconds)).protocols(httpConf))

1、nothingFor(duration):设置一段停止的时间;

不解释

2、atOnceUsers(nbUsers):立即注入一定数量的虚拟用户;

setUp(scn.inject(atOnceUsers(50)).protocols(httpConf))

3、rampUsers(nbUsers) over(duration):在指定时间内,设置一定数量逐步注入的虚拟用户;

setUp(scn.inject(rampUsers(50) over(30 seconds)).protocols(httpConf))

4、constantUsersPerSec(rate) during(duration):定义一个在每秒钟恒定的并发用户数,持续指定的时间;

setUp(scn.inject(constantUsersPerSec(30) during(15 seconds)).protocols(httpConf))

5、constantUsersPerSec(rate) during(duration) randomized:定义一个在每秒钟围绕指定并发数随机增减的并发,持续指定时间;

setUp(scn.inject(constantUsersPerSec(30) during(15 seconds) randomized).protocols(httpConf))

6、rampUsersPerSec(rate1) to (rate2) during(duration):定义一个并发数区间,运行指定时间,并发增长的周期是一个规律的值;

setUp(scn.inject(rampUsersPerSec(30) to (50) during(15 seconds)).protocols(httpConf))

7、rampUsersPerSec(rate1) to(rate2) during(duration) randomized:定义一个并发数区间,运行指定时间,并发增长的周期是一个随机的值;

setUp(scn.inject(rampUsersPerSec(30)to(50)during(15seconds) randomized).protocols(httpConf))

8、heavisideUsers(nbUsers) over(duration):定义一个持续的并发,围绕和海维赛德函数平滑逼近的增长量,持续指定时间(译者解释下海维赛德函数,H(x)当 x>0时返回1,x<0时返回0,x=0时返回0.5。实际操作时,并发数是一个成平滑抛物线形的曲线);

setUp(scn.inject(heavisideUsers(50) over(15 seconds)).protocols(httpConf))

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))

10、splitUsers(nbUsers) into(injectionStep1) separatedBy(injectionStep2):使用injectionStep2的注入作为周期,分隔injectionStep1的注入, 直到用户数达到nbUsers;

setUp(scn.inject(splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30)).protocols(httpConf))

请求限制(原文为Throttling)

如果你希望设置每秒钟请求的数量,而不是每秒钟的并发数,那么应该考虑使用constantUsersPerSec(…)去设置用户的到达比例。在大多数的情况下,请求都是不需要使用请求限制的,或者至少是多余的。

但在某些情况下,我们需要使用Gatling自带的throttle方法,来对请求数做一个限制。

注意

- 我们仍然需要在场景等级中注入虚拟用户。请求限制只是用来给定的场景中设置一个确定的吞吐量,以及注入的用户数量和持续时间。这就是设置了一个瓶颈,也就 是一个上限。如果没有设置了足够的用户数,则不会达到这个限制。如果注入持续的时间没有达到请求限制的设定,那么所有虚拟用户执行完毕 后,simulation会被终止。如果注入的时间超过了请求限制的设定,那么请求限制就会起作用,阻止simulation的执行。

- 请求限制可以在每个场景中进行配置,移步这里找到更多: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)

)

解释下上述代码:

simulation会限制每秒钟100个请求,持续10秒钟,然后保持住这个吞吐量并持续1分钟;接着跳到每秒钟50个请求,再保持这个吞吐量2个小时;

这个代码块中设置的请求限制如下:

- reachRps(target) in (duration):设置一个恒定的吞吐量,并持续一段时间;

- jumpToRps(target):立即将限制切换为另一个吞吐量;

- holdFor(duration):将当前的吞吐量保持一定的时间;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档