zoukankan      html  css  js  c++  java
  • Gatling的进阶一

    转载:http://www.51testing.com/html/10/26810-852966.html

    首先 抄袭一个Gatling的介绍

    Gatling是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等,除此之外它拥有以下特点:
    • 支持Akka Actors 和 Async IO,从而能达到很高的性能
    • 支持实时生成Html动态轻量报表,从而使报表更易阅读和进行数据分析
    • 支持DSL脚本,从而使测试脚本更易开发与维护
    • 支持录制并生成测试脚本,从而可以方便的生成测试脚本
    • 支持导入HAR(Http Archive)并生成测试脚本
    • 支持Maven,Eclipse,IntelliJ等,以便于开发
    • 支持Jenkins,以便于进行持续集成
    • 支持插件,从而可以扩展其功能,比如可以扩展对其他协议的支持
    • 开源免费

    Gatling适用的场景包括:测试需求经常改变,测试脚本需要经常维护;测试环境的客户机性能不强,但又希望发挥硬件的极限性能;能对测试脚本进行很好的版本管理,并通过CI进行持续的性能测试;希望测试结果轻量易读等。

    是thoughtworks的工程师对其的描述,懒的自己写了。

    跑起来之后,就需要研究一下到底怎么写和怎么录制了。

    第一,gatling使用的是Scala语言,网站说学起来不难,给出的学习地址是http://twitter.github.io/scala_school/

    国内的教学网站http://www.scalachina.com/

    不过我自己习惯了直接跳过往后看,先知道所以然,然后再去知道然

    直接拿示例看:

    package foo.bar (1)
    import com.excilys.ebi.gatling.core.Predef._ (2)
    import com.excilys.ebi.gatling.http.Predef._
    import com.excilys.ebi.gatling.jdbc.Predef._
    import Headers._
    import akka.util.duration._
    import bootstrap._
    import assertions._

    class SimulationWithFollowRedirect extends Simulation { (3)
    //你的代码从这里开始
      val scn = scenario("我的场景")
            .exec(http("我的页面")             
            .get("http://mywebsite.com/page.html")) (4)

       setUp(scn.users(10)) (5)
    // 代码结束
    }

    1. 包的写法没啥特殊
    2. 这个是唯一必须的引入,要不然,啥也跑不起来
    3. 所有的类都是集成了Simulation这个类,类的定义很标准化
    4. val是保留关键字,用来定义你的测试场景, 类似 def的用法
    5. 从这里开始就是你自定义的场景列表了

    教程说,所有的demo基于http://excilysbank.gatling.cloudbees.net,可惜我连不上。有条件的自己下载,部署一个:https://github.com/excilys/excilys-bank

    然后使用Recoder就可以进行场景录制了,然后得到用于回放的scala文件,如何使用Recorder,请参考另外一篇文章

    我们拿自带的 BasicExampleSimulation.scala 作为示例

    我们可以看到,该文件主要包含了如下几个部分

    1. HTTP protocol configuration 
    最重要的是定义了使用那个地址作为base URL,并且作为一个Scala value定义好以后,可以在simulation中直接调用,语法是:
    val httpProtocol = http
          .baseURL("http://excilys-bank-web.cloudfoundry.com")

    2. Headers 定义
    Header是作为一个Scala Map来定义的。在这里,你可以定义每个request(请求)在发送给server时使用的header。 这这里预先定义之后,就可以在scenario中使用。虽然看起来把common的header定义出来没什么意思,实际上,这也是变相添加测试压力和模拟真实用户操作的必要方法。语法是:val headers_1 = Map(....)

    3. scenario (场景)定义
    在simulation之前需要定义好执行的场景,因为:在同一个simulation中可以同时包含多个scenario。作为一个Scala value, 语法是:val scn = scenario("场景的名字") ...

    scenario主要的结构就是由exec和pause组成。exec用于描述要执行什么操作,pause用例模拟用户的思考时间

    val scn = scenario("Login action")
      .group("Login"){
         exec(
             http("request_3")    
               .post("/login")
               .headers(headers_3)
               .param("username", "user1")
               .param("password", "password1")
               )
         .pause(1 milliseconds, 100 milliseconds)
         .exec( ...)
         .pause(...)
         }
         ... ...

    上面的示例可以看到,exec要执行的操作是一个http,该http操作的名字是request_3,基于base URL采用了post方式发出请求,并附带了两个参数param。其中的header就是在headers里预先定义好的headers_3。然后执行了一个pause的操作来模拟用户的think time

    如果exec太长,或者你想结构化一下代码,可以用这种方法:
    val chain_1 = exec(...)...
    val chain_2 = exec(...)...
    val scn = scenario("My Scenario")
          .exec(chain_1)
          .exec(chain_2)

    4. simulation (模拟操作)定义

    simulation中的操作是通过setUp来定义的,users标明实际并发的用户数

    setUp(scn.inject(ramp(3 users) over (10 seconds)))
       .protocols(httpProtocol)
       .assertions(
         global.successfulRequests.percent.is(100), details("Login" /"request_3").responseTime.max.lessThan(2000))

    通过assertion来进行断言,scn来标识执行的场景, httpProtocal来标识HTTP protocol配置

    ramp (users) over (times)是指在多长时间内触发多少个指定用户
    注意 
    ramp(3 users) over (10 seconds) 等同于scn.users(3).ramp(10)

  • 相关阅读:
    Android Broadcast
    Android 向服务器发送XML数据及调用webservice
    Android ViewPager相册横向移动
    Android 启动模式
    SQL Server忘记sa用户密码处理方案
    ArcGIS 10的色带重复问题
    隐藏TabControl中的TabPage
    ArcMap工具箱中的工具不全,工具带有“锁”图标问题
    ArcEngine开发——根据图层名称获取对应图层
    获取本地网络中可用的SQL Server实例信息
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/6061705.html
Copyright © 2011-2022 走看看