gatling

Web Service性能测试工具比较

不打扰是莪最后的温柔 提交于 2019-12-06 01:02:41
背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力(请求数/秒)。 以微信服务器为例,每个用户用独立的登录token,做各种操作,比如刷消息、发消息、看朋友圈等。 希望该性能测试工具符合如下要求: 测试脚本能力,最好是Python/Ruby等最常用的 每个并发实例能使用不同参数 CLI启动测试,这对自动化测试很重要 Session支持,也就是第一个请求的响应,能用于后续请求的参数。 单个结点的并发数量高。 分布式支持,不受限于单个结点的计算能力。 性能测试工具选手: Gatling http://gatling.io/ Gatling是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等,除此之外它拥有以下特点: 支持Akka Actors 和 Async IO,从而能达到很高的性能 支持实时生成Html动态轻量报表,从而使报表更易阅读和进行数据分析 支持DSL脚本,从而使测试脚本更易开发与维护 支持录制并生成测试脚本,从而可以方便的生成测试脚本 支持导入HAR(Http Archive)并生成测试脚本 支持Maven,Eclipse,IntelliJ等

Gatling - Looping through JSON array

社会主义新天地 提交于 2019-12-05 20:27:08
问题 I have a block of code which needs to loop through a JSON array which is obtained from response of a REST service. (Full gist available here.) .exec(http("Request_1") .post("/endPoint") .headers(headers_1) .body(StringBody("""REQUEST_BODY""")).asJSON .check(jsonPath("$.result").is("SUCCESS")) .check(jsonPath("$.data[*]").findAll.saveAs("pList"))) .exec(session => { println(session) session }) .foreach("${pList}", "player"){ exec(session => { val playerId = JsonPath.query("$.playerId", "$

gatling系列教程(翻译)-第三节(快速开始)

戏子无情 提交于 2019-12-05 18:13:25
在本章,我们将使用gatling来加载测试一个云托管web服务器,并向你介绍DSL基本元素。 安装gatling:将gatling解压至指定文件夹即可 提示:Windows用户:我们建议您不要将Gatling放在程序文件夹中,因为可能存在权限问题。 为了运行Gatling,您需要安装JDK。 Gatling需要JDK8,但我们建议您使用最新版本。 有关 操作系统(OS) 的安装和调整的所有详细信息,请参阅操作部分。 提示: Gatling launch scripts and Gatling maven plugin honor JAVA_HOME env var if it’s set. OS, like OSX, have their own tricky way of discovering which version of Java to run, so you might end up running a different version than the one java -version tells you. If you get strange errors such as Unsupported major.minor version 51.0 and you were expecting to run a JDK8, you might want to

gatling系列教程(翻译)-(附加三)checks

百般思念 提交于 2019-12-05 18:13:14
概念 Check API用于两件事情: 验证对请求的响应是否符合预期 最终在其中捕获一些元素。 检查是根据具有检查方法的请求执行的。 例如,在HTTP请求上: http("My Request").get("myUrl").check(status.is(200)) One can of course perform multiple checks: http("My Request").get("myUrl").check(status.not(404), status.not(500)) 默认情况下,Gatling遵循重定向(可以在协议中禁用)。 如果启用此行为,检查将忽略中间响应,并将针对着陆响应。 Defining the check type HTTP检查实现提供以下内置函数: HTTP status status Targets the HTTP response status code. 当您未指定请求时,状态检查将自动添加到请求中。 它检查HTTP响应是否具有2XX或304状态代码。 Page location currentLocation 指定当前页绝对URL。 以下重定向是有用的,以检查目标网页是否确实是预期的。 currentLocationRegex(pattern) 与上述相同,但是pattern用于在当前位置应用正则表达式。 默认情况下

gatling系列教程(翻译)-第一节

我的梦境 提交于 2019-12-05 18:10:07
gatling是一款高性能的负载测试工具。 它的设计易于使用,可维护性和高性能。 开箱即用,Gatling对HTTP协议提供极好的支持,使其成为负载测试任何HTTP服务器的首选工具。 由于核心引擎实际上是协议不可知的,所以完全可以实现对其他协议的支持。 例如,Gatling目前还提供JMS支持。 快速入门概述了最重要的概念,并逐步介绍了设置HTTP服务器负载测试的简单方案。 在代码中定义并且是资源高效的场景是激励我们创建Gatling的两个要求。 基于表达的DSL,这些场景是不言自明的。 它们易于维护,可以保存在版本控制系统中。 只要底层协议(如HTTP)能够以非阻塞的方式实现,Gatling的架构就是异步的。 这种架构让我们将虚拟用户实现为消息,而不是专用线程,从而使它们非常便于资源。 因此,运行数千个并发虚拟用户不是一个问题。 gatling迁移 如果您从Gatling 2.2迁移到Gatling 2.3,请查看专门的迁移指南。 否则,请按照以前的迁移指南。 来源: oschina 链接: https://my.oschina.net/u/3613710/blog/1554705

gatling系列教程(翻译)-(附加二)feeders

一曲冷凌霜 提交于 2019-12-05 18:09:51
Feeder是Iterator [Map [String,T]]的类型别名,这意味着由feed方法创建的组件将轮询Map [String,T]记录并注入其内容。 建立一个定制的非常简单。 例如,下面是如何构建一个随机的电子邮件发生器: import scala.util.Random val feeder = Iterator.continually(Map("email" -> (Random.alphanumeric.take(20).mkString + "@foo.com"))) 这定义了一个工作流步骤,每个虚拟用户都在同一个Feeder上提供。 每次虚拟用户达到此步骤时,它将从Feeder中弹出一条记录,该记录将被注入到用户的Session中,从而产生一个新的Session实例。 如果Feeder无法生成足够的记录,Gatling会抱怨它,您的模拟将停止。 您也可以一次提供多条记录。 如果是,属性名称将被后缀。 例如,如果列是名称“foo”和“bar”,并且您一次提供2条记录,您将获得“foo1”,“bar1”,“foo2”和“bar2”会话属性 feed(feeder, 2) RecordSeqFeederBuilder Array [Map [String,T]]或IndexedSeq [Map [String,T]]可以隐式地变成Feeder。 此外

Gatling - execute scenarios sequentialy

纵然是瞬间 提交于 2019-12-05 09:40:52
When I run code like: setUp( scenario1.inject(constantUsersPerSec(1) during (1 second)), scenario2.inject(constantUsersPerSec(1) during (1 second)) ).protocol() Both scenarios are started at once. What need to be changed to run it one by one? You could start the second scenario with a "nothingFor" injection step setUp( scenario1.inject(constantUsersPerSec(1) during (1 second)), scenario2.inject(nothingFor(1 second) , constantUsersPerSec(1) during (1 second)) ).protocol() If you want to have a guaranteed sequential execution, you have to put the chains of both scenarios into a new scenario. var

测试工程师相关技能整理

两盒软妹~` 提交于 2019-12-05 07:16:44
通用技能 业务相关 业务需求知识 业务管理流程 行业现状和发展方向 管理相关 时间管理(四象限法则) 重要且紧急 重要不紧急 紧急不重要 不紧急不重要 目标管理(SMART法则) S(Specific):目标明确 M(Measurable):目标可度量 A(Attainable):目标可实现性 R(Relevant):目标必须和其它目标具有相关性 T(Time-based):目标具有明确的截止期限 知识管理 工具:xmind、有道云笔记、印象笔记、Blog、GitHub、CSDN、testerhome等 团队管理 team leader 任务分工 工作汇报 部门协作 员工技术成长体系建设 员工身心健康发展 team worker 任务职责边界 敢于担当,对自己负责,对团队负责,对公司负责 彼此包容、和谐相处 思考和沟通 思考 今天完成了什么内容、明天需要做什么 自己哪些方面做得好,哪些做得不够好,下次需要改进 近期工作计划、学习计划(制定todolist) 职业规划 人生规划 沟通 敢于沟通:主动了解和听取对方的想法,敢于表达自己的观点 勤于沟通:多和别人交流自己的意见和想法 善于沟通:提升沟通技巧和效率 工具 抓包工具 fiddler Charles wireshark 缺陷管理工具 jira 禅道 文档协作管理工具 wiki--协同创作超文本系统 Docs--在线协作编辑工具

Debugging the session

筅森魡賤 提交于 2019-12-04 17:43:34
As part of my performance testing, I need to debug the session etc. The same code is running if I remove session => . When I add that it says there was no request sent during simulation since it is not sending any. val scn1 = scenario("LaunchAction").exec{ session => http("Poll report status page report") .get("myURL/rest/reports") .queryParam("applicationId", "123") .queryParam("id", "1") .check(xpath("//status").saveAs("responseStatus")) session } I need to add few prints etc in between. Can you please provide some information? I just started with Gatling and I had exactly the same problem.

How to add random value in Json Body in Gatling?

别来无恙 提交于 2019-12-04 16:56:19
问题 I need to create a random positive integer each time and send it to Json body in Gatling. I used the below code to create a random positive ineger: val r = new scala.util.Random; val OrderRef = r.nextInt(Integer.MAX_VALUE); but, How can I feed the randomly generated value into the json body? I tried: .exec(http("OrderCreation") .post("/abc/orders") .body(StringBody("""{ "orderReference": "${OrderRef}"}""").asJson) But, this doesn't seem to work. Any clues please. Thanks! 回答1: First of all you