Gatling HTTP DSL中请求方法的解析。
一、Gatling HTTP DSL 基础架构
Gatling的HTTP测试脚本遵循“协议配置 -> 场景定义 -> 模拟注入”的三段式结构。DSL的入口是http(requestName: String),它返回一个HttpRequestBuilder,后续所有方法调用(如.get、.post)都在此基础上进行链式构建。
二、HTTP方法全解析
列出了Gatling支持的HTTP方法、功能及典型应用场景。
1.http:请求构建入口。http("请求名称"),请求名称用于在报告中标识该请求,应全局唯一。所有HTTP请求的起点。
head:发送HEAD请求。.head("/api/health"),和GET类似,但不检查响应体。检查资源是否存在、获取头部信息(如ETag, Content-Length)。
get:发送GET请求。.get("/users/${userId}"),支持路径参数和查询参数(.queryParam("key", "value"))。 获取资源信息(查询、详情)。
post:发送POST请求。.post("/users"),1. 表单:.formParam("name", "value")
2. JSON:.body(StringBody("""{"key":"value"}""")).asJson,创建新资源、提交表单、触发操作。
put:发送PUT请求。.put("/users/${userId}"),通常用于完整更新资源,请求体构建方式和POST相同。更新已知ID的完整资源信息。
delete:发送DELETE请求。.delete("/users/${userId}"),通常不附带请求体。删除指定资源。
patch:发送PATCH请求。.patch("/users/${userId}") ,通常用于部分更新,请求体构建方式和POST相同。对资源进行局部修改。
httpRequest:通用方法,动态指定HTTP动词。.httpRequest("GET", "/"),第一个参数为方法名(字符串),第二参数为URL。当HTTP方法需要根据运行时条件动态决定时使用。
三、构建完整HTTP请求
一个专业的HTTP请求定义不止指定方法,一般包含以下:
1. 配置基础协议
在Simulation类中预先定义公共配置(如基础URL、公共头),所有场景中的请求将自动继承。
scala
val httpProtocol = http
.baseUrl("http://api.zmtests.com") // 基础URL
.acceptHeader("application/json")
.userAgentHeader("Gatling/3.9")
.disableWarmUp // 可禁用预热
2. 设计测试场景 (Scenario)
场景由exec(执行操作)和pause(模拟用户停顿)组成。可以将复杂的请求链拆分为可复用的对象或链。
scala
object UserActions {
val createUser = exec(
http("创建用户")
.post("/users")
.body(ElFileBody("templates/user.json")).asJson // 使用模板文件
.check(status.is(201)) // 断言:状态码为201
.check(jsonPath("$.id").saveAs("newUserId")) // 提取响应ID并存入会话
)
}
val scn = scenario("用户生命周期")
.exec(UserActions.createUser)
.pause(2 seconds)
.exec(
http("查询刚创建的用户")
.get("/users/${newUserId}") // 使用之前保存的变量
.check(status.is(200))
)
3. 设置断言和响应验证
验证响应是性能测试的重点。Gatling提供强大的checkAPI。
scala
.exec(http("请求详情")
.get("/items/${itemId}")
.check(
status.in(200 to 299), // 断言状态码在200-299之间
jsonPath("$.price").ofType[Double].lte(100.0), // 断言JSON路径值小于等于100
header("Content-Type").is("application/json")
)
)
4. 注入和执行 (setUp)
将场景和负载模型(注入策略)结合,并指定协议。
scala
setUp(
scn.inject(
nothingFor(5 seconds), // 等待
rampUsers(100) during (30 seconds), // 30秒内逐步增加100用户
constantUsersPerSec(20) during (2 minutes) // 随后2分钟保持20用户/秒
)
).protocols(httpProtocol) // 应用协议配置
四、高级场景
要模拟真实用户行为,需要组合使用以下技术:
参数化和数据驱动:使用feeder(如CSV文件)为虚拟用户提供动态测试数据。
流程控制:使用doIf、doIfEquals、doSwitch、randomSwitch等控制执行流。
循环和重复:使用repeat、during、foreach模拟重复操作。
响应提取和链式依赖:使用check配合jsonPath、css等提取器,将响应中的值存入会话(Session),供后续请求使用,建立请求间的依赖关系。
五、实践建议
代码组织:采用页面对象模式(Page Object Pattern) 或操作对象模式,将请求定义、场景、协议配置、测试数据分层管理,来提高脚本的可维护和复用。
性能调优:避免在脚本中使用println等同步输出;合理设置检查点,只验证重要数据来减少性能开销。
报告:重点关注响应时间百分位数(如p95, p99)、请求成功率和吞吐量等主要指标,这些比平均响应时间更能反映真实用户体验。
掌握Gatling HTTP DSL的重点在于理解基于构建器模式(Builder Pattern) 的链式调用,并熟练运用会话(Session) 来管理状态,通过检查(Check) 来验证和提取数据,构建出模拟真实用户行为的复杂负载测试场景。