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没有提供 ...
随机推荐
- 大规模机器学习(Large Scale Machine Learning)
本博客是针对Andrew Ng在Coursera上的machine learning课程的学习笔记. 目录 在大数据集上进行学习(Learning with Large Data Sets) 随机梯度 ...
- 推荐系统(Recommender Systems)
本博客是针对Andrew Ng在Coursera上的machine learning课程的学习笔记. 目录 基于内容的推荐(Content-based recommendation) 问题表述 问题范 ...
- Leetcode——回溯法常考算法整理
Leetcode--回溯法常考算法整理 Preface Leetcode--回溯法常考算法整理 Definition Why & When to Use Backtrakcing How to ...
- pywin32解析office文档
from win32com.client import Dispatch xlApp = Dispatch("Excel.Application") xlApp.Visible = ...
- 使用Keras进行深度学习:(二)CNN讲解及实践
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 现今最主流的处理图像数据的技术当属深度神经网络了,尤其是卷积神经网 ...
- nginx 配置反向代理解决请求跨域问题
server { listen ; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; roo ...
- 调试 node.js 程序
调试 node.js 程序 在程序开发中,如何快速的查找定位问题是一项非常重要的基本功.在实际开发过程中,或多或少都会遇到程序出现问题导致无法正常运行的情况,因此,调试代码就变成了一项无法避免的工作. ...
- Git之旅
ithub安装,我选择的是windows下的版本. git配置用户信息 安装完成后,还需要最后一步设置,在命令行输入: $git config --global user.name "You ...
- Python数据库之数据库基本操作
安装(基于centos) yum -y install mariadb mariadb-server # centos7版本 yum -y install mysql mysql-server #ce ...
- 第一个AWK程序的尝试
为了统计API的访问,需要读取8个G的数据,所以学习了下文本处理神器,AWK.简单实例如下: # 以\t分割的文本 awk -F "\t" ' //获取小时的函数 function ...