性能测试工具 Windows 下的 Gatling 学习笔记第一季

lyu · 2016年03月09日 · 最后由 lyu 回复于 2016年08月29日 · 4886 次阅读
本帖已被设为精华帖!

一、获取 Gatling

官网下载即可。

目录结构如图。简单来说:
bin: gatling 也就两种组件 - 录制的组件和运行的组件;这个目录里面有两种脚本,一个是运行 recorder 的,也就是录制组件启动脚本;一个是运行组件的启动脚本;
conf: 放配置文件的目录。一般情况下你想要修改一些运行参数,都可来这里搞定;
lib: 里面是一些 jar 包,gatling 的运作全靠他们了;我们仅作为使用者暂时不必去理会;
results: 测试报告目录;
target: 你启动运行组件后,gatling 会为你编译好所有的.scala 脚本,而编译后的 class 文件就会在这里;
user-files: 存放你录制后的.scala 脚本;

总的来说,用 gatling 做一次简单的测试步骤如下(忽略细节):

  1. 在 bin 里打开 recorder.bat(GUI)
  2. 录制 3.在 user-files 里针对刚录制好的.scala 文件作你想要的修改
  3. 在 bin 里打开 gatling.bat(控制台)
  4. 选择你要运行哪一个脚本,并运行 6.运行完成后,在 results 目录下查看结果

二、简单实践

1.打开 recorder
刚拿到这个工具,你肯定不会想要自己去写一个脚本,起码先录制看一下脚本是啥样。所以打开了 recorder

第一次实践过程中,除了上面图片中标出的这些,其他都暂时不用管。
2. 设置一下浏览器代理
打开你的浏览器。这里我用 FF。在 FF 的高级网络设置中,配置 “FireFox 如何连接至国际互联网"。

按照这样配置下就行了,因为 recorder 只会监听本地的 9000 端口。
3. 开始录制
回到 recorder 中,点一下 Start,随后在 FF 中访问http://www.sina.com.cn/FF 发出其他 HTTP 请求(比如导航页面什么的)。你就看得到 gatling 开始录制了。,期间不要从

4. 查看脚本

刚才的录制就归结为这样一个.scala 脚本

package sina

import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._

class HomePage extends Simulation {

    val httpProtocol = http
        .baseURL("http://asearch.alicdn.com")
        .inferHtmlResources(BlackList(""".*\.css""", """.*\.js""", """.*\.ico"""), WhiteList())

    val headers_0 = Map("Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")

    val headers_4 = Map("Accept" -> "*/*")

    val headers_284 = Map(
        "Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Pragma" -> "no-cache")

    val uri01 = "http://d6.sina.com.cn/pfpghc2"
    val uri02 = "http://idigger.qtmojo.com/s"
    val uri03 = "http://ifs.tanx.com/ifs"
    val uri04 = "d9.sina.com.cn"
    val uri05 = "http://www.sina.com.cn"
    val uri06 = "http://i.mmcdn.cn/simba/img"
    val uri07 = "d7.sina.com.cn"
    val uri08 = "http://log.mmstat.com/tanx.709"
    val uri09 = "http://i0.sinaimg.cn"
    val uri10 = "http://d2.sina.com.cn/pfpghc2"
    val uri11 = "http://rm.sina.com.cn/bj-icast/mv/cr/2016/03/250380/47762"
    ...... //此处省略好几十个uri

