性能测试工具 Gatling 官网教程翻译之 Concepts

joshua · 2016年01月20日 · 最后由 zxptester 回复于 2016年08月05日 · 371 次阅读
本帖已被设为精华帖!

此篇博文主要是做名词解释,原始文章地址:http://gatling.io/docs/2.1.7/general/concepts.html
下一期将详细介绍gatling用于做用户并发模式的Simulation Setup
还是那句,欢迎转载,不过请注明出处。

Virtual User -- 虚拟用户

一些负载测试工具,像ab、wrk,在url压测的时候是很有效率的。但是它们不能很好地处理请求之间的逻辑关系。
像Gatling这样的高级负载测试工具就可以很好地处理虚拟用户。让每一个虚拟用户都使用不同的参数,甚至是请求到不同的地址去。

其他一些测试工具使用线程的方式来实现虚拟用户。但是Gatling的实现方式是通过消息,这样做更好,处理起几千个虚拟用户来说毫不费力。

Scenario -- 场景

我们可以通过Gatling自带的脚本来创建场景,从而实现模拟用户的操作。

创建场景既可以根据线上运行的数据分析工具提供的数据,也可以是一个新应用里我们预期的用户操作。无论如何,创建场景都是做负载测试的关键所在,必须重视。
场景代表着用户的典型操作,也是各虚拟用户必须遵守的操作流程。

举例来说,一个典型的电商应用的场景大致如下:
1.进入主页;
2.选择浏览的商品类型;
3.在这个类型中搜索商品;
4.打开商品的详细描述;
5.返回;
6.打开另一个商品的详细描述页面;
7.点击购买这个商品;
8.登录;
9.权限校验;
10.支付;
11.退出登录;

在gatling里面,我们可以使用DSL来实现场景。DSL语言实现和维护起来都非常简单。
下面是一个简单的DSL实现例子:

scenario("Standard User")
  .exec(http("Access Github").get("https://github.com"))
  .pause(2, 3)
  .exec(http("Search for 'gatling'").get("https://github.com/search?q=gatling"))
  .pause(2)

上面这段代码,我们可以大致猜到它的意思:
1.实现了一个叫“Standard User”的场景;
2.发了2个请求;
3.暂停了2次;

这里的pause,用于设置用户的思考时间。当一个真实的用户点击链接的时候,加载网页就有一段时间,用户必须等待这个时间。大多数时候,用户需要阅读下页面内容再进行下一步操作。
HTTP请求实际上是由用户点击一个按钮或者链接触发的。每个HTTP请求(包括页面的资源请求)都是很容易抓取的。

