将GatlingBundle容器化,并通过参数化来执行压测
一、制作GatlingBundle镜像
1.下载GatlingBundle
gatling-charts-highcharts-bundle-3.3.1-bundle
2.将包解压后,存放到服务器(已经安装docker)上,并制作镜像。
a.在服务器上准备类似路径A【/usr/local/dockerapp/gatlingbundle】
b.将gatling-charts-highcharts-bundle-3.3.1-bundle文件夹存放在A路径下
c.在A路径下新建文件Dockerfile,并输入下面内容
FROM primetoninc/jdk:1.8
#校对时钟
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
WORKDIR /usr/local
ADD gatling-charts-highcharts-bundle-3.3.1 /usr/local/gatling331
d.在A目录下,执行下面命令,制作镜像
docker build -t dockerapp_gatling_i:1.1 .
如果需要删除,使用命令docker rmi dockerapp_gatling_i:1.1来删除
二、基于GatlingBundle镜像,制作执行镜像
a.在服务器上准备类似路径B【/usr/local/dockerapp/gatlingexec】
b.在B目录下创建两个文件夹results和user-files,其中user-files下再创建如下图目录结构
c.在B目录下新建文件Dockerfile,并输入下面内容
FROM dockerapp_gatling_i:1.1
WORKDIR /usr/local/gatling331/bin
ENTRYPOINT ["./gatling.sh","-s"]
d.在B目录下,执行下面命令,制作镜像
docker build -t exec_gatling_i:1.1 .
如果需要删除,使用命令docker rmi exec_gatling_i:1.1来删除
三、编写Gatling脚本(参数化)
脚本路径【/usr/local/dockerapp/gatlingexec/user-files/simulations/computerdatabase/ApiGatlingSimulationTest.scala】
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class ApiGatlingSimulationTest extends Simulation{
//从JAVA_OPTS中获取值,这是Gatling参数化的使用方法。
val nbUsers = Integer.getInteger("users", 1)
val myRamp = java.lang.Long.getLong("ramp", 0L)
val during = java.lang.Long.getLong("during", 0L)
//设置请求的根路径
val httpConf = http.baseUrl("http://172.20.0.84:13800")
/*
运行during秒 默认单位秒,如果要用微秒 during(100 millisecond)
*/
val scn = scenario("paycenter").during(during){
exec(http("cardbing")
.post("/payTrade/card/getCardBin")
.header("Content-Type","application/json; charset=utf-8")
.formParam("cardNo","622202100101234555"))
}
//注入并发数
setUp(scn.inject(rampUsers(nbUsers) during (myRamp)).protocols(httpConf))
}
四、编写执行shell脚本
脚本路径 【/usr/local/dockerapp/gatlingexec/exec.sh】,使用chmod 755 exec.sh命令,修改权限
#!/bin/bash
exit_shell(){
echo "**************exit*************"
echo $1
echo " "
echo " "
exit 1
}
paramNum=$#
users=$1
ramp=$2
during=$3
scriptName=$4
judgeParamsNum(){
echo "~~~~~~~~~~~~~judgeParamsNum~~~~~~~~~~~~~"
num=$1
if [ $num != 4 ]
then
echo "USAGE: users ramp during scriptName"
exit_shell " e.g.: ./exec.sh 30 10 1000 ApiGatlingSimulationTest"
fi
echo "the number of params is "$num
}
echo "~~~~~~~~~~~~~Main~~~~~~~~~~~~~~~~~~~~"
judgeParamsNum $paramNum
echo "~~~~~~~~~~~~~Generate Container Name~~~~~~~~~~~~~~~~~~~~"
c_name="exec_gatling_c"$RANDOM
echo $c_name
echo "~~~~~~~~~~~~~java_opts config~~~~~~~~~~~~~~~~~~~~"
java_opts="-Dusers=${users} -Dramp=${ramp} -Dduring=${during} "
echo $java_opts
echo "~~~~~~~~~~~~~exec~~~~~~~~~~~~~~~~~~~~"
docker run --rm -e JAVA_OPTS="${java_opts}" \
-v /usr/local/dockerapp/gatlingexec/results:/usr/local/gatling331/results \
-v /usr/local/dockerapp/gatlingexec/user-files:/usr/local/gatling331/user-files \
--name ${c_name} exec_gatling_i:1.1 ${scriptName}
五、执行脚本
#exec.sh 需要四个参数
##users:并发数
##ramp:坡度(单位s)
##during:持续时间(单位s)
##scriptName:Gatling脚本类名
在B目录下执行命令:./exec.sh 30 10 100 ApiGatlingSimulationTest
六、查看Gatling报告
为了方便查看报告,可以利用httpd,搭建一套简易的文件服务器,让浏览器可以访问到results目录(/usr/local/dockerapp/gatlingexec/results)。安装参考(https://www.cnblogs.com/zhuyeshen/p/11693362.html)
总结
1.GatlingBundle容器化后,可以随时启动一个容器去执行压测,执行完成后,容器自动被删除,只留下压测报告。
2.可以参数化执行后,就可以远程调用,便于接入测试平台。
本文来自博客园,作者:月色深潭,交流群:733423266,转载请注明原文链接:https://www.cnblogs.com/moonpool/p/13533785.html