Gatling性能测试工具中的两个重要概念:分组(group)和事务(transaction)。在Gatling中,分组和事务是组织测试脚本并生成更有意义的性能报告的重要工具。
分组(Group):
分组允许我们将多个请求组合在一起,形成一个逻辑组。在生成的报告中,这个组将作为一个单独的条目出现,从而我们可以查看该组的总响应时间、请求数等统计信息。
分组可以嵌套,即一个组内可以包含其他组和请求。
分组通过group方法定义,它接受一个字符串参数(组名)和一个由多个exec构成的链(ChainBuilder)。
事务(Transaction):
事务通常是一系列请求的集合,这些请求共同完成一个业务操作。在Gatling中,事务是通过将多个请求包装在一个事务中来实现的,事务会记录整个序列的总响应时间,并且可以定义事务是否成功。
在Gatling中,事务可以通过transaction方法实现,但请注意,Gatling中并没有一个名为transaction的直接方法。实际上,我们通常使用group来模拟事务,或者使用exec链来实现。但是,Gatling提供了一个transaction方法,它实际上是group的一个别名,用于将多个请求组合在一起,并在报告中显示为一个事务。
需要注意的是,在Gatling的早期版本中,有transaction方法,但在较新的版本中(如Gatling 3.0及以上),transaction已被弃用,取而代之的是group。因此我们现在主要使用group来定义事务。
应用场景:
分组和事务可以帮助我们在性能测试报告中更好地组织请求,从而更清晰地了解每个业务操作的性能。如,在一个电子商务网站中,我们可以将“登录”、“浏览商品”、“添加购物车”、“结算”等操作分别定义为分组或事务,这样在报告中我们就可以看到每个操作的性能指标。
在聚合报告中的应用:
在Gatling生成的报告中,分组(事务)会作为一个单独的条目出现,并显示该分组的总执行时间、请求数、成功率等。这有助于我们快速定位性能瓶颈所在的业务步骤。
下面通过一个具体的代码示例来说明如何使用group和exec。
假设我们要测试一个简单的场景:用户登录后查看首页。我们可以将登录和首页请求分别放在两个分组中。
示例代码(使用Scala):
scala
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation {
val httpProtocol = http
.baseUrl("http://zmtests.com")
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.doNotTrackHeader("1")
.acceptLanguageHeader("en-US,en;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0")
val scn = scenario("BasicSimulation")
.exec(
group("Login") {
exec(http("Login Request")
.get("/login")
.check(status.is(200)))
.exec(http("Do Login")
.post("/login")
.formParam("username", "user")
.formParam("password", "password")
.check(status.is(200)))
}
)
.exec(
group("HomePage") {
exec(http("Home Page Request")
.get("/home")
.check(status.is(200)))
}
)
setUp(
scn.inject(atOnceUsers(1))
).protocols(httpProtocol)
}
在上面的代码中,我们定义了两个分组:"Login"和"HomePage"。"Login"分组中包含两个请求:一个是GET请求到登录页面,另一个是POST请求执行登录。"HomePage"分组中有一个请求:获取首页。
当运行这个测试后,Gatling的报告会分别显示"Login"和"HomePage"分组的性能数据。
注意:分组是可以嵌套的,例如我们可以在"Login"分组内再定义子分组,比如将GET和POST请求分别放在不同的子分组中。
关于事务,在Gatling中,我们通常用分组来代表一个事务。但是,请注意,分组并不会自动将组内的所有请求视为一个事务(即,不会因为组内一个请求失败而标记整个事务失败)。如果你需要实现事务的概念(即一组请求要么全部成功,要么全部失败),你需要自己通过检查每个请求的响应状态来实现,并且可能需要在组内使用条件语句来处理失败情况。
此外,Gatling提供了一个transaction方法,但在新版本中已被标记为弃用,它实际上是通过group实现的。所以我们建议直接使用group。
总结:
使用group方法可以将多个请求组合在一起,在报告中形成独立的统计条目。
分组可以嵌套,从而可以构建更复杂的场景层次。
通过分组,我们可以更清晰地分析每个业务步骤的性能。