Gatling 是一款基于 Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试;想使用 Gatling 进行压测的原因之一是想体验一下 Scala 编程的感觉,玩一下;第二,工作上也确实有这样的需求;
压测工作简单来说就是利用压测应用,来测试一下服务器的响应性能参数;然后把这些工作全部自动化,集成到 jenkins 中来运行。
整个工作的子任务分解可以由下图来表示:
压测使用的是一个常见的 web 应用,该 web 应用的具体使用的业务场景如下:
针对该应用的压测 Scala 源代码如下:
文件名:performance.scala
package performance
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._
class Performance extends Simulation {
//用户名、餐馆ID 存储文件
val user = csv("/root/.jenkins/workspace/testGatling/src/test/scala/data/user.csv").random
val res = csv("/root/.jenkins/workspace/testGatling/src/test/scala/data/restaurant.csv").random
val ip = csv("/root/.jenkins/workspace/testGatling/src/test/scala/data/ip.csv").random
val httpProtocol = http
.baseURL("http://${ip}:8180")
val headers_0 = Map("Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
val scn = scenario("Emenu")
//打开订餐首页
.exec(http("index")
.get("/E_Menu/userlogin/login.jsp")
.headers(headers_0))
//登录
.pause(1 second,20 second)
.feed(user)
.feed(res)
.exec(http("login")
.post("/E_Menu/userlogin/login")
.headers(headers_0)
.formParam("username", "${username}")
.formParam("password", "${password}")
)
//选择餐馆
.pause(1 second,20 second)
.exec(http("menu")
.get("/E_Menu/menu.action?res_num=${rest_id}")
.headers(headers_0)
)
//点菜
.pause(1 second,20 second)
.exec(addCookie(Cookie("username", "${username}")))
.exec(addCookie(Cookie("res_num", "${rest_id}")))
.exec(addCookie(Cookie("food_num0", "105")))
.exec(addCookie(Cookie("food_num1", "104")))
.exec(addCookie(Cookie("food_num2", "104")))
.exec(addCookie(Cookie("food_num3", "106")))
.exec(addCookie(Cookie("total", "52")))
.exec(http("list") //点完菜,开始订
.get("/E_Menu/list.action")
.headers(headers_0)
)
//下单
.pause(1 second,20 second)
.exec(http("order")
.get("/E_Menu/order.action?people=5&time=2025-08-31")
.headers(headers_0)
)
// //回首页
.pause(1 second,20 second)
.exec(http("restaurant")
.get("/E_Menu/restaurant.action")
.headers(headers_0)
)
//用户信息
.pause(1 second,20 second)
.exec(http("userinfo")
.get("/E_Menu/userinfo?username=${username}")
.headers(headers_0)
)
//我的订单
.pause(1 second,20 second)
.exec(http("userorder")
.get("/E_Menu/userorder.action?username=${username}")
.headers(headers_0)
)
//退出
.pause(1 second,20 second)
.exec(http("exit")
.get("/E_Menu/userlogin/login.jsp")
.headers(headers_0))
setUp(scn.inject(atOnceUsers(100))).protocols(httpProtocol)
}
写完 scala 代码,并且保证它在本地可以调试通过,下一步就是需要将代码集成进 jenkins;
先确保 jenkins Gatling Plugin 在 jenkins 上被安装;
之后,写入用来执行的 shell 调控代码:
#################### 环境准备 ####################
pwd
export IP="xx.xx.xx.xx"
export user="root"
export pwd="xxxxxxxxxx"
export tomcat_path="/root/apache-tomcat-7.0.56/bin"
export killtomcat="/root/killtomcat.sh"
#################### 定义函数 ####################
kill_tomcat7(){
expect -c "
spawn ssh $user@$IP sh $killtomcat;
expect {
yes/no { send yes\r;exp_continue }
*password: { send $pwd\r }
};
expect eof;
"
}
start_tomcat(){
expect -c "
spawn ssh $user@$IP sh $tomcat_path/$1;
expect {
yes/no { send yes\r;exp_continue }
*password: { send $pwd\r }
};
expect eof;
"
}
#################### tomcat 压测 ####################
kill_tomcat7
start_tomcat startup_non.sh
mvn gatling:execute -Dgatling.simulationClass=performance.Performance
#################### 完毕 ####################
参考截图如下:
在完成调试改 bug 工作之后,可以尝试运行一下,得到压测结果 Gatling report ,然后可以进行相关的数据分析,这里不再赘述。
Jenkins 集成 Gatling Report 参考截图如下: