无论是性能测试还是自动化测试,有一个很重要的点就是变量(参数化),因为真实环境是很少同时产生并发很高而且所有参数都一模一样的请求的,就算有这样的接口,开发肯定用缓存来挡了,这种一般不会是瓶颈,真正瓶颈并发同一个接口不同参数的情况,这种情况是无法缓存的,只能打在数据库或者程序上,往往就是瓶颈所在。所以进行性能测试时,用对参数进行变量赋值很重要,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. c++第七周学习小结

    时间过得好快,一下就上了好多节c++的课了.我们现在新学了控制语句和函数,这对我来说有点难.老师上课的时候ppt过得有些快,自己会跟不上,所以以后上课前要预习充分.在经过同学和搜索引擎帮助后,我完成了 ...

  2. qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory

    执行 qmake -v 出现错误:qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or di ...

  3. 修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码

    https://www.jianshu.com/p/554b9575c5da Windows下修改MySql 5.6的字符集,根据网上提供的方法.就是修改my.ini配置文件,然后增加几个字段就可以了 ...

  4. VisualStudioCode中用dotnet命令创建多个ASP.NET Core 项目、类库、控制台程序,并添加应用间的引用

    一.准备工作 首先安装VisualStudioCode并且可以使用. 1.首先新创建空的MyApps文件夹,作为项目主目录,下面将在这个文件夹中创建多个web应用程序.类型.控制台程序等. 2.打开V ...

  5. MySQL的GTID复制与传统复制的相互转换

    主库:192.168.225.128:3307从库1:192.168.225.129:3307 Gtid作为5.6版本以来的杀手级特性,却因为不支持拓扑结构内开关而饱受诟病.如果你需要从未开启GTID ...

  6. php中pcntl_fork详解

    pcntl_fork()函数是php-pcntl模块中用于创建进程的函数.(不支持windows) 至于php_pcntl扩展如何安装开启这里就不介绍了,只分析pcntl_fork()这个函数本身. ...

  7. Mysql集群原理

    一. 主从复制概述  在实际生产中,数据的重要性不言而喻,提供安全可靠的数据保障是技术与运维部门的职责所在:如果我们的数据库只有一台服务器,那么很容易产生单点故障的问题,比如这台服务器访问压力过大而没 ...

  8. [LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  9. ElasticSearch 随笔

     1.如何用亚马逊S3存储一个ES服务索引.http://t.cn/R0fAJwK 2.ELK实战 - 利用Nginx日志分析API耗时.http://t.cn/R6sgQfU 3.Kibana中的地 ...

  10. MVC模式笔记

    参见:https://martinfowler.com/eaaCatalog/modelViewController.html 企业应用架构模式(P of EAA)第14章Web表现模式第一节MVC笔 ...