无论是性能测试还是自动化测试,有一个很重要的点就是变量(参数化),因为真实环境是很少同时产生并发很高而且所有参数都一模一样的请求的,就算有这样的接口,开发肯定用缓存来挡了,这种一般不会是瓶颈,真正瓶颈并发同一个接口不同参数的情况,这种情况是无法缓存的,只能打在数据库或者程序上,往往就是瓶颈所在。所以进行性能测试时,用对参数进行变量赋值很重要,Gatling本身基于Scala写的,支持JAVA库,所以它的用例既可以支持scala语法,又能使用java的海量函数,简直强大到不行,只可惜我对scala和java都不懂,所以只能简单说一说Gatling中变量的用法了。
  要使用变量就要搞清楚“从哪里来,到哪里去”的问题。
  从哪里来
  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提供的函数生成,缺点是可能影响一点性能
  前面两种,大家用的时候参考官网说明就可以了,我这里只说说第三种。
  到哪里去
  以http请求为例,变量可以用的地方一般是被请求的URL,请求体,但是其他协议的请求肯定不止这两种。
  代码
  本例是实现对某个http请求进行测试,要求body、url都包含随机数。注释很多,都是因为我对scala和java不熟导致的,将就着看吧。。。

package computerdatabase

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import java.util.concurrent.ThreadLocalRandom //引用java的库,用于生成随机数 class BasicSimulation extends Simulation {
def getRand(i: Int) : String = ThreadLocalRandom.current.nextInt(i).toString//定义一个生成随机数的函数
var randnum = getRand(100000000)//定义一个常规意义的“变量”,后来发现没什么卵用
val httpConf = http
.baseURL("http://192.168.0.11") // Here is the root for all relative URLs
.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") val headers_1 = Map("Content-Type" -> "application/x-www-form-urlencoded") val scn = scenario("Hello Gatling") // A scenario is a chain of requests and pauses //.exec( session => session.set("RAND", getRand(100000000) ) )// 这才是定义“变量”,在Gatling中用变量就好像把它们作为属性或者元素一样,注意,不能用randnum代替getRand(100000000),否则这个就只会计算一次。
.exec(_.set("RAND", getRand(100000000) ) )//这样写也可以,可怕的scala语法
.exec(_.set("r", "\r" ) )//"""...."""中的换行符是\n,如果要加\r,则也得这么用“变量”的方式做,"""里不能反转义。。。
.exec(
http("post's example") // Here's an example of a POST request
.post("/api/getconf.json?mid=${RAND}&ver=1.0")//在URL中用变量,如果${RAND}在一次请求中被调用多次,每次的结果也是一样的,而jmeter的函数则会每次都变化
//.post("/api/getconf.json?mid="+getRand(100000000)+"&ver=1.0")//如果这样写,字符串+函数返回值,这样的话getRand(100000000)就只会计算一次了
.headers(headers_1)
.body(StringBody("""{
"audit_control_list" : [],
"sd" : [ "sd_settings",${RAND}]
}""")).asJSON
//在body中使用变量,因为用了"""..."""来包含字符串,所以它里面用其他比如getRand(100000000)之类的结果都是直接输出这个字符串而已
//.body(StringBody(_=>getRand(100000000)+"dsds"))//如果要在body中做字符串拼接,这样就可以,也可以用.concat,scala的语法。_ =>这个符号表示scala的模式匹配表达式,是为了让每次循环时都计算新的随机数,它的用法实在搞不定。。。
//.body(StringBody("dsds"+_=>getRand(100000000)))//反过来这样写就不行
//.body(StringBody("dsds${RAND}"))//用变量也可以 //.queryParam("name" ,_=>getRand(100000000))//或者单独作为参数写也可以,如果写成getRand(100000000),那么测试时只会生成一次随机数
.queryParam("name" ,"${RAND}")//用变量当然可以,本文出自360肥狐测试,转载时请注明出处
	  )
setUp(
scn.inject(
atOnceUsers(10)
).protocols(httpConf)
)
}

  在使用Gatling的过程中我发现老外早就把它研究透了,而国内连它的中文帮助都没有,实在可惜,希望有能者把它的官网帮助翻译成中文,造福人民啊,呵呵。
  Gatling官网帮助:http://gatling.io/#/docs
  Gatling的谷歌论坛:https://groups.google.com/forum/#!topic/gatling/8KVMX8k1eD8  

