https://segmentfault.com/search?q=Gatling%E6%95%99%E7%A8%8B%E7%B3%BB%E5%88%97
https://segmentfault.com/a/1190000008254640
Gatling脚本的编写主要包含下面三个步骤
API开发文档
https://gatling.io/docs/current/cheat-sheet/
类必须继承 Simulation
class BasicSimulation extends Simulation {}
1.配置下head,只是简单的请求下百度首页,所以只定义下请求的base url,采用默认的http配置即可
Gatling HTTP允许您加载测试Web应用程序,Web服务或网站。它支持HTTP和HTTPS几乎所有常见浏览器的现有功能,如缓存,cookie,重定向等。
但是,Gatling 不是一个浏览器:它不会运行Javascript,不会应用CSS样式并触发CSS后台图像下载,也不会对UI事件做出反应等.Gatling在HTTP协议级别工作。
为了模仿真实的Web浏览器,Gatling可以在同一主机上获取资源时为每个虚拟用户运行多个并发连接。
默认情况下,Gatling将每个虚拟用户的每个远程主机的并发连接数限制为6,但您可以使用更改此数字。
maxConnectionsPerHost(max: Int)
Java / NIO引擎启动会在第一个要执行的请求上引入开销。为了弥补这种影响,Gatling会自动向http://gatling.io发出请求。
要禁用此功能,只需添加.disableWarmUp到HTTP协议配置定义即可。要更改热身网址,只需添加即可.warmUp("newUrl")。
val httpConf = http
.baseURL("https://www.baidu.com") //设置请求的根路径
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // 设置请求header
.doNotTrackHeader("1") //为所有请求设置DNT标头
.acceptLanguageHeader("en-US,en;q=0.5") //为所有请求设置Accept-Language标头
.acceptEncodingHeader("gzip, deflate") //为所有请求设置Accept-Encoding标头
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0") //为所有请求设置User-Agent标头
2.声明Scenario,指定我们的请求动作
scenario里的参数:scenario name
exec()里的参数就是我们的执行动作,http("本次请求的名称").get("本次http get请求的地址")
只能跑一次
val scn = scenario("BaiduSimulation").exec(http("baidu_home").get("/"))
让它持续运行一段时间或者循环一定的次数,可以使用下面两个loop方式
// repeat(times,counterName)
// times:循环次数
// counterName:计数器名称,可选参数,可以用来当当前循环下标值使用,从0开始
val scn = scenario("BaiduSimulation").repeat(100){
exec(http("baidu_home").get("/"))
}
// during(duration, counterName, exitASAP)
// duration:时长,默认单位秒,可以加单位milliseconds,表示毫秒
// counterName:计数器名称,可选。很少使用
// exitASAP:默认为true,简单的可以认为当这个为false的时候循环直接跳出,可在
// 循环中进行控制是否继续
//运行100秒 during 默认单位秒,如果要用微秒 during(100 millisecond)
val scn = scenario("BaiduSimulation").during(100){
exec(http("baidu_home").get("/"))
}
3.设置并发数并组装
//设置线程数 立马启动的用户数,可以理解为并发数
setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))
一般实际运用中远远不止于10个并发,当并发数很高时我们可以选择平滑启动可使用
rampUsers(5000) over (10 seconds) //用10秒时间,启动5000个线程 setUp(scn.inject(rampUsers(500) over(10 seconds)).protocols(httpConf)
// 1、nothingFor(4 seconds)
// 在指定的时间段(4 seconds)内什么都不干
// 2、atOnceUsers(10)
// 一次模拟的用户数量(10)。
// 3、rampUsers(10) over(5 seconds)
// 在指定的时间段(5 seconds)内逐渐增加用户数到指定的数量(10)。
// 4、constantUsersPerSec(10) during(20 seconds)
// 以固定的速度模拟用户,指定每秒模拟的用户数(10),指定模拟测试时间长度(20 seconds)。
// 5、constantUsersPerSec(10) during(20 seconds) randomized
// 以固定的速度模拟用户,指定每秒模拟的用户数(10),指定模拟时间段(20 seconds)。用户数将在随机被随机模拟(毫秒级别)。
// 6、rampUsersPerSec(10) to (20) during(20 seconds)
// 在指定的时间(20 seconds)内,使每秒模拟的用户从数量1(10)逐渐增加到数量2(20),速度匀速。
// 7、rampUsersPerSec(10) to (20) during(20 seconds) randomized
// 在指定的时间(20 seconds)内,使每秒模拟的用户从数量1(10)增加到数量2(20),速度随机。
// 8、splitUsers(10) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds)
// 反复执行所定义的模拟步骤(rampUsers(100) over(10 seconds)),每次暂停指定的时间(10 seconds),直到总数达到指定的数量(10)
// 9、splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy(atOnceUsers(30))
// 反复依次执行所定义的模拟步骤1(rampUsers(10) over(10 seconds))和模拟步骤2(atOnceUsers(30)),直到总数达到指定的数量(100)左右
// 10、heavisideUsers(100) over(10 seconds)
// 在指定的时间(10 seconds)内使用类似单位阶跃函数的方法逐渐增加模拟并发的用户,直到总数达到指定的数量(100).简单说就是每秒并发用户数递增。
返回结果
// Executions Response Time
// total:总请求次数 Min:最短请求响应时间
// OK:成功数 Max:最长请求响应时间
// KO:失败数 Mean:平均请求响应时间
// Req/s:每秒请求次数即吞吐量 Std.Dev:方差偏移,服务器性能越稳定,方差越小
// Response Time Distribution:响应时间分布
// Response Time Percentiles over Time: 百分比响应时间分布
// Number of responses per second: 每秒的响应数
// Number of requests per second: 每秒的请求数
纵轴为活跃用户数,横轴为执行响应测试的时间。
这是所有的请求在时间上的一个分布的直方图,其中纵轴为请求个数的 百分比,横轴为具体的时间单位为毫秒
整个测试周期内,每个时间段响应时间的占比情况
其中左边的纵轴为响应时间,右边的纵轴(处于1的黄线)显示的是 活跃的用户数,横轴为时间。
其中每个颜色分别代表在每个时间段 内,响应时间所占的百分比,比如在10:42:51时间中最小的相应时间为 409毫秒,
25%的请求都在409ms完成,50%的请求都在409ms内完 成,75%的请求都在409ms内完成,80%的请求都在409ms内完成,
最大的请求响应时间为409ms。在这个时间点上并发的user 为1。
每秒请求数
这个图表反应了时间点上的发送的请求数目,左边的纵轴为请求的数 目,右边的纵轴为活跃的用户数。
每秒响应数
这个图表反应了时间点上的服务器响应数,左边的纵轴为响应的数目,右边的 纵轴为活跃的用户数。