发布新日志

  • 性能测试工具Gatling - 设置Recorder

    2013-10-11 13:35:13

    利用Gatling自带的Recorder,可以大大节省我们书写scenario的时间。

    用法和selenium的IDE类似,作为一个代理服务器在browser和application之间做桥梁作用,从而将操作过程直接转换为scenario。

    1. 运行
    直接执行bin目录下的recorder.bat或者recorder.sh文件即可

    2. GUI界面
    需要配置的有 Listening Port, HTTP一个,HTTPS一个,默认都为localhost。如果需要一个远程的代理,那么就在Outgoing proxy中填写

    3. 包
    在simulation information中填写packapge和class name,那么将在指定的output目录下自动生成该包目录,和该class名的scala文件

    4. 配置浏览器
    在浏览器中,启用代理服务,将上面的代理服务信息填写

    5. 启动Recorder和Browser
    启动完毕后,就可以在浏览器中进行操作,所有的请求和反馈就在其中展现

    6. 保存
    点击保存后,所有的信息就写入上述生成的scala文件中

    7. 过滤器
    可以添加过滤器,将不需要的信息过滤掉。
    过滤器可以有两种:Java,就是用java语言描述的正则表达式
    Ant,自然语言模式。例如,过滤所有的css文件,就添加一条Ant,然后书写内容:/**/*.css

    8.录制的event
    录制的event主要是如下三种:request,pause和tag

    对于request,以请求模式|请求的URI来显示,例如:GET | http://www.ebusinessinformation.fr/

    选择一个request event,则在request和response区域中显示该请求的详细内容。而且如果request中包含了body,则会被存在另外一个文件夹request-bodies中。

    对于pause,则会自动记录实际的停留时间,可以后期根据需要进行修改
    对于tag,是为了让代码更加好理解,相当于添加的comments

  • Gatling的进阶二

    2013-10-11 13:17:58

    1. 参数化

    Gatling可以很方便使用csv文件进行参数化,例如一个用户信息表:

    /* user_information.csv */
    username,password,account_id
    user1,password1,4
    user2,password2,7
    ...
    user10,password10,34

    那么在gatling中就这样调用参数文件:

    /* Scenario */
    .feed(csv("user_information.csv")) 
    /×获取csv文件,该文件在固定的data文件夹下×/

    .exec(
      http("request_3")
        .post("/login")
        .param("username", "${username}") //参数化的用户名
        .param("password", "${password}") //参数化的密码
        .headers(headers_3)
        .check(status.is(302))
    )
    ...
    .exec(
      http("request_5")
     .get("/private/bank/account/ACC${account_id}/operations.html")//参数化的用户id
     .headers(headers_5)
    )

    2. 重复执行

    很多性能测试需要不断重复的执行同一个场景,那么loop就很必要。Gatling提供两种循环的方法:

    第一种:repeat指定的次数
    repeat(10) { // 重复执行10次
        exec( http(...) ... )
        .pause(...)
    }

    第二种:在指定的时间内重复执行直到时间结束
    .during(20 seconds) { // 在20秒内不断的执行
        exec( http(...) ... )
        .pause(...)
    }


  • Gatling的进阶一

    2013-10-10 16:07:54

    首先 抄袭一个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)

  • web性能测试的新利器 - Gatling 介绍

    2013-10-10 15:46:53

    最近发现了一个新的性能测试工具Gatling,貌似比Jmeter还好玩。这几天就先简单介绍一下。 

    该开源项目的地址是:https://github.com/excilys/gatling/wiki

    第一步,让我们看看简单的入门

    1. 下载 
    你可以选择下载 .tar.gz 或者 .zip 包:https://github.com/excilys/gatling/wiki/Downloads
    2. 解压 
    解压到任意一个目录中,网站的提示是不要放到有Programs的文件夹中,因为可能是会出现权限的问题
    3. 优化(可以跳过不看)
    如何从操作系统层面进行优化配置:https://github.com/excilys/gatling/wiki/HTTP#wiki-tuning
    4. 编码(可以跳过不看)
    默认的编码是utf-8,如果需要更改,步骤如下:
    1)在Recoder里选择你想要的编码
    2)在gatling.conf文件中修改为你选择的编码
    3)保证你使用的编辑器和保存过程中为相同的编码
    5. 执行
    直接点击bin目录下的gatling.bat文件就可以运行

    本人遇到了一个问题:-XX:+OptimizeStringConcat 这个配置项导致无法启动,原因是该选项是优化64bit的JVM。我是64bit的win 7, 但是是32 bit的jdk 删掉了该选项就正常运行了

    另外一个问题:版本2.0以上的gatling需要JDK1.7以上的版本

    6. 执行
    运行起来以后,你会看到:

    Collecting simulations...

    Choose a simulation number:

      [0] advanced.AdvancedExampleSimulation

      [1] basic.BasicExampleSimulation

    这两个是自带的例子。你可以选择其中一个进行研究。

    好了,gatling在你的机器上,可以跑起来了


  • 三十六计

    2013-05-26 13:44:13

    一时萌动,写下了这三十六计,算是个人思想的一种总结。以后有机会自己回头在看看更新一下,各位看官看看就得。
  • 测试三十六计-第三十六计-走为上计

    2013-05-26 13:41:03

    【释义】
    指战争中看到形势对自己极为不利时就逃走。现多用于做事时如果形势不利没有成功的希望时就选择退却、逃避的态度。

    我们在测试过程中的走,其实是指所有的东西都是动态的。

    敏捷测试的核心就是动态。

    需求是动态的,用例是动态的,计划是动态的,环境是动态的,资源是动态的,只有所有的一切都能在动态中去进行,才说明你的团队是敏捷的

    放弃那些静态的瀑布模型的恶习吧,那只是一副固定在墙上的山水画。
  • 测试三十六计-第三十五计-连环计

    2013-05-26 13:37:59

    【释义】
    本为元杂剧名。剧本写汉末董卓专权,王允设计,先许嫁美女貂蝉与吕布,后又献给董卓,以离间二人,致使吕布杀死董卓。后用以指一个接一个相互关联的计策。

    在我们测试过程中,如果要选取回归测试用例,或者需要开发数据驱动的测试框架,那么连环计是最有效的。

    所有的步骤,work flow和数据都是相互依赖,相互承启的,那么就能最小的cost去获得测试结果。

    尤其是数据驱动,数据依赖的测试过程,让你减少很多不必要的数据开销。
  • 测试三十六计-第三十四计-苦肉计

    2013-05-26 13:35:54

    【释义】
    故意毁伤身体以骗取对方信任,从而进行反间的计谋。

    有时候我们想用反间计,可是不知道到底哪些是错误的,那就只好苦肉计了。那就是把所有的情况都列出来,一个个的排除,肉体置顶。

    有时候,最笨的方法,就是最简单的方法。
  • 测试三十六计-第三十三计-反间计

    2013-05-26 13:31:38

    【释义】
    原指使敌人的间谍为我所用,或使敌人获取假情报而有利于我的计策。后指用计谋离间敌人引起内讧。

    这也是一个测试的策略。反向数据,就是一个例子。

    尤其有时候,你无法有足够的时间来确定正向的功能是否完善时,可以采用这个计策。

    在正面选择能够覆盖所有check point的end to end的任意一条正向数据和反向数据。

    然后把你所有能想到的正向数据和反向数据处理不了的场景列出来,然后一一举证,一旦这些场景都证明系统无缺陷,你就可以认为系统是无缺陷的了。

    核心就在于,你不知道这个是对的时候,把所有的错误的可能都排除了,那就证明它是对的。
  • 测试三十六计-第三十二计-空城计

    2013-05-26 13:28:37

    【释义】
    在敌众我寡的情况下,缺乏兵备而故意示意人以不设兵备,造成敌方错觉,从而惊退敌军之事。后泛指掩饰自己力量空虚、迷惑对方的策略。

    这个其实是一个很熟悉的测试策略。当你测试的时候,你已经把所有的功能当作是运转正常的,所以现在是空,一旦发现了bug,就知道不是空的。

    尤其是在模块集成测试时,你只有认为其它的模块都是正确的,才能去推断当前要测试的模块是否有问题。

    所以,什么时候设空,是一个很技术问题。
  • 测试三十六计-第三十一计-美人计

    2013-05-26 13:25:40

    【释义】
    此计运用此象理,是说利用敌人自身的严重缺点,己方顺势以对,使其自颓自损,己方一举得之。

    其实这是一个经验,也就是探索测试的一个起点。当你测试的项目,内容,种类,行业,等等多了起来。 你就会发现,每个行业多多少少的都有自己的一些特点。

    尤其是bug出现比较多的地方都心有了然。

    把这些东西作为经验share出去,也标志着你是一个成功的测试人员。
  • 测试三十六计-第三十计-反客为主

    2013-05-26 13:21:35

    【释义】
    本是客人却用主人的口气说话。后指在一定的场合下采取主动措施,以声势压倒别人。

    当你进入一个新的测试团队,如何更快的融入到这个团队中,那就是以这个团队的思想为思想,把自己作为这个团队的主人去相处,交流,学习。

    如果你把自己当作一个客人去融入这个团队,那么恭喜你,你从一开始就把自己当外人了,怎么融入啊

    同样,作为老人,对于新人要鼓励对方多发表意见,多参与活动,给对方一个机会,让大家成为成功的协作者
  • 测试三十六计-第二十九计-树上开花

    2013-05-26 13:18:00

    【释义】
    此计运用此理,是说弱小的部队通过凭借某种因素,改变外部形态之后,自己阵容显得充实强大了,就象鸿雁长了羽毛丰满的翅膀一样。

    这个是个态度问题,作为互相交流的各个团队,要借助别人优秀的成果,从而提高自己的能力。但是很多时候,大家都是只借入,不借出,本性。

    尤其在测试中,寻求开发团队介入测试过程,不是一件羞耻的事,反而符合敏捷的精神,双赢。
  • 测试三十六计-第二十八计-上屋抽梯

    2013-05-26 13:10:59

    【释义】
    上楼以后拿掉梯子。借指与人密谈。也用以比喻怂恿人,使人上当。

    当一个人带领团队时,如何培养自己的组员呢,这条计策很实用。要知道,在一个公司里,如果你还有上升的余地时,除了搞好领导关系,关键得给自己培养一个接班人,你上去了,team不会变,才有机会。

    所以抽掉自己的梯子之前,要先抽几个别人的梯子。没事了把几个有潜力的人逼到房顶上,然后抽掉他们的梯子,看他们摔的疼不疼,是一件很有必要的事。就当挫折教育了。 比如,在一些简单的QA 活动中,让新人去控制这些,你在旁边兜底就行。

    毕竟,一旦回头看看,这些人会感谢你的,新人不断,哪怕超过你,心理成就感也是十足的。

    至于抽掉竞争对手的梯子,我个人喜欢堂堂正正对决,但是经常被人抽掉,所以做好自己屁股痛的准备吧。能狠心抽别人的,也无需自责,人的本性就是这样的。

  • 测试三十六计-第二十七计-假痴不癫

    2013-05-26 13:07:12

    【释义】
    此计运用此象理,是说在军事上,有时为了以退求进,必得假痴不癫,老成持重,以达后发制人。这就如同云势压住雷动,且不露机巧一样,最后一旦爆发攻击,便出其不意而获胜。

    同样作为团队管理者,有时候根据情形需要忍,不管是组员的,还是上面的压力,还是开发团的不协作。总之,作为一个团队的领导者,必须有时候装傻,让大家不至于过于紧绷。但是,也不能永远的装傻,该强硬的时候必须站出来。但是没事就强硬几把,那不是装逼,就是太傻了。

    作为领导管理者,厚黑学得看,但是不能瞎用,自己整自己的手下是最悲哀的。
  • 测试三十六计-第二十六计- 指桑骂槐

    2013-05-26 13:04:27

    【释义】
    此计运用此象理,是说治军,有时采取适当的强刚手段便会得到应和,行险则遇顺。

    本计策同样是用于团队管理,只有让团队成员处于一种危机感+成就感的情绪下,团队才能持续的健康发展。

    所以,不时的敲打一下,是很必要的手段。大家都是成年人,如果连这个都理解不了,我很怀疑你的情商。
  • 测试三十六计-第二十五计-偷梁换柱

    2013-05-26 12:59:33

    【释义】
    比喻暗中玩弄手法,以假代真。

    这个计策在一个拥有QA share resource的情况下很常用。尤其在外包公司中,有一个团队用于senior和junior的人员是最正常的。而客户一般都想要senior的人来提供服务,但是对于公司来说,这样挣钱太少。

    所以一般来说,都是senior的测试人员顶一个名字,参与user story的书写,测试用例的开发和评审阶段,甚至一部分high level的测试用例的执行过程。而剩下的测试用例是由shadow的人员去执行。

    这样既保证了质量,又保证了数量。很常见的团队管理方式。关键的如何去切分每个QA的task来满足这种轮换型的时间片工作方式。
  • 测试三十六计-第二十四计-假道伐虢

    2013-05-26 12:51:07

    【释义】
    以借路为名,实际上要侵占该国

    看起来似乎跟测试无关,其实举个简单的例子就明白了。

    当你作为一个团队的管理者时,你要面临的一个阵痛就是一旦有人离开,谁来代替他的位置来保障质量。

    常用的方法就是让每个人都以作为另外一人的backup的名义,去参与测试用例的开发过程。实际上每个人都至少是另外2,3个人的backup。这样一旦一个人走了以后,剩下的人在短期内也能足够的覆盖该人的功能区域,从而给新人培训带来更多的时间。

    敏捷开发的pair coding和轮换制度,其实也是这种意境。因为一个合格的团队,不会依赖人任何一个team member。

  • 测试三十六计-第二十三计-远交近攻

    2013-05-26 12:45:03

    【释义】
    此计运用“上火下泽”相互离违的道理,说明采取“远交近攻”的不同做法,使敌相互矛盾、离违,而我正好各个击破。

    这个的含义就是,我们要合理的利用数据和测试方法,对系统进行探索式测试。

    除了产生数据冲突发现更多的流程上的缺陷外。系统的探索性测试就是该计策的充分利用。

    探索测试,顾名思义就是根据已有的测试经验,根据已有的测试数据报告,根据已有的bug分析,进行主动的测试。目的是尽早尽快的发现问题。

    一般来说,发现问题的功能区域比没有发现问题的功能区域掩藏的bug更多。所以主动去那些频繁发现问题的区域进行测试,能够减少测试消耗。

    而且,远交近攻的策略对最近发行bug比较多的区域进行更详细的测试和对很久之前发生过bug的区域进行粗略测试是一个很好的指导。
  • 测试三十六计-第二十二计-关门捉贼

    2013-05-26 12:41:34

    【释义】
    此计引此卦辞,是说对小股敌人要即时围困消灭,而不利于去急追或者远袭。

    在测试用例开发阶段,就是要细分。

    在测试阶段,就是要集中解决问题。

    在性能测试里,就是按着预先设定的性能指标去评审性能。

    在负载测试里,就是按照原先设定测试压力去搜集测试指标数据。

    在压力测试里,就是过压以后,去搜集关心的系统能力状况。

    总之,就是集中精力干一件事,不要掺和在一起。
1822/10<12345678910>
Open Toolbar