Simulation 是我们操作 Gatling 时,主要编写的对象,本文主要介绍 Simulation 的结构。
还是那句,欢迎转载,不过请注明出处。
Simulation 结构详解
原文来自: http://gatling.io/docs/2.1.7/general/simulation_structure.html
=======================正文分隔线===============================
Simulation 是一个包含四个部分的 Scala 类:
译者注:原文还有一个简单的举例,不过链接已 404(https://github.com/gatling/gatling/blob/master/gatling-bundle/src/universal/user-files/simulations/computerdatabase/BasicSimulation.scala)。
第一个元素就是定义 HTTP 协议。
在一些例子里面,这个配置非常的基础,只是单纯地定义了一下。
baseURL 就是下面全部相对路径(推荐使用)指向的地址。这里的 base URL 就是 http://computer-database.gatling.io。
common headers 会加到每个请求里面。
HTTP 配置会被储存成一个我们可以在 simulation 里面定义的 Scala 的值。
下面的例子中你将看到,我们在 gatling 中定义场景的时候,我们可以给每个请求定义 header。因为例子中的 header 是通过 recorder,也就是录制器生成的,所有 header 都会在文件前面被声明,然后在场景定义中被调用。
注意:加上一个通用的 header 看上去没啥用,但是别忘了,它们也可以直接影响到你 server 的处理方式(就像 Accept-Encoding 或者是 If-Last-Modified)
headers 可以使用 Scala 的 map 进行定义:
val headers_10 = Map("Content-Type" -> """application/x-www-form-urlencoded""")
Header 定以后,接下来就是场景的定义。场景的定义需要设置一个名称,因为你需要在 simulation 里面定义好几个场景。场景一般会保存成一个 Scala 的值。
val scn = scenario("ScenarioName")
这个场景结构由两个方法组成:exec 和 pause。exec 用来定义一个动作的描述,通常是发送一个测试应用的请求。pause 是用来设置用户的思考时间的,思考时间通常是指两个请求之间的间隔。
HTTP 请求通常像下面那样去定义:
// Here's an example of a POST request
http("request_10")
.post("/computers")
.headers(headers_10)
.formParam("name", "Beautiful Computer")
.formParam("introduced", "2012-05-30")
.formParam("discontinued", "")
.formParam("company", "37")
上面的请求实际上发送的数据如下:
HTTP request:
POST http://computer-database.gatling.io/computers
headers=
Accept: [text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8]
Content-Type: [application/x-www-form-urlencoded]
DNT: [1]
Accept-Language: [en-US,en;q=0.5]
Accept-Encoding: [gzip, deflate]
User-Agent: [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0]
Referer: [http://computer-database.gatling.io/computers/new]
params=
company: [37]
discontinued: []
name: [Beautiful Computer]
introduced: [2012-05-30]
The last part of the file contains the simulation definition, this is where you define the load you want to inject to your server, e.g.:
下面的例子里包括了 simulation 定义,定义了你希望注入到 server 的位置:
setUp(
scn.inject(atOnceUsers(1)) // (1)
.protocols(httpConf) // (2)
)
解释下上面的脚本:
Gatling 提供了两种 Hooks:
java
before {
println("Simulation is about to start!")
}
after {
println("Simulation is finished!")
}
注:这里不能使用 Gatling 的 DSL 语言。