将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
script

六、查看Gatling报告

为了方便查看报告,可以利用httpd,搭建一套简易的文件服务器,让浏览器可以访问到results目录(/usr/local/dockerapp/gatlingexec/results)。安装参考(https://www.cnblogs.com/zhuyeshen/p/11693362.html)

report

总结

 1.GatlingBundle容器化后,可以随时启动一个容器去执行压测,执行完成后,容器自动被删除,只留下压测报告。
 2.可以参数化执行后,就可以远程调用,便于接入测试平台。

posted @ 2020-08-20 14:29  月色深潭  阅读(462)  评论(0编辑  收藏  举报