Gatling实战(三)的更多相关文章

  1. coreseek实战(三):全文搜索在php中应用(使用api接口)

    coreseek实战(三):全文搜索在php中应用(使用api接口) 这一篇文章开始学习在php页面中通过api接口,使用coreseek全文搜索. 第一步:综合一下前两篇文章,coreseek实战( ...

  2. Python爬虫实战三之实现山东大学无线网络掉线自动重连

    综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...

  3. Thrift RPC实战(三) thrift序列化揭秘

    本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace ...

  4. miniFTP项目实战三

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  5. 应用程序框架实战三十八:项目示例VS解决方案的创建(一)

    进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的 ...

  6. 应用程序框架实战三十六:CRUD实战演练介绍

    从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...

  7. 【SSH项目实战三】脚本密钥的批量分发与执行

    [SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...

  8. C# Redis实战(三)

    三.程序配置 在C# Redis实战(二)中我们安装好了Redis的系统服务,此时Redis服务已经运行. 现在我们需要让我们的程序能正确读取到Redis服务地址等一系列的配置信息,首先,需要在Web ...

  9. 汽车之家汽车品牌Logo信息抓取 DotnetSpider实战[三]

    一.正题前的唠叨 第一篇实战博客,阅读量1000+,第二篇,阅读量200+,两篇文章相差近5倍,这个差异真的令我很费劲,截止今天,我一直在思考为什么会有这么大的差距,是因为干货变少了,还是什么原因,一 ...

随机推荐

  1. 使用Eclipse+jlink调试STM32

    使用Eclipse+JLINK调试STM32 安装eclipse + CDT. 安装交叉编译工具(工具链ARM CROSS GCC--GUN ARM http://gnuarmeclipse.sour ...

  2. What's the meaning of unqualified-id?

    catch( const std::runtime_error & e) { .... } When compile, met an error: error: expected unqual ...

  3. pip3更新后install package出现ImportError: cannot import name 'main'

    linux下pip3更新后,install包出现main不能导入的情况: bear@bear:~/eclipse-workspace/Python-toolbox$ pip3 install pycr ...

  4. webpack 知识点

    安装 webpack npm install -g webpack npm install -g webpack-cli@2.x 初始化项目 npm init -y npm install --sav ...

  5. day27:反射和双下方法

    1, # 面向对象的三大特性:继承,多态和封装 # 继承: # 单继承: **** # 父类(超类,基类) # 子类(派生类) 派生方法和派生属性 # 子类的对象在调用方法和属性:先用自己的,自己没有 ...

  6. Django ORM存储datetime 时间误差8小时问题

    今天使用django ORM 将获取到的时间入库,并未出现问题,但是后来发现时间晚了8小时,经查询Django官方文档发现获取本地时间和UTC时间有差别. 首先科普下:UTC是协调世界时 UTC相当于 ...

  7. 周末没事干就看CSS JS Python ThinkPHP的书,照着例子运行就行,可以增强信心(www.delphihtmlcomponents.com 是神器,也可以帮助我学习。还有虚拟机运行Web)

    https://www.javatpoint.com/javascript-tutorialhttps://www.javatpoint.com/html-tutorialhttps://www.ja ...

  8. Luogu5155 [USACO18DEC]Balance Beam

    题目链接:洛谷 这道题看起来是个期望题,但是其实是一道计算几何(这种题太妙了) 首先有一个很好的结论,在一个长度为$L$的数轴上,每次从$x$处出发,不停地走,有$\frac{x}{L}$的概率从右端 ...

  9. 关于SSD Trim功能

    TRIM指令是微软联合各大SSD厂商所开发的一项技术,属于ATA8-ACS规范的技术指令.   TRIM是告诉NAND闪存固态存储设备要擦除哪些数据的SATA接口指令.当相关页面的数据可以被覆盖时,操 ...

  10. 将分支推送到远程存储库时遇到错误: Git failed with a fatal error. TaskCanceledException encountered.

    解决:https://blog.csdn.net/dw33xn/article/details/79951714 修改下配置文件即可