鼠年全马铁人挑战 WEEK 35: 负载性能测试 - Gatling (下)

           Photo on gatling.io


前言

上周小弟简单的介绍了一下 Gatling 的安装与执行方式
也介绍了如何使用 Recorder 的 GUI 来生成 Scala 的方法

而这周小弟将会更近一步的简单介绍 Scala
主要都是 Gatling 中常用到的功能
顺便帮自己做笔记 XD

如果还没看过上周 Gatling 分享的大哥大姐 可以在参考下方连结
鼠年全马铁人挑战 WEEK 34:负载性能测试 - Gatling (上)

那就废话不多说赶快来看看这周的内容吧


文前说明

这周分享内容 主要出处皆为 Gatling 官网的文件内容
可参考该连结:https://gatling.io/docs/current/cheat-sheet/

至於测试的内容 则是以政府公开的 API 来进行测试
如果想要取得某个 Open API 的 Curl
可以点击 API 在点击里面的 Try it out!
执行後就可以看到相关资讯罗

可参考该连结:https://ptx.transportdata.tw/MOTC?t=Bike&v=2

功能介绍

HTTP Protocol

HTTP Protocol 中有许多的指令可以使用
调整 Gatling HTTP client 端的行为 让 Scenario 可以顺利进行
主要设定的有 Url, Proxy, Header 以及其余的选项

而大部分的 Headers 在 Gatling 中都有相对应的指令
但是有些比较特殊的 Key 可能就需要自行额外设定
像是 --header 'x-date: Wed, 30 Sep 2020 15:03:42 GMT'
这个时候就可以透过 Map 来进行配置 (下面一点有范例代码)

更多详细内容可以查看 Gatling 相关连结
https://gatling.io/docs/current/cheat-sheet/#http-protocol

Scenario

Scenario 是测试中会出现的基本功能
主要是用来命名案例场景的名称
有两种写法 用法如下

  • scenario( scenarioName = "<naming the scenatio>" )
  • scenario( "<naming the scenatio>" )

Exec

Exec 是 Execution Step 的缩写
顾名思义就是所要执行的内容
可以想像成案例场景中的各个案例测试或 function

HTTP Action

HTTP Action 的内容相当丰富
像是最主要的各种 HTTP Method
或是请求中需要带 Body 的各种资料
又或是刚刚提到需要额外配置的 header
也可以透过 HTTP Action 来一并请求 (下面有范例代码)

更多详细内容可以查看 Gatling 相关连结
https://gatling.io/docs/current/cheat-sheet/#http-action

Injection profile

Injection profile 主要是用来控制 Scenario 中注入的使用者数量
像是范例代码中使用的就是最基本的 atOnceUsers

  • atOnceUsers:同时注入特定数量的使用者,用法:atOnceUsers(nbUsers)

另外还有其他多种注入使用者的方式

  • rampUsers:在给定的秒数中 以线性增加的方式注入给定的使用者数量,用法:rampUsers(nbUsers) during(dur unit)
  • constantUsersPerSec:在给定的秒数中 每秒注入给定的使用者数量,用法:constantUsersPerSec(nbUsers) during(dur unit)
  • nothingFor:暂停一段给定的时间,用法:nothingFor(dur unit)

更多详细内容可以查看 Gatling 相关连结
https://gatling.io/docs/current/cheat-sheet/#injection-profile

范例代码


到目前为止已经将最基本的 Scala 指令功能大致简单的介绍了一下
但是了解上述的内容後 仅能够简单的完成执行
但是除此之外也可以透过指令来做一些更详细的判断
让脚本除了执行之外还可以确认测试案例是否有额外问题
让除错的时间大大减少 也能更快的厘清问题所在
那就废话不多说 赶快接着看下去吧

Pause

Pause 主要是用来执行固定或随记暂停用的
拥有各种的使用方法 方式如下
pause(dur unit):暂停一段给定的时间
pause(duration, timeunit):暂停一段给定时间单位的时间
pause(dur unit, dur unit):暂停一段给定范围的时间
pause(duration, duration, timeunit):暂停一段给定范围单位的时间

Checks

Check 主要是用来检查 request 的内容是否为预期的

  • check(<检查 内容/方式>)

