Jmeter在性能測試中的應用實踐樣例

Jmeter在某項目中進行性能測試中的應用實踐樣例java

 前段時間再次作了一次實踐,基於JMeter進行了一下性能測試。昨天簡要整理了一下,寫了一篇文檔,如今分享於此。 ios

編制web

念槐聚spring

日期shell

2016-01-26apache

審覈api

 

日期spring-mvc

 

發佈bash

 

日期mvc

 

發佈

 

日期

 

 

變動記錄 

*修訂類型分爲 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>
View Code

 

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); } }
View Code

 

 

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; } }
View Code

 

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
View Code

 

因爲是先編寫了word文檔,到這裏格式可能略有變化。

轉載請註明出處:http://cnblogs.com/haochuang/,謝謝。

相關文章
相關標籤/搜索