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

    1.关键芯片的物理位置,明细信号流向,防止关键信号交叉,高速线布线通畅. 2.可装配,可维修,可测试. 3.模拟电路和数字电路分区摆放. 4.疏密有序. 5.原理图应该明确主芯片周边元件的布局要求. ...

  2. 自学stm32就要记住入了这个“大坑”要耐得住寂寞

    在现在的MCU使用量中,STM32绝对是翘楚!因为现在使用STM32开发产品的公司非常多,这主要得益于ST公司对自家MCU的大力推广,而且ST对自己MCU也配套了一系列开发软件,也有相应的硬件开发板供 ...

  3. 安晓辉大神的感悟:如果你发现了自己的学习模式,愿意学并且能坚持,我觉得没什么能阻挡你征服软件世界的脚步(对于开发人员来讲,最大的风险是:在职业规划上没有延续性地乱跳槽。时刻要牢记在心的:培养自己的稀缺性) good

    从技术支持中途转战软件开发,如今从事编程工作已十多有余,2014年CSDN博文大赛编程语言组冠军.CSDN Qt论坛的版主安晓辉老师从今天开始,坐镇CSDN社区问答栏目的 第十四期,届时会接受广大网友 ...

  4. 2018-2019-2 网络对抗技术 20165336 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165336 Exp4 恶意代码分析 1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或E ...

  5. python摸爬滚打之day29----socketserver实现服务端和多个客户端通信

    什么是socketserver? TCP协议下的socket实现了服务端一次只能和一个客户端进行通信, 而socketserver实现了服务端一次能和多个客户端进行通信, 底层调用的还是socket. ...

  6. 迪杰斯特拉(Dijkstra)算法描述及理解

    Dijkstra算法是一种计算单源最短无负边路径问题的常用算法之一,时间复杂度为O(n2) 算法描述如下:dis[v]表示s到v的距离,pre[v]为v的前驱结点,用以输出路径,vis[v]表示该点最 ...

  7. Redis Keys的通用操作

    keys * 显示所有key 127.0.0.1:6379> keys * 1) "sort1" 2) "l2" 3) "set2" ...

  8. javascript的ES6学习总结(第一部分)

    ES6(ESNext学习总结——第一部分) ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ECMA每年6月份,发布一个版本 201 ...

  9. day20 python常用模块

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀.     但其实import加载的模块分为四个通用类别: 1 使用pytho ...

  10. C#-----类DateTime的常用方法

    1.TryParse(string s, out DateTime result)    将日期和时间的指定字符串表示形式转换为其 System.DateTime 等效项,并返回一个指示转换是否成功的 ...