基於Jmeter和Jenkins搭建效能測試框架

YatHo發表於2016-11-16

搭建這個效能測試框架是希望能夠讓每個人(開發人員、測試人員)都能快速的進行效能測試,而不需要關注效能測試環境搭建過程。因為,往往配置一個效能環境可能需要很長的時間。

1、效能測試流程

該效能測試框架工作的流程主要有:觸發測試–>部署測試指令碼–>部署被測系統–>Jmeter打壓–>被測系統日誌分析,5個階段。 
體現在Jenkins上,就是下面這個jenkins 的MultiJob Project——Performance-test-jobs: 


注意:在選擇Performance-test-jobs的構建步驟時,要選擇Conditional steps(multiple)。

 

下面對該效能測試框架搭建的過程進行詳細的介紹。

2、環境需求

整個測試框架需要以下機器: 
1)jenkins master:用於管理測試機、建立效能測試job、啟動效能測試、展示效能測試結果。 
2)Load generator:用來給被測試伺服器傳送請求,當一臺Load generator傳送的併發請求數達不到測試要求時,可能需要配置多臺。Setup ENV階段的Performance-test-script-deployment以及Run test階段的job都是執行在這機器上的。 
3)被測試伺服器:用於安裝被測試服務的機器,分析被測試服務的log的job也是執行在這個機器上的。 
其中,Load generator和被測試伺服器都是作為slave節點掛載在jenkins master上的。

3、安裝必要軟體

3.1、安裝Jenkins及外掛

安裝Jenkins的步驟,這裡不展開講了。這裡主要介紹一下與效能測試有關的jenkins外掛——Performance Plugin。這個外掛的作用是解析Jmeter生成的測試報告,直觀的展示出來。 
安裝外掛的方法很簡單,登陸Jenkins,在Manage Plugins介面搜尋“Performance Plugin”點選安裝即可。 
如果安裝正確,在效能測試job的配置頁面的 “Add post-build action” 步驟裡面能夠看到 “Publish Performance Test Result Report” 選項。

3.2、Jmeter安裝及配置

