开源性能测试工具大比武

发表于:2019-5-13 08:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:晴空    来源:51Testing软件测试网原创

分享:
    如果我们需要模拟如下的负载,那就要想想办法咯~ 这里抛砖引玉希望熟悉这块儿的小伙伴们可以分享下踩过的坑
  2.4.2 分布式执行
  如果我们模拟高并发的场景,可能一台负载机是不够的这时候我们可以通过分布式压测来执行。Locust是master/slave架构,接下来我们一起看下如何使用locust进行分布式压测。
  Step 1:启动master
 locust -f scenario_on_web.py --master --host=https://testdingtalk3.xbongbong.com
  --master参数表示当前机器(进程)的角色是master。
  master不生成负载,它只负责任务调度和数据收集。
  Step 2:启动slave
 locust -f scenario_on_web.py --slave --master-host=192.168.10.175
  --slave参数表示当前机器是locust的slave节点。
  Step 3:设置压测数据
  我们打开locust web来看下现在是什么情景,下图中显示当前locust服务有3台slave节点机器,我们设置模拟的虚拟用户总数会均分到这3台slave节点上。
  PS:需要注意的点是master和salve都需要有我们的脚本文件。
  上面是以locust web服务的形式来执行压测,我们当然也可以通过non-web的方式来设置和执行压测场景。
  非Web UI的方式执行locust时,我们经常会用到以下参数
 locust -f scenario_on_web.py --no-web --host=https://testdingtalk3.xbongbong.com -c 10 -t 3m
  --no-web:以非Web UI方式执行locust
  -c:并发用户数
  -t:执行时间
  -r:每秒启动用户数
  --expect-slave:期望的slave节点数(未达到期望节点数之前不执行压测)
  以非Web UI方式执行分布式压测的命令如下:
 locust -f scenario_on_web.py --no-web --master -c 10 -t 2m -r 1--host=https://testdingtalk3.xbongbong.com --expect-slaves=3
  
   三:Gatling
  3.1 Gatling介绍
  Gatling是一款基于Scala开发的高性能性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等,它有商业版和开源免费版,本文将总结下开源免费版本gatling的实战。
  Gatling的特点:
  1.支持Akka Actors 和 Async IO,从而能达到很高的性能
  2.支持实时生成Html动态轻量报表,从而使报表更易阅读和进行数据分析
  3.支持DSL脚本,从而使测试脚本更易开发与维护
  4.支持录制并生成测试脚本,从而可以方便的生成测试脚本
  5.支持导入HAR(Http Archive)并生成测试脚本
  6.支持Maven,Eclipse,IntelliJ等,以便于开发
  7.支持Jenkins,以便于进行持续集成
  8.支持插件,从而可以扩展其功能,比如可以扩展对其他协议的支持
  Gatling适用的场景包括:测试需求经常改变,测试脚本需要经常维护;测试环境的客户机性能不强,但又希望发挥硬件的极限性能;能对测试脚本进行很好的版本管理,并通过CI进行持续的性能测试;希望测试结果轻量易读等。
  3.2 Gatling环境搭建
  在https://gatling.io/download/页面点击下载。解压即可。
  Bin:gatling的可执行文件。
  Conf:gatling的配置文件
  Lib:依赖的包
  Result:存放测试结果
  User-files:存放测试场景文件。
  3.3 Gatling初体验
  gatling自带的有个例子,我们进入到bin目录下执行gatling.sh执行测试。
  选择0,然后两次回车键开始执行压测。
  我们不用关心什么时候执行完毕。执行完成后gatling会自动退出进程并生成报告。
  打开gatling
  自动生成的报告
  哇~简直是惊艳!非常详细且漂亮的报告
  3.4 Gatling实战
  gatling的脚本是Scala语言,我们可以使用IDEA安装Scala插件。也可以去Scala官网(https://www.scala-lang.org/download/)下载tar包。
  我这里选择的是后者,将scala的tar包解压后配置一下环境变量
   export SCALA_HOME=/Users/mc/scala
  export PATH=$PATH:$SCALA_HOME/bin
  执行source .bash_profile即可。
  对于Scala语言的学习,本文就不总结了,小伙伴们自行学习吧~
  使用IDEA开发Scala脚本时需要一些配置步骤,如下执行:
  Step 1:配置maven(略过…)
  Step2:安装IDEA(略过…)
  Step3:在IDEA的plugins界面中搜索Scala并安装
  Step4:根据gatling模板创建gtling-scala项目
  Group-id填写为:io.gatling.highcharts
  ArtifactId填写为:gatling-highcharts-maven-archetype
  Version填写为:3.0.3(请查看最新版本,当然目前最新是3.0.3)
  模板工程生成后,工程目录结构如下:
  脚本文件在src/test/scala目录下。
  3.4.1 Gatling常用API
  Gatling的脚本有3大部分组成:header,scenario,setUp。
  Header:组装请求头。
  Scenario:具体业务执行。
  SetUp:设置执行场景。
   import io.gatling.core.Predef._
  import io.gatling.http.Predef._
  class CustomerList extends Simulation {val httpProtocol = http.baseUrl("https://testdingtalk3.xbongbong.com")
  .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 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36")
  val headers_10 = Map("Content-Type" -> "application/x-www-form-urlencoded")
  val  business_process=scenario("业务流压测")
  .exec(http("钉钉扫码登录").get("/user/autoLogin.do?t=63t42AXnCd6hCEdQl+dOZCXVIiwZVkRhX60J7lPXpv+xZt3tvEB1sT/ld8xQ0FUp7iqSfah+CNgNbYzcwW1d9Q==&nonce=jmymnp"))
  .pause(1, 5).exec(http("客户列表").post("/customerApi/listAjax.html").body(StringBody("{\"sign\": \"c8fb3b2bdb32400069161840f55a525f707ae04abefccaf03a46da6072805099\", \"JSESSIONID\": \"fu9f7l5zt5pc4ca85g8fkqqtp41vhbtz\", \"frontDev\": \"0\", \"platfrom\": \"web\", \"params\": {\"corpid\":\"dinga93c84f4d89688bf35c2f4657eb6378f\",\"nowUserId\":\"030917160122954929\",\"templateId\":175,\"page\":1,\"pageSize\":20,\"belongerType\":\"0\",\"isMain\":1,\"treeType\":\"\",\"pid\":\"\",\"nameLike\":\"\",\"nameLikeType\":\"\",\"isArchived\":0,\"child\":\"customer\",\"categoryId\":\"\"}}")).check(status.is(200)))
  .pause(1, 5)
  .exec(http("合同列表").post("/contractApi/listAjax.html").check(status.is(200)))
  setUp(business_process.inject(constantUsersPerSec(10).during(100)).protocols(httpProtocol))}
  header部分常用的api如下:
  baseurl:设置域名
  acceptHeader:请求头的accept。
  acceptLanguageHeader:请求头中的Language
  acceptEncodingHeader:请求头的编码
  Scenario部分常用的api:
  exec:执行(发送请求)
  body:设置请求报文的body
  post:模拟http(s)的post方法
  get:模拟http(s)的get方法
  headers:设置请求头信息
  formParam:设置请求报文的body部分(以表单形式)
  feed:提供后续请求的参数(参数化时使用)
  check:检查响应报文内容(类似断言)
  during:模拟压测时长
  setUp部分常用api:
  setUp部分是模拟用户使用场景的设置。
  先来看下Gatling中所有的场景模拟:
   setUp(
  scenario.inject(
  // 在一段时间内不做任何事情
  nothingFor(4 seconds),
  // 一次性启动指定数量的虚拟用户数
  atOnceUsers(10),
  // 5秒内启动10个虚拟用户
  rampUsers(10) over(5 seconds),
  // 保持20个并发虚拟用户数,持续15分钟
  constantUsersPerSec(20) during(15 minutes),
  // 在20个并发虚拟用户基数上随机递减,持续15分钟
  constantUsersPerSec(20) during(15 minutes) randomized,
  // 在10分钟内,虚拟用户数从10递增到20
  rampUsersPerSec(10) to 20 during(10 minutes),
  // 在10分钟内,虚拟用户数从10上升到20(随机增加虚拟用户数)
  rampUsersPerSec(10) to 20 during(10 minutes) randomized,
  // 下面这两个。。。理解不了。。。
  splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 minutes),
  splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedByatOnceUsers(30),
  ).protocols(httpConf) )
  3.4.3 分布式执行
  非常抱歉,Gatling不支持分布式执行~
  四:wrk
  4.1 wrk环境搭建
  wrk的仓库地址是:https://github.com/wg/wrk
  我使用的是Mac,所以只能以Mac OS来说明下wrk的搭建了。
  brew install wrk
  4.2 wrk初体验
  安装好wrk后,咱们先看下wrk支持的参数吧,wrk回车键即可。
  -c:保持的链接数。
  -d:压测时长。
  -t:压测时使用的线程数。
  -s:lua脚本文件路径。
  -H:--header 请求头
  --latency 输出响应延迟信息
  --timeout 请求超时时长
  模拟get请求:
  wrk -t10 -c20 -d30s --latency http://z.xbongbong.com/www/index.php?m=user&f=login
  
   wrk的高级用法是使用Lua脚本实现set_up/running/stop三大部分的自定义,因为水平有限,这里我就不班门弄斧了。
  五:Jmeter
  Jmeter这里我就不多写什么了,之前笔者写过Jmeter实战的文章,感兴趣的小伙伴们可以下载第50期的《51测试天地》期刊http://www.51testing.com/html/33/n-3958933.html这里下载~不但有Jmeter实战还有其他优秀的同学们分享的各种测试topic~
  六:工具对比选型
  
  想使用界面操作的形式对我的系统做性能测试,并且希望测试数据有良好的可视化展示方式:建议使用Jmeter工具
  性能基准测试:建议使用wrk工具
  对系统模拟复杂场景的性能测试;建议使用locust工具
  压测的同时,监控服务器性能指标:建议使用Jmeter工具
  使用匀速请求的方式,对系统进行性能测试;建议使用Jmeter或locust
  体验编程的乐趣,自己编写脚本进行性能测试;Jmeter:使用Java请求,自由扩展。locust,使用Python语言编写脚本。
  把玩了这么多,我个人比较推崇的是Locust和Jmeter,当然需要根据小伙伴们的实际情况略加考虑~

 ......
查看更多精彩内容,请点击下载:
版权声明:本文出自《51测试天地》第五十三期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号