进入Github是一个GET请求(点击 http://github.com
搜索“ gatling”也是一个GET请求(点击 gatling)

想知道更多关于场景的知识,点击:http://gatling.io/docs/2.1.7/general/scenario.html#scenario

Simulation -- Simulation

译者觉得这里的simulation暂时找不到合适的翻译,也许直接使用simulation就是最好的表达方式。

Simulation其实就是负载测试的描述。它解释了用户执行了哪些操作(可能是好几个操作)、执行哪些场景,新的用户怎么被注入等等。
下面是一个simulation的应用例子:

val stdUser = scenario("Standard User") // etc..
val admUser = scenario("Admin User") // etc..
val advUser = scenario("Advanced User") // etc..
setUp(
  stdUser.inject(atOnceUsers(2000)),
  admUser.inject(nothingFor(60 seconds), rampUsers(5) over (400 seconds)),
  advUser.inject(rampUsers(500) over (200 seconds))
)

译者试着简单解释下三种用户的操作方式:
atOnceUsers -- 立即并发的用户;
nothingFor再rampUsers -- 先停止一段时间再操作的线性启动用户;
rampUsers -- 线性启动的用户(每隔一段时间再启动,推荐这种初始化用户的方式);

想知道更多关于simulation的知识,点击:http://gatling.io/docs/2.1.7/general/simulation_setup.html#simulation-setup

Session -- 会话

每一个虚拟用户都有一个Session支持着。这些session都是实际的工作流中的数据信息。Session是一个测试者可以用来注入、捕获、存储数据的的占位符。
译者:session其实是数据管理用的

想知道更多关于session的知识,点击:http://gatling.io/docs/2.1.7/session/session_api.html#session

Feeders -- 测试数据管理器

译者注:译者对自己的语言知识表示羞愧,又是一个不知道咋翻译的词。

有些测试应用需要校验数据,比如一些登录、登出等等需要特定用户/数据才能操作的场景。测试者需要考虑下数据。
Gatling本身并不提供生成测试数据的工具。

Feeder就是一个方便用户将外部资源存储的数据注入到虚拟用户的session中的一些API。

想知道更多关于feeder的知识,点击:http://gatling.io/docs/2.1.7/session/feeder.html#feeder

Checks -- 检验返回结果

我们使用gatling发送请求的时候,一般情况下是有返回的,比如xml、json或者html等返回到gatling。

Gatling中,就是用checks来检查、分析、校验返回(response)的结果。也可以预设一些检查的条件。举例来说,当发送一个HTTP请求的时候,你希望检查下这个请求的重定向地址。使用了Check,你就可以检查到返回的状态码是30几开头的。

Checks也可以用来捕获一些页面元素并存到session里面,这样我们就可以在下一个请求中重复使用这些数据了。

想知道更多关于Checks的知识,点击:http://gatling.io/docs/2.1.7/http/http_check.html#http-check

Assertion -- 断言

断言用来定义测试成功的标准。如果Assertion失败了,会返回一个全局定义的错误码。

想知道更多关于Assertions 的知识,点击:http://gatling.io/docs/2.1.7/general/assertions.html#assertions

Reports -- 测试报告

在一个simulation结束后,gatling会自动生成一个html版本的测试报告。因为是html格式的,任何有浏览器的设备都能方便地浏览。

想知道更多关于reports 的知识,点击:http://gatling.io/docs/2.1.7/general/reports.html#reports

共收到 16 条回复 时间 点赞

非常感谢!!!

#1楼 @fengzhou 多谢支持哈

其实我默默的关注了你很久了~希望分享更多的Gatling

请问下,Gatling优于Jmeter的地方在哪里? 从https://blazemeter.com/blog/open-source-load-testing-tools-which-one-should-you-use里的结论来看, 几乎没看到用它的好处. 我没用过Gatling, 所以问问看

#4楼 @ansonwoo 刚刚下班,看到你的回复……这个问题是这样的,其实我用Jmeter用得不多,以前一直用loadrunner。首先我要说这两款工具和LR相比,无论是功能上还是易用性上都差了太多,毕竟LR收费。Gatling和Jmeter相比的话,资源占用更小,编写场景(注意是场景)更方便,很容易做到数据和脚本分离;Jmeter我觉得还是它使用Java,用的人多,而且资料、实践方案、扩展工具都更多。
我的一点浅薄之见,更具体的分析请移步这位大神的博客:
https://blog.flood.io/benchmarking-jmeter-and-gatling/
https://blog.flood.io/stress-testing-jmeter-and-gatling/
如果没有耐心看完的话,我就简单说下结论:两种工具都很好,都能满足一般的测试需求。Gatling在高并发下的表现更好,20000并发的表现完爆Jmeter,即使在40000并发下还能正常工作不受影响。

#5楼 @joshua 非常感谢. flood.io说得蛮好.
BTW, LR你不觉得很臃肿, 运行起来很慢吗?

#5楼 @joshua 20000如何做到的,在多长时间内request完成全部请求。

#6楼 @ansonwoo LR很大很重,是因为它集成了非常多的功能,很多功能我在测试过程中根本用不到,但是不可否认它的强大。Jmeter和gatling有时会出现功能不够用的情况,需要用插件或者补丁,或者自己开发来弥补。

—— 来自TesterHome官方 安卓客户端

#7楼 @13651969749 建议你看下我发的flood.io博客地址,里面有特别具体的环境准备及测试计划。他只是为了比较工具的性能,而一般我们用不到20000用户的。

—— 来自TesterHome官方 安卓客户端

很赞,我想请教一下,为什么我跑 constantUsersPerSec(200) during(5 minutes),在测试刚开始的1-2min内返回都是正常的,大概到一半时,开始频繁报j.n.ConnectException: Connection timed out: no further information 这种错误,网上查了一下,出现这种问题最大的可能是本机的pool connection耗尽了,这个时候本机单独发请求确实处于pending中,但是在别的机器向服务器发请求,链接非常迅速。感觉这里好像有哪个地方没有对。不知道楼主在实践测试过程中有没有遇到过类似问题?

另外非常想知道楼主是如何达到20000的高并发的?这个20000的数量是基于atOnceUsers(),还是constantUsersPerSec()这样的方法?谢谢!

joshua #12 · 2016年05月12日 作者

#10楼 @laputa 你好,才看到。出现Connection timed out,最大的可能性就是服务器连接池满了,或者是你负载机网络带宽满了。除了检查脚本之外,还可以检查服务器的配置有没有问题。

joshua #13 · 2016年05月12日 作者

#11楼 @laputa 20000的高并发只是楼上提问时,我在网上找的一个对比资料。里面比较gatling和Jmeter时用的一个测试场景:10000个用户并发、每分钟30000个请求、持续20分钟其中10分钟呈增加负载趋势。后面的博客又将Vuser加到20000。由于持续的并发,所以肯定不是atOnceUsers,我猜测可能是rampUsersPerSec或者constantUsersPerSec。
详见:
https://blog.flood.io/benchmarking-jmeter-and-gatling/
https://blog.flood.io/stress-testing-jmeter-and-gatling/

#13楼 @joshua 感谢答复,事后我自己也查了一下资料并且分析了一下,我的结论也和你的结论差不多,目前就我的环境来看,出现Connection timed out就是由于测试本机的链接池耗尽了,因为此时在别的机器请求服务器,返回都很正常。由于gatling并不支持分布式,所以后续的性能测试我还是考虑换用nGrinder或者是locust。但是某些特殊的测试要求下,我感觉gatling还是一个挺不错的性能测试工具 :) 谢谢!

另外一开始我的场景设置,其实并发用户并不高,一开始场景中的setUp方法是rampUsersPerSec(200) during(5 minutes),之后发现大概跑到2分半的时候,就出现大量的连接超时,于是修改了方法变为constantUsersPerSec(100) during(5 minutes),再之后发现这个比rampUsersPerSec()还不堪,于是最终换成了atOnceUsers()。

你好,我是刚学gatling,向你请教个问题,我发一个get请求,返回的是json格式的,如何获取返回结果,我用 .extraInfoExtractor {extraInfo => List(extraInfo.response)} 日志显示:GET headers: Content-Type:application/json Accept:application/json,None,Some(org.asynchttpclient.netty.NettyResponseStatus@7c31ff8d),io.netty.handler.codec.http.DefaultHttpHeaders@62fb0457,io.gatling.http.response.NoResponseBody$@5603bfb8,Map(),0,UTF-8,ResponseTimings(1470382070593,1470382070678),麻烦帮忙看下,多谢!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册