当前位置:   article > 正文

gatling 之性能测试_gatling constant user

gatling constant user

欢迎关注【无量测试之道】公众号,回复【领取资源】,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

一、创建项目

使用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 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的请求格式与返回状态

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):将当前的吞吐量保持一定的时间;

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

添加关注,一起共同成长吧。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/526607
推荐阅读
相关标签
  

闽ICP备14008679号