   val scn = scenario("HomePage")
        .exec(http("request_0")
            .get(uri05 + "/")
            .headers(headers_0)
            .resources(http("request_1")
            .get("http://" + uri45 + "/hm.gif?cc=0&ck=1&cl=24-bit&ds=1360x768&ep=77626%2C77626&et=3&fl=20.0&ja=0&ln=zh-CN&lo=0&lt=1457426038&nv=0&rnd=227026994&si=dd4738b5fb302cb062ef19107df5d2e4&st=4&su=http%3A%2F%2Fofflintab.firefoxchina.cn%2F%3Fcachebust%3D20150714&v=1.1.22&lv=2"),
            http("request_2")
            .get(uri13 + "/data.html?1457426259080")
            .headers(headers_0),
            http("request_3")
            .get(uri13 + "/ckctl.html")
            .headers(headers_0),
            http("request_4")
            .get("http://" + uri80 + "/get_ad_list/PG_514AC419D66F33?callback=lejuDataCallback")
            .headers(headers_4),
            http("request_5")
            .get(uri09 + "/home/main/index2013/0403/icon.png"),
            http("request_6")
            .get(uri25 + "/dy/deco/2013/0329/logo/LOGO_1x.png"),
            http("request_7")
            .get(uri25 + "/dy/main/icon/photoNewsLeft2.gif"),
            http("request_8")
            .get(uri29 + "/home/2014/1030/jb5.jpg"),
            http("request_9")
            .get(uri09 + "/home/main/index2013/0719/bg2.png"),
            http("request_10")
            .get(uri16 + "/www/index/12377app.png"),
            http("request_11")
            .get(uri29 + "/dy/deco/2013/0321/bg1px.png"),
            ....
            //此处省略好几百个request。门户网站请求就是多啊。

       setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}

对稍微懂点代码的测试人员,这个脚本都是简单易懂的:
1). httpProtocol 中的 BlackList 描述了你将不会录制针对 css,js 和 ico 文件的请求。
2). 录制到了几个请求头 header。
3). scenario("HomePage") 定义了这个场景的名称。默认以你的类名来命名,当然你可以改,比如改成 SinaHomePage。修改这个名字只会影响你运行该脚本后在报告中看到的名字。
4). 这个庞大的场景 “HomePage” 赋给了变量 scn。当然,你也可以把他赋值给另一个变量叫做 SinaUsers,看起来更为贴切,代码更易懂。
5). setUp(scn) 就是运行这个场景的主函数。
6). inject 为这个场景注入一些用户。这里 atOnceUsers 代表一次性一个用户来做这个操作——因为刚才录制时就是这种情况.

此时你作为初次使用者,不需要去修改其他,改下注入用户就行了。

setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol)
或者
setUp(scn.inject(rampUsers(10) over (10 seconds))).protocols(httpProtocol)

前者表示 10 个用户直接并发;后者表示 10 秒钟内线性并发 10 个用户。inject 的注入方法很多,使用的时候把
http://gatling.io/docs/2.1.7/general/simulation_setup.html
当作手册查查,一目了然。
这里就选择第二种方式继续测试。
5. 运行脚本
bin\gatling.bat
运行后短暂等待一下,gatling 会编译 user-files\simulation 里存在的所有脚本:

可以看到已经编译成功。前面 6 个是 gatling 自带的脚本。编号 6 是我们刚才查看并修改的脚本。cmd 中敲入 6,然后回车三下(后面的 simulation id 和 description 留空,所以直接回车)。可以看到 gatling 开始运行。

图中可以看到目前有 4 个用户已经开始运作,6 个在等待。完成后会提示报告已经生成
6. 报告一览




要针对 gatling 的 report 进行详尽透彻的分析,并正确评价系统,甚至找出性能瓶颈,这个可能要些功底 (我还不够),此处我也就不班门弄斧了,以后再把我能理解的一些东西单独发文。
从这个报告中可以看出:
1). 其实并不是录制出来的所有请求都要执行——脚本需要维护和修改。
2). 每一个 request 可以在脚本中修改为易懂的通俗表示从而方便报告的阅读和分析,而不是 request_1,2 3 这样
7. 文件结构
在这份笔记中还想提一下文件的结构。如果所有的.scala 脚本都放置在\user-files\simulations 中某一个包的根目录下,一旦项目变得庞大,自然是不好维护。所以我想要尝试像 java 那样,将脚本以包的形式放置,比如 com.sina.uitest, com.sina.apitest ....

尝试把刚才的脚本放到\user-files\simulations\sina\pages 下,看编译后会不会命名为 sina.pages.HomePage

在 target 目录查看,事与愿违,编译后都是放在根目录下了:

继续尝试,在文件中改包名 package sina 改为 package sina.pages
清空 target 文件夹重新编译,果然成功。


看来 gatling 不会在意你本身的目录结构,包名是在脚本中定义的。如果有一个类似于 Eclipse 的 SCALA IDE,那将会非常便于性能测试脚本的开发和维护: 可以在 conf\gatling.conf 中修改配置

