Jmeter在某項目中進行性能測試中的應用實踐樣例
前段時間再次做了一次實踐,基於JMeter進行了一下性能測試。昨天簡要整理了一下,寫了一篇文檔,現在分享於此。
編制 |
念槐聚 |
日期 |
2016-01-26 |
審核 |
|
日期 |
|
發布 |
|
日期 |
|
發布 |
|
日期 |
|
變更記錄
*修訂類型分為 A - ADDED M - MODIFIED D – DELETED
注:對該文件內容增加、刪除或修改均需填寫此記錄,詳細記載變更信息,以保證其可追溯性
目錄
目錄
1文檔目的:
2 適用范圍:
3 參考文獻:
4 Dubbo接口測試代碼編寫
4.1 創建工程,並導入依賴包
4.2 Jmeter中的case結構(JavaSamplerClient)
4.3 生成class可執行文件
5 Jmeter中進行測試執行
5.1 新建測試計划
5.2配置線程組
5.3添加java請求
5.4添加定時器
5.6添加監控項:Transactions per Second
5.7添加監控項:Transaction Throughtput vs Threads
5.5添加聚合報告
5.8其他擴展:前置處理器
5.9其他擴展:斷言
6. 測試執行
7. 備注
1文檔目的:
本文檔主要對Jmeter在練習測試項目過程中的一次應用實踐,做一簡單描述,對於通過Dubbo接口,經過消息中心的處理與MQ的分發,以及MySQL入庫\下發至網關的整個流程所涉及的測試方法,做一些簡要的說明。
2 適用范圍:
本文檔主要適用於做測試,對JMeter沒有了解過的測試人員,熟悉或已經精通JMeter的人可以忽略。
3 參考文獻:
Jmeter API:
http://jmeter.apache.org/api/
4 Dubbo接口測試代碼編寫
4.1 創建工程,並導入依賴包
依賴包,包含兩部分:一部分是壓測工具Jmeter所需要的依賴包,參見下面截圖
另外一部分,是業務相關的依賴包:jmeter-haotest-server.jar;
將相關lib包放在jmeter的目錄${Jmeter_home}\apache-jmeter-2.13\lib\ext 下面,然后將jar包導入到eclipse中。
配置文件:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="hello-world-consumer" /> <dubbo:registry address="zookeeper://192.168.221.31:2181" /> <!-- <dubbo:registry address="zookeeper://192.168.220.220:2181" /> --> <dubbo:reference id="MsgService" interface="com.haotest.jmeter.lesson1.JMeterSendMsgService" timeout="500000" /> </beans>
4.2 Jmeter中的case結構(JavaSamplerClient)
我們jmeter中的的一個完整case是要繼承JavaSamplerClient這個類,繼承這個類之后,在eclipse 中會自動生成需要重寫的方法,這些方法就是我們這個文檔主要介紹的部分。
如下代碼示例:
實例中添加了這些方法的說明,接下來我會具體介紹每個方法如何完成代碼開發。
TestInit.java:初始化基礎類

package message.center; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.haotest.jmeter.lesson.SendMsgService; public abstract class TestInit extends AbstractJavaSamplerClient { public static ClassPathXmlApplicationContext msgServiceContext = new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" }); public static SendMsgService sendMsgService = (SendMsgService) msgServiceContext.getBean("MsgService"); @Override public void setupTest(JavaSamplerContext context) { // TODO Auto-generated method stub
System.out.println("calling setupTest when initing thread ..."); //setMsgServiceContext(new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" })); //setSendMsgService((SendMsgService)this.getMsgServiceContext().getBean("MsgService"));
super.setupTest(context); } }
JMeterTestSendTemplateMsgByEmail.java:
Dubbo接口類

