Simulation是我们操作Gatling时,主要编写的对象,本文主要介绍Simulation的结构。
还是那句,欢迎转载,不过请注明出处。
Simulation结构详解
原文来自: http://gatling.io/docs/2.1.7/general/simulation_structure.html
Simulation是一个包含四个部分的Scala类:
1.HTTP协议设置;
2.header定义;
3.场景定义;
4.simulation定义;
译者注:原文还有一个简单的举例,不过链接已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)
)
解释下上面的脚本:
1.注入了一个虚拟用户到scn这个场景里面;
2.使用的http配置是httpConf,所有之前定义的http配置,比如base URL都会被加载到这个simulation里面;
Gatling提供了两种Hooks:
- before – 在你的simulation执行前执行
- after – 在你的simulation执行后执行
before {
println("Simulation is about to start!")
}
after {
println("Simulation is finished!")
}
注:这里不能使用Gatling的DSL语言。