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

    转自:https://blog.csdn.net/weixin_38810239/article/details/79941964 在实际项目中,我们经常需要将日期在String和Date之间做转化, ...

  2. linux安装杀毒软件

    https://www.cnblogs.com/bingo1024/p/9018212.html

  3. SHA256的总结与Go实现

    SHA256在线验证链接:SHA256 online hash function My Golang github源码 :https://github.com/kumataahh/Golang-too ...

  4. 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化

    遍历二叉树   traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...

  5. LeetCode 705 Design HashSet 解题报告

    题目要求 Design a HashSet without using any built-in hash table libraries. To be specific, your design s ...

  6. Java安装及基础01

    Java特性: (1)java语言是面向对象的语言 (2)编译一次,到处运行(跨平台) (3)高性能 配置环境变量: JAVA命名规则: (1)常量命名规则:每个字母都大写(POEPLE_PRE_NO ...

  7. Custom Window

    public class CustomWnd : System.Windows.Window { static CustomWnd() { DefaultStyleKeyProperty.Overri ...

  8. zabbix源码安装实例

    环境 系统                 Centos7 zabbix版本      Zabbix 3.4.15 (revision 86739) zabbix源码安装 .tar.gz cd zab ...

  9. Shell脚本创建的文件夹末尾有两个问号怎么回事?

    原因:Linux系统的换行符是"\r\n",Windows上的换行符是"\n",Windows上编写shell脚本上传Linux,Linux无法正确识别&quo ...

  10. python集合set相关操作

    定义: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型 创建集合 1 s = {1,2,3,4,5,6,7,8} 1.定义可变集合 1 2 3 >>> set_test ...