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

Joshua Dong · 2016年01月20日 · 最后由 zxp 回复于 2016年08月05日 · 4273 次阅读
本帖已被设为精华帖!

此篇博文主要是做名词解释,原始文章地址: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() 这样的方法?谢谢!

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

#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),麻烦帮忙看下,多谢!

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