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 压测 ####################

停止 tomcat

kill_tomcat7

启动 tomcat

start_tomcat startup_non.sh

mvn gatling:execute -Dgatling.simulationClass=performance.Performance

#################### 完毕 ####################

参考截图如下:

在完成调试改 bug 工作之后,可以尝试运行一下,得到压测结果 Gatling report ,然后可以进行相关的数据分析,这里不再赘述。
Jenkins 集成 Gatling Report 参考截图如下:


↙↙↙阅读原文可查看相关链接,并与作者交流