Day 22 : Docker化Jmeter 与连结Jenkins自动化测试

在一个专案Build完成後,通常会跑一些测试来检测这个专案到底能够承受多少的流量与有没有一些会影响使用者的BUG。上一篇文章我们讲述了如何使用Jmeter,一个好用的压力测试与API测试工具,今天我们来讲一下如何去整合Jenkins与Jmeter,让我们在Build -> Test 一气呵成,同时也产出一目了然的测试报告给主管看。

首先,随然与Jenkins的整合无关,但是如同本次挑战的描述,我们要建立一个被Container包裹的美好世界,Jmeter能不能用Docker实现呢? 是可以的

Jmeter Dockerize

参考自justb4/jmeter
第一步先clone一个repository并执行./build.sh

git clone https://github.com/justb4/docker-jmeter.git
cd docker-jmeter
./build.sh

第二步执行./test.sh来确认一下是否有成功安装,我们来检查一下run.sh的code。

NAME="jmeter"
JMETER_VERSION=${JMETER_VERSION:-"5.4"}
IMAGE="justb4/jmeter:${JMETER_VERSION}"

# Finally run
docker run --rm --name ${NAME} -i -v ${PWD}:${PWD} -w ${PWD} ${IMAGE} $@

可以看到run.sh就是执行一个container,接着检查一下test.sh

export TARGET_HOST="www.map5.nl"
export TARGET_PORT="80"
export TARGET_PATH="/kaarten.html"
export TARGET_KEYWORD="Kaartdiensten"

T_DIR=tests/trivial

# Reporting dir: start fresh
R_DIR=${T_DIR}/report
rm -rf ${R_DIR} > /dev/null 2>&1
mkdir -p ${R_DIR}

/bin/rm -f ${T_DIR}/test-plan.jtl ${T_DIR}/jmeter.log  > /dev/null 2>&1

# **执行jmeter**
./run.sh -Dlog_level.jmeter=DEBUG \
        -JTARGET_HOST=${TARGET_HOST} -JTARGET_PORT=${TARGET_PORT} \
        -JTARGET_PATH=${TARGET_PATH} -JTARGET_KEYWORD=${TARGET_KEYWORD} \
        -n -t ${T_DIR}/test-plan.jmx -l ${T_DIR}/test-plan.jtl -j ${T_DIR}/jmeter.log \
        -e -o ${R_DIR}

echo "==== jmeter.log ===="
cat ${T_DIR}/jmeter.log

echo "==== Raw Test Report ===="
cat ${T_DIR}/test-plan.jtl

echo "==== HTML Test Report ===="
echo "See HTML test report in ${R_DIR}/index.html"

最重要的就是./run.sh那段,他其实就是一个呼叫docker container的指令去进行测试,所以我们只要复制这一段就能在Jenkins上执行docker了。
其中jmeter是根据传入的.jmx档来进行测试的,其中如上看到的如TARGET_HOST的,所以我们专案可以建立一个新的资料夹专门去上传要测试的.jmx文件来进行测试。

Jenkins整合Jmeter

在专案资料夹内新增一个test资料夹来存放你的测试计画,将上一篇所产生的jmx档放入其中,jmx档就是你的测试计画。接着可以模仿test.sh、run.sh,写一个属於你的测试计画,放在test资料夹内。
https://ithelp.ithome.com.tw/upload/images/20211009/201190443UgLsvtPat.png

# 你的test.sh
#!/bin/bash
NAME="jmeter"
JMETER_VERSION=${JMETER_VERSION:-"5.4"}
IMAGE="justb4/jmeter:${JMETER_VERSION}"

T_DIR=test/press1
R_DIR=${T_DIR}/report
JMX_NAME=ThreadGroup

# Reporting dir: start fresh
rm -rf ${R_DIR} > /dev/null 2>&1
mkdir -p ${R_DIR}

/bin/rm -f ${T_DIR}/test-plan.jtl ${T_DIR}/jmeter.log  > /dev/null 2>&1

# **执行jmeter**
docker run --rm --name ${NAME} -i -v ${PWD}:${PWD} -w ${PWD} ${IMAGE} \
-Dlog_level.jmeter=DEBUG  -n -t ${T_DIR}/${JMX_NAME}.jmx -l ${T_DIR}/${JMX_NAME}.jtl \
-j ${T_DIR}/${JMX_NAME}.log -e -o ${R_DIR}

echo "==== jmeter.log ===="
cat ${T_DIR}/${JMX_NAME}.log

echo "==== Raw Test Report ===="
cat ${T_DIR}/${JMX_NAME}.jtl

echo "==== HTML Test Report ===="
echo "See HTML test report in ${R_DIR}/index.html"

完成後我们要在jenkins pipeline里最後加上一个驱动jmeter的区块:

# Jenkinsfile
stage("Test"){
  steps{
    echo "Testing begin testing"
    sh "chmod +x -R ${env.WORKSPACE}" 
    sh "./test/test.sh"
  }
}

完成後git push到github上驱动jenkins自动integrate。


<<:  Day 24. Hashicorp Vault: PKI issue limit

>>:  Unity与Photon的新手相遇旅途 | Day9-第三人称设定

(PYTHON)请问 CKIPtagger 如何断"句"

请问PYTHON的CKIPtagger套件 如何断句? 上网找了都没有看到 ...

30天学会 Python: Day 13-站在巨人的肩上

tags: python, iron_man title: PyDay12 现代的人可以快速得产出...

理解 HTTP(一):网站内容是怎麽被下载到电脑里的?

你是否曾经好奇浏览网页时,输入的网址为什麽都是 http 开头的? 从网路模型 TCP/IP 聊起,...

Day30 实作todoList(五)完成删除事项功能+完赛心得

画面完成後,该怎麽从List.js的回圈元件中的按钮去互叫function, 让function去改...

实用且有效的CISSP考试秘诀!

来自Luke的实用且有效的CISSP考试秘诀! 很棒!! 阅读 (Reading) 作练习题 (Pr...