在效能測試壓力機上,下載並安裝Jmeter(下載地址:http://jmeter.apache.org/download_jmeter.cgi),解壓到目錄/usr/local。[下載二進位制的] 
之後,下載jmeter-plugins外掛JMeterPlugins-Standard-1.2.0.zip(下載地址http://jmeter-plugins.org/downloads/all/)。 
解壓後將其中的jar包拷貝至jmeter安裝目錄/lib/ext/目錄(如果沒有則建立之)下即可。 
這個外掛的作用是,當通過no-GUI方式執行測試之後,將生成的測試結果檔案*.jtl解析成圖片的形式,比較直觀。

3.3、安裝系統資源監控外掛

為了監控被測伺服器的系統資源,需要在被測試機上安裝ServerAgent,下載ServerAgent-2.2.1.zip(下載地址http://jmeter-plugins.org/downloads/all/),並在被測試機上啟動startAgent.sh。該外掛能夠對伺服器的 CPU、記憶體、Swap、磁碟 I/O、網路 I/O 進行監控!

4、Jmeter GUI上制定測試計劃

我們的測試執行實在Jenkins中通過非GUI方式執行Jmeter壓力測試的。在JmeterGUI上制定測試計劃的目的是,將測試計劃儲存成.jmx檔案,以便能夠在Jmeter的非GUI模式下執行測試。

4.1、建立Thread Group

有三個必須設定的屬性(見下圖紅框部分),這裡採用函式__P()設定屬性名和預設值的形式設定這三個屬性,以方便在使用no-GUI模式啟動Jmeter進行測試時,使用–jmeterproperty選項對屬性值進行賦值。 

 

4.2、新增HTTP Request

由於我們的測試是傳送HTTP請求給Serving伺服器,因此這裡選擇新增的Sampler是HTTP Request。 
這裡需要新增被測伺服器的域名或者網址,這裡也採用函式__P()設定屬性名和預設值的形式設定這個屬性。 


另外,還要設定請求的具體地址Path。由於我們測試過程中請求的網址是不一樣的。因此需要需要對這個Path進行引數化,指定為變數${path}。又由於我們請求的網址是存放到一個叫作path.log的檔案中的。因此,引數化的方法適宜採用CSV Data Set Config。這裡Filename我們設定為屬性UrlFile,該屬性可以在使用no-GUI模式啟動Jmeter進行測試時,使用–jmeterproperty選項指定具體的檔案。 

 

4.3、新增Listener

在TestPlan上右擊,Add–>Listener–>Aggregate Report。 
另外,新增了PerfMon Metrics Collector的Listner,來收集被測試機的CPU,memory資訊。 

 

 


可以指定將report儲存到某個檔案,如上圖中所示儲存到jtl檔案,在非GUI模式下執行Jmeter這是非常必要的。

 

4.4、生成測試計劃jmx檔案

一切設定妥當之後,點選選單欄上的File->Save Test Plan As. 
此步驟可以將該Test Plan儲存為.jmx格式的檔案。該檔案用來進行non-GUI方式進行Jmeter測試。 

 

5、non-GUI方式執行Jmeter

non-GUI方式執行Jmeter的命令:

jmeter.sh -n -t test.jmx -l result.jtl \
--jmeterproperty threadCount=${CONCURRENCY} \
--jmeterproperty LoopCount=${LOOPCOUNT} \
--jmeterproperty adclient=${SERVER} \
--jmeterproperty UrlFile=path.log \
--jmeterproperty RampUp=${RAMPUP} \
--jmeterproperty throughput=${THROUGHPUT} 

說明: 
-n 非 GUI 模式 -> 在非 GUI 模式下執行 JMeter 
-t 測試檔案 -> 要執行的 JMeter 測試指令碼檔案 
-l 日誌檔案 -> 記錄結果的檔案 
–jmeterproperty設定test.jmx中的屬性(見“Jmeter GUI上制定測試計劃”部分)

6、生成報告圖表

我們可以通過Jenkins上安裝的JMeterPlugins-Standard外掛來將測試結果檔案.jtl格式的檔案解析成圖表。

$JMETEREXT= /usr/local/apache-jmeter-2.13/lib/ext
java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter \
--generate-png ResponseTimesOverTime.png --input-jtl result.jtl  --plugin-type ResponseTimesOverTime

java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter \
--generate-png CPU.png --input-jtl cpu.jtl  --plugin-type PerfMon

java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter \
--generate-png MEM.png --input-jtl  mem.jtl  --plugin-type PerfMon

java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter \
--generate-png TransactionsPerSecond.png --input-jtl  trans.jtl  --plugin-type TransactionsPerSecond

7、job shell設定

Jenkins的job中通過引數傳遞給jmeterproperty中的變數中。 
Execute shell的內容:

source /etc/profile
THROUGHPUT=`expr 60 \* ${QPS}`
RUNFOLDER=/usr/local/jmeter-demo/src/test/jmeter
JMETERBIN=/usr/local/apache-jmeter-2.13/bin
JMETEREXT=/usr/local/apache-jmeter-2.13/lib/ext
RESULTJTL=$RUNFOLDER/result.jtl
CPUJTL=$RUNFOLDER/cpu.jtl
MEMJTL=$RUNFOLDER/mem.jtl
TRANSJTL=$RUNFOLDER/trans.jtl
rm -f $RUNFOLDER/path.log
rm -f $RUNFOLDER/*.jtl
rm -f $RUNFOLDER/*.png
rm -f $WORKSPACE/*.png
rm -f $WORKSPACE/*.jtl

cd /usr/local/jmeter-demo/src/test/jmeter && python appending.py ${APPENDING}

cd /usr/local/jmeter-demo/src/test/jmeter && $JMETERBIN/jmeter.sh -n -t test.jmx -l result.jtl \
--jmeterproperty threadCount=${CONCURRENCY} \
--jmeterproperty LoopCount=${LOOPCOUNT} \
--jmeterproperty adclient=${SERVER} \
--jmeterproperty UrlFile=path.log \
--jmeterproperty RampUp=${RAMPUP} \
--jmeterproperty throughput=${THROUGHPUT} 

java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter --generate-png ${RESULTJTL%.*}_ResponseTimesOverTime.png --input-jtl  $RESULTJTL  --plugin-type ResponseTimesOverTime

java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter --generate-png ${CPUJTL%.*}_CPU.png --input-jtl  $CPUJTL  --plugin-type PerfMon
java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter --generate-png ${MEMJTL%.*}_MEM.png --input-jtl  $MEMJTL  --plugin-type PerfMon
java -jar $JMETEREXT/CMDRunner.jar  --tool Reporter --generate-png ${TRANSJTL%.*}_TransactionsPerSecond.png --input-jtl  $TRANSJTL  --plugin-type TransactionsPerSecond

cp /usr/local/jmeter-demo/src/test/jmeter/*.png $WORKSPACE
cp /usr/local/jmeter-demo/src/test/jmeter/result.jtl $WORKSPACE

  本文轉自:http://blog.csdn.net/liuchunming033/article/details/52186157 感謝分享

相關文章