Gatling脚本编写技巧篇(一)
熟悉Gatling的同学都知道Gatling脚本的同学都知道,Gatling的脚本包含三大部分:
- http head配置
- Scenario 执行细节
- setUp 组装
那么针对三部分我们需要在一套全流程测试当中把公共的部分提取出来写成Scala脚本公共类,来避免重复的工作和代码冗余:
在工程创建一个单独的目录如下图所示:

定义一个报头的基本格式:
package computerdatabase.JieOuData import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.http.config.HttpProtocolBuilder object phHttpProtocol {
implicit val noneWhiteList: io.gatling.core.filter.WhiteList = WhiteList ()
implicit
val noneBlackList: io.gatling.core.filter.BlackList = BlackList ()
implicit
val staticBlackList: io.gatling.core.filter.BlackList = BlackList (""".*\.js""", """.*\.css""", """.*\.gif""", """.*\.jpeg""", """.*\.jpg""", """.*\.ico""", """.*\.woff""", """.*\.(t|o)tf""", """.*\.png""")
implicit
val staticWhiteList: io.gatling.core.filter.WhiteList = WhiteList (""".*\.js""", """.*\.css""", """.*\.gif""", """.*\.jpeg""", """.*\.jpg""", """.*\.ico""", """.*\.woff""", """.*\.(t|o)tf""", """.*\.png""") def apply(host: String)(
implicit blackLst: io.gatling.core.filter.BlackList
, whiteLst: io.gatling.core.filter.WhiteList
): HttpProtocolBuilder = {
http.baseURL (host)
.inferHtmlResources (blackLst, whiteLst)
.acceptHeader ("application/json, text/javascript, */*; q=0.01")
.acceptEncodingHeader ("gzip, deflate")
.acceptLanguageHeader ("zh-CN,zh;q=0.9,zh-TW;q=0.8")
.doNotTrackHeader ("1")
.userAgentHeader ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")
}
}
定义报头的请求格式:
package computerdatabase.JieOuData
import io.gatling.http.config.HttpProtocolBuilder
object phHeaders {
val headers_base = Map ("Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Upgrade-Insecure-Requests" -> "1")
}
定义一个home的接口:
package com.pharbers.gatling.scenario import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.structure.ChainBuilder
import com.pharbers.gatling.base.phHeaders.headers_base object getHome {
val getHome: ChainBuilder = exec (http ("home").get ("/").headers (headers_base))
}
定义login 接口:
package com.pharbers.gatling.scenario import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.structure.ChainBuilder
import com.pharbers.gatling.base.phHeaders.headers_json object userLogin {
val feeder = csv ("loginUser.csv").random println (feeder)
val login: ChainBuilder = exec (http ("login")
.get ("/api/user/login").headers (headers_json)
.body (StringBody ("""{ "condition" : { "email" : "nhwa", "password" : "nhwa" } }""")).asJSON)
}
一个完整的脚本:
package com.pharbers.gatling.simulation import io.gatling.core.Predef._
import scala.concurrent.duration._
import com.pharbers.gatling.scenario._
import com.pharbers.gatling.base.phHttpProtocol
import com.pharbers.gatling.base.phHttpProtocol.{noneBlackList, noneWhiteList} class userLogin extends Simulation { val httpProtocol = phHttpProtocol ("http://192.168.100.141:9000")
val scn = scenario ("user_login")
.exec (getHome.getHome.pause (5 seconds), userLogin.login.pause (60 seconds)) setUp (scn.inject (rampUsers (1000) over (3 seconds))).protocols (httpProtocol)
}
这样看起来你的脚本是不是清爽很多
二、常用接口
并发量控制:
| 函数 | 解释 |
| atOnceUsers(100) | 使用100并发量测试目标服务器 |
| rampUsers(100) over (10 seconds) | 循序渐进的增大压力,在10s中内线性增加用户数达到最大压力100并发量 |
| nothingFor(10 seconds) | 等待10s |
| constantUsersPerSec(rate) during(duration) | 在指定duration内,以固定频率注入用户,每秒注入rate个用户,默认固定间隔 |
| constantUsersPerSec(rate) during(duration) randomized | 与上面不同的是用户以随机间隔注入 |
| rampUsersPerSec(rate1) to (rate2) during(duration) | 在指定duration内,以递增频率注入用户,每秒注入 rate1 ~ rate2 个用户 |
用户行为控制:
| 函数 | 解释 |
| exec() | 实际的用户行为 |
| pause(20) | 用户滞留20s,模拟用户思考或者浏览内容 |
| pause(min: Duration, max: Duration) | 用户随机滞留,滞留时间在min ~ max 之间 |
流程控制:
| 函数 | 解释 |
| repeat(time, counterName) | 内置循环器 |
| foreach(seq, elem, counterName) | foreach循环器 |
| csv("file").random | 创建填充器 |
| doIf("", "") | 判断语句 |
数据操作:
JDBC数据
jdbcFeeder("databaseUrl", "username", "password", "SELECT * FROM users")
Redis数据
import com.redis._import io.gatling.redis.Predef._
val redisPool = new RedisClientPool("localhost", 6379)
// use a list, so there's one single value per record, which is here named "foo"// same as redisFeeder(redisPool, "foo").LPOPval feeder = redisFeeder(redisPool, "foo")
// read data using SPOP command from a set named "foo"val feeder = redisFeeder(redisPool, "foo").SPOP
// read data using SRANDMEMBER command from a set named "foo"val feeder = redisFeeder(redisPool, "foo").SRANDMEMBER
文件数据
import java.io.{ File, PrintWriter }import io.gatling.redis.util.RedisHelper._
def generateOneMillionUrls(): Unit = {
val writer = new PrintWriter(new File("/tmp/loadtest.txt"))
try {
for (i <- 0 to 1000000) {
val url = "test?id=" + i
// note the list name "URLS" here
writer.write(generateRedisProtocol("LPUSH", "URLS", url))
}
} finally {
writer.close()
}}
迭代数据
import io.gatling.core.feeder._import java.util.concurrent.ThreadLocalRandom // index records by projectval recordsByProject: Map[String, Seq[Record[Any]]] =
csv("projectIssue.csv").readRecords.groupBy { record => record("project").toString } // convert the Map values to get only the issues instead of the full recordsval issuesByProject: Map[String, Seq[Any]] =
recordsByProject.mapValues { records => records.map { record => record("issue") } } // inject projectfeed(csv("userProject.csv")) .exec { session =>
// fetch project from session
session("project").validate[String].map { project => // fetch project's issues
val issues = issuesByProject(project) // randomly select an issue
val selectedIssue = issues(ThreadLocalRandom.current.nextInt(issues.length)) // inject the issue in the session
session.set("issue", selectedIssue)
}
}
Gatling脚本编写技巧篇(一)的更多相关文章
- Gatling脚本编写技巧篇(二)
脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...
- BAT脚本编写教程简单入门篇
BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on 表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...
- BAT脚本编写教程入门提高篇
BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...
- X86逆向15:OD脚本的编写技巧
本章节我们将学习OD脚本的使用与编写技巧,脚本有啥用呢?脚本的用处非常的大,比如我们要对按钮事件进行批量下断点,此时使用自动化脚本将大大减小我们的工作量,再比如有些比较简单的压缩壳需要脱壳,此时我们也 ...
- BAT脚本编写教程(比较易懂和全面)
这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人 作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...
- 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...
- 《手把手教你》系列技巧篇(十五)-java+ selenium自动化测试-元素定位大法之By xpath中卷(详细教程)
1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大. 使用这种方法几乎可以定位到页面上的任意元素. ...
- 《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)
1.简介 其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇.那是因为这个比较重要,所 ...
- 《手把手教你》系列技巧篇(五十五)-java+ selenium自动化测试-上传文件-下篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
随机推荐
- Java的集合框架综述
集合 用于存储和管理数据的实体被称为数据结构(data structure).数据结构可用于实现具有不同特性的集合对象,这里所说的集合对象可以看作一类用于存储数据的特殊对象. 集合内部可以采用某种数据 ...
- linux pdftk
部分内容来源网络,如有版权问题,请联系删除: http://xuqin.blog.51cto.com/5183168/1117780, http://blog.sina.com.cn/s/blog ...
- 知识图谱与机器学习 | KG入门 -- Part1-b 图深度学习
介绍 我们正在定义一种新的机器学习方法,专注于一种新的范式 -- Data Fabric. 在上一篇文章中,我们对机器学习给出了新的定义: 机器学习是一种自动发现Data Fabric中隐藏的&quo ...
- Java中使用RSA算法加密
Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...
- Johnson-Trotter(JT)算法求全排列
Johnson-Trotter算法描述 算法 JohnsonTrotter(n) //实现用来生成排序的 Johnson-Trotter 算法 //输入:正整数n(代表序列1,2,···,n) //输 ...
- Java 中的递归
递归 递归 一种通过调用某个方法来描述需要重复进行的操作.该方法的特点就是可以自己调用自己. 案例一 排队的问题 在生活中,我们经常需要排队.在排队中,我们怎么才能知道自己所排在第几位呢? 我们也许会 ...
- 1057 Stack (30分)(树状数组+二分)
Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...
- .NET Core项目部署到Linux(Centos7)(八)为.NET Core项目创建Supervisor进程守护监控
目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...
- Mysql主从搭建(1)
Master上授权从库: ```grant replication slave on *.* to slave1@ip identified by 'password';``` 逻辑备份: ```my ...
- SpringMVC(一):简介和第一个程序
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...