directory {
      #data = user-files/data               # Folder where user's data (e.g. files used by Feeders) is located
      #bodies = user-files/bodies           # Folder where bodies are located
      #simulations = user-files/simulations # Folder where the bundle's simulations are located
      #reportsOnly = ""                     # If set, name of report folder to look for in order to generate its report
      #binaries = ""                        # If set, name of the folder where compiles classes are located: Defaults to GATLING_HOME/target.
      #results = results                    # Name of the folder where all reports folder are located
    }

将 simulations 前方的 # 去掉,然后定义你自己项目的位置。gatling 就会从你指定的地方去编译你的项目并执行了

本文只是个人的学习记录,并非教程。分享也只是为了尽可能的帮助刚接触这个工具的同行入门;也希望有擅长性能测试领域的朋友能够提点一二。

共收到 18 条回复 时间 点赞

整理的很好, 先收藏。有空一定好好看看。

很详尽的记录,晚上准备看看
感觉界面和 jmeter 有点像

听说图形报告比较完善,公司也打算从 Grinder 换到 Gatling 上

请问大神,我这边进行了浏览器代理调协 。但这样会导致需要访问的网站无法打开。这个问题应该怎么解决呢?

lyu #15 · 2016年03月23日 Author

#4 楼 @nimo 要做录制操作,必须把浏览器的端口打到 gatling 监听的端口上,才能记录请求。 什么叫做走网页代理不能访问成功?不是太能理解。

#5 楼 @jet
就是设置了 FF 了代理后,再去访问网址,提示,Firefox 尝试与您指定的代理服务器连接时被拒绝。
你是怎么能访问的呢。

lyu #7 · 2016年03月23日 Author

#6 楼 @nimo 这是我发的另一个笔记 , 你可以看一下能不能帮到你

lyu #12 · 2016年03月23日 Author

#6 楼 @nimo 如果你是录制 https 的页面,可以看下上面那篇。

或者你是这种情况?

#8 楼 @jet
不是录制 HTTPS,是 HTTP,只是自己搭的测试环境,一个内网 IP。我访问时,没有提示添加安全例外。

lyu #10 · 2016年03月23日 Author

#9 楼 @nimo 你在浏览器配置好代理后,要把 recorder 启动起来(相当于把代理服务器启动起来)。 你确定你的 Recorder 启动(点击 Start)后,也是这种情况?

#10 楼 @jet 是的,已经启了,点击 start,然后录制不到脚本。因为根本就没有办法通过 9000 端口代理去访问,要测试地址。所以无法捕获相关的信息。

lyu #12 · 2016年03月23日 Author

#11 楼 @nimo 额,如果能够确定 gatling 的 recorder 上配置好了 9000 端口,并且已经 start;FF 配置到 9000, 这样也都无法访问的话。我觉得你可以:

  1. 尝试访问其他站点,看能否正常访问。若不能,查看一下 9000 端口是否被其他进程占用?
  2. 如果确定以上这些都是没有任何问题的,找 Google 帮忙。。
  3. 如果急着要做测试,就暂时放弃 recorder 吧,用 har converter 做脚本,一样的。 上面我给的那文章里也大概说了下怎么用。

#12 楼 @jet 好的,谢谢,我试一下 har converter 吧。

下载的最新的版本,点击 recorder.bat。。报错了:
io/gatling/recorder/GatlingRecorder : Unsupported major.minor version 52.0

解决了,java 版本不一致,贴出对应的 java 版本:
Java 版本的主版本号如下:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

匿名 #16 · 2016年06月02日

运行脚本 bin/gatling.bat .报错:!
我的版本:

楼主有处理办法没?

只有录制脚本时才需要设置浏览器的端口号,运行脚本的时候是不用设置浏览器,甚至不用打开浏览器的,对吗?

lyu #18 · 2016年08月29日 Author

#17 楼 @wqq_helen 录制的时候要将代理打到 gatling 的监听端口上,所以要设置。运行的时候不需要。

陈恒捷 通过 IDE 建立 Gatling 性能测试项目 中提及了此贴 03月20日 15:54
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册