package message.center; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.haotest.jmeter.lesson.JMeterSendMsgResult; import com.haotest.jmeter.lesson.JMeterSendMsgService; public class JMeterTestSendTemplateMsgByWeChat extends TestInit { /*@Override public void setupTest(JavaSamplerContext context) { // TODO Auto-generated method stub setMsgServiceContext(new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" })); setJMeterSendMsgService((JMeterSendMsgService)this.getMsgServiceContext().getBean("MsgService")); super.setupTest(context); }*/
public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("template_var",""); params.addArgument("app_id", ""); params.addArgument("url", ""); params.addArgument("open_id", ""); //params.addArgument("email_title","");
return params; } @Override public SampleResult runTest(JavaSamplerContext arg0) { // TODO Auto-generated method stub
SampleResult sr = new SampleResult(); String templateVar = arg0.getParameter("template_var"); String appId = arg0.getParameter("app_id"); String url = arg0.getParameter("url"); String openId = arg0.getParameter("open_id"); //String emailTitle = arg0.getParameter("email_title",""); //ClassPathXmlApplicationContext msgServiceContext = new ClassPathXmlApplicationContext(new String[] { "msgCenterConsumer.xml" }); //msgServiceContext.start(); //JMeterSendMsgService JMeterSendMsgService = (JMeterSendMsgService) msgServiceContext.getBean("MsgService");
try { sr.sampleStart();//start transaction in load runner //System.out.println("beginning to call dubbo interface ...");
JMeterSendMsgResult smr = TestSendTemplateMsgByWeChat.JMeterSendMsgService.sendTemplateMsgByWeChat("JMETER_TEST_CODE", appId, templateVar, url, openId, null, null ); if(smr.getCode() == 0) { sr.setSuccessful(true); } else { sr.setSuccessful(false); } //System.out.println("response = " + smr.getMsg());
} catch(Exception e) { e.printStackTrace(); System.out.println("calling dubbo interface failed ... " + e); sr.setSuccessful(false); } finally { sr.sampleEnd(); } return sr; } }
4.3 生成class可執行文件
代碼調通之后,需要重新clean,並run生成編譯后的可執行文件;
然后聯通bin目錄一起copy到Jmeter機器中,標機為 ${jmeter_workspace_home};
5 Jmeter中進行測試執行
相關腳本調試通過之后,可以在壓測工具Jmeter中執行:
啟動D:\apache-jmeter-2.13\bin\jmeter.bat
打開 ${jmeter_workspace_home}\scenarios\JMeterTestSendTemplateMsgByWeChat.jmx
運行,並監控過程的輸入。
下面對前一個過程進行詳細的說明:
5.1新建測試計划
通過“文件”-->“新建”,添加一項測試計划;
5.2配置線程組
如上圖所示,在測試計划中,添加線程組;
5.3添加java請求
在線程組下添加Java請求,如上圖所示。添加結果如下:
在添加后的主窗口中,選擇要測得類,並添加相應的參數。
包括參數的名稱、值;
添加之后,進行保存。
5.4添加定時器
根據需要,有些壓測需要添加定時器,則在線程組中,添加-->定時器-->固定定時器;
結果如下:
根據需要,並進行配置固定定時器的線程延時;
添加結果:
5.6添加監控項:Transactions per Second
測試過程中,我們需要監控相關tps,以及事務處理的線程情況等;
那么可以在監控器中添加相應的項,用以在后續測試執行之后得到相關數據;
如上圖所示,添加之后,在測試執行過程中,實時的tps情況,即可在上表中呈現出來;
5.7添加監控項:Transaction Throughtput vs Threads
Transaction throughtput vs threads的添加方法和tps相同;
監控結果同樣,會在執行過程中實時展現出來;
樣例如下圖:
*********
5.8添加聚合報告
通過選擇 線程組-->監聽器-->聚合報告,添加聚合報告之后,可以在聚合報告中看到總體的結果情況;
聚合報告的樣例如下:
Label |
# Samples |
Average |
Median |
90% Line |
95% Line |
99% Line |
Min |
Max |
Error % |
Throughput |
KB/sec |
TestSendTemplateMsgByWeChat |
9531 |
40 |
22 |
96 |
124 |
188 |
2 |
630 |
0.00% |
55.7 |
0 |
總體 |
9531 |
40 |
22 |
96 |
124 |
188 |
2 |
630 |
0.00% |
55.7 |
0 |
*
********
5.9其他擴展:前置處理器
對於某些場景的測試而言,可能需要准備預埋數據;
而添加前置處理器可以幫助解決這些問題;
5.10其他擴展:斷言
斷言,顧名思義,添加斷言,可以在測試之后,通過斷言,直接驗證和標記case是否通過;
6.測試執行
執行過程中監控相關數據,並得到相關報告。
下面截取部分測試執行的結果樣例;
上圖是一個接口測試的TPS結果圖片;
上圖是一個接口測試的thread情況結果圖片;
7.備注
JMeter的使用有更多的場景;
該文僅僅是一種基本的使用示例,欲了解更多,后續再逐漸補充;
補充服務啟動的一個shell

[haotest@vm-qa-192_168_1_100 haoTestCenter]$ cat message-server/run.sh #!/bin/sh #libPath="/data/app/online/haotest-server/lib" #configPath="/data/app_resource/online/haotest-server" #logpath='/data/logs/haotest-server' #websitePath="." #CLASSPATH=`find $libPath -name *.jar|xargs|sed "s/ /:/g"` #CLASSPATH="$configPath:.:$CLASSPATH" #export CLASSPATH #echo $CLASSPATH pkill -9 -f haotest-lesson-server #sleep 1 source ~/.bash_profile7 #nohup java main.StartOnline > haotest-server.out & java -Xms4072m -Xmx4072m -XX:MaxPermSize=512m -Xss256k \ -Djava.rmi.server.hostname=192.168.1.100 \ -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=6093 \ -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \ -jar haotest-lesson-server.jar >> ./log/haoTestCenter.out & #sleep 10 #tailf $logpath/haotest-server.out tailf ./log/haoTestCenter.out
由於是先編寫了word文檔,到這里格式可能略有變化。
轉載請注明出處:http://cnblogs.com/haochuang/,謝謝。