一个简单的Gatling登录并获取token值进行关联的例子
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class TestDemo extends Simulation {
val user_params = csv("user_info.csv").random // 随机读取数据进行参数化
var headers_default = // 设置默认的请求头
Map(
"User-Agent" -> "Dalvik/2.1.0 (Linux; U; Android 7.1.1; 1707-A01 Build/NMF26X)",
"Content-Type" -> "application/json; charset=UTF-8",
)
val assert_rsp_status = status.is(200) // 正常HTTP响应码为200
object Login {
val login =
feed(user_params)
.exec(
http("登录")
.post("/auth/user/login_by_phone/")
.headers(headers_default)
.body(StringBody("""{"phone":"${phone}","password":"${passwd}"}""")).asJSON // ${phone},${passwd}为参数化文件user_info.csv第一行的参数字段名,存储在session中,所以可以直接按照格式获取
.check(assert_rsp_status)
.check(jsonPath("$.code").is("0")) // 断言-业务响应码是否为0
.check(jsonPath("$.data").exists.saveAs("resp_login")) // 保存响应的data内容至session中
.check(jsonPath("$.data.ticket").exists.saveAs("ticket")) // 保存响应的ticket值至session中
)
.exec(addCookie(Cookie("ticket", "${ticket}"))) // 为后续的请求设置cookie,key为ticket,value为从响应中获取的ticket值
// 打印 session 的信息
.exec { session =>
println("session:" + session)
println("resp_login :" + session.get("resp_login").as[String])
println("ticket :" + session.get("ticket").as[String])
session
}
}
object Growth {
val growth =
exec(
http("获取成长值")
.get("/growth/exp_record/")
.headers(headers_default)
.check(assert_rsp_status)
.check(jsonPath("$.msg").is("请求成功"))
)
}
val httpProtocol = http
.baseURL("http://XXX.XXX.XXX")
.inferHtmlResources(BlackList(""".*\.css""", """.*\.js""", """.*\.ico""", """.*\.gif""", """.*\.jpeg""", """.*\.jpg""", """.*\.woff""", """.*\.(t|o)tf""", """.*\.png"""), WhiteList(""".*cfmoto.*"""))
.acceptEncodingHeader("gzip")
.userAgentHeader("MOBILE|Android|7.1.1|KLICEN_APP|2.0.0|Dalvik/2.1.0 (Linux; U; Android 7.1.1; 1707-A01 Build/NMF26X)|1080*2016|652de42a1cac4d25|100")
val cfmoto = scenario("android").exec(Login.login, Growth.growth)
setUp(
cfmoto.inject(rampUsers(1) over (1))
).protocols(httpProtocol)
}
user_info.csv的内容为