而 Check 的检查方式有相当多种
有些需要给定预期结果进行检查
有些则是直接判断结果 true, false

  • is:验证获取的值是否等於预期值,用法:is(<expected>)
  • not:验证获取的值是否不等於预期值,用法:not(<expected>)
  • exists:验证获取的值是否存在,用法:exists
  • notExists:验证获取的值是否不存在,用法:notExists
  • in:验证获取的值是否在包含在预期值内,用法:in(sequence)
  • isNull:验证获取的值是否为空,常用来验证 JSON,用法:isNull
  • notNull:验证获取的值是否不为空,常用来验证 JSON,用法:notNull

而除了检查的方式很多样 连检查的内容也是非常的多元
以下就简单的列举几个比较常使用到的指令吧

  • status
    • .check(status.is( expected = 200 ))
    • .check(status.in( expected = 200 to 210 ))
    • .check(status.not( expected = 404 ))
  • jsonPath
    • .check(jsonPath( path = "$[1].StationName.Zh_tw" ).is( expected = "秋红谷"))
    • .check(jsonPath( path = "$[0].RouteName" ).saveAs( key = "RouteName"))

在 jsonPath 的第二个范例有写道 saveAs
该方法主要是将捞出来的资料存在名为 RouteName 的变数
而如果想要印出该笔资料可以使用 println 来达成
.exec{session => println(session("RouteName").as[String]); session}

关於 jsonPath 的使用方式可以参考 JSONPath - XPath for JSON
如果想要确认 jsonPath 捞出来的资料为何可以参考 jsonpath online evaluator

当然如果有在使用 Insomnia 的大哥大姐也可以直接使用
还不知道什麽事 Insomnia 吗? 没关系点击下方连结 带你了解
鼠年全马铁人挑战 WEEK 11:API 测试工具 - Insomnia

范例代码


最後来介绍几个功能 虽然与测试无直接关系
但是或许有满大机率会需要使用到
分别是 FunctionLoop

Function

Function 比较容易理解
就是将单个或多个执行内容写进 Function 中
这样就可以直接呼叫该 Function 罗~ (Don't Repeat Yourself)
主要使用的方式就跟写 python 一样是用 def functionName()

Loop

Loop 顾名思义就是将某段场景重复执行
虽然是重复执行 但是方法也是有许多种

  • repeat:重复一部分场景给定次数,用法:repeat(times){chain}
  • during:重复一部分场景在给定的时间内,用法:during(dur unit){chain}
  • asLongAs:只要条件成立,就重复一部分场景,用法:asLongAs(condition){chain}
  • doWhile:与 asLongAs 相似,差别在於 doWhile 为先执行後判断,用法:doWhile(condition){chain}
  • asLongAsDuring:与 asLongAs 相似,差别在於有给定重复执行时间,用法:doWhile(condition){chain}
  • doWhileDuring:与 doWhile 相似,差别在於有给定重复执行时间,用法:doWhileDuring(condition, duration, counterName){chain}

范例代码


结尾

以上是这周分享的内容
主要是接续上周的 Gatling 的分享内容
接着介绍 Gatling 的功能指令
因为小弟也是新手使用的分享文
所以介绍的内容可能有遗漏或是错误,还请各位大哥大姐提点
小弟将继续往下周迈进。 ─=≡Σ((( つ•̀ω•́)つ


参考文献

官方网站

相关文章

相关影片


<<:  Day33 | 赛後中场休息 X 复刊时间

>>:  33.Vuex项目结构

Day 26 介绍 vite

vite 是 Vue.js 的作者所做的一个新的 bundler ,如果你有用过应该会知道,它最特别...

成员 23 人:致命打击,群众不同意运动

「凡事太尽,缘份誓必早尽。」 日记,是真实世界发生的事。 小说,是人类梦想的事。 怎麽会发生连作梦都...

JavaScript DOM | Window Object

使用Window 的方法可以省略掉 Window 字眼 EX: window.alert('Hi!'...

[DAY 6] 建立Spring boot

现在简单说明Spring boot专案的建立方式 专案的建立方式有以下几个方式 官网starter建...

Day 2 Odoo开发环境与元件介绍

第一章 开发环境与元件介绍 Python 简单、应用广泛、能快速上手 Python是完全物件导向的语...