使用JMeter的Java請求功能測試Hetty性能

1.JMeter介紹

JMeter是Apache組織的開放源代碼項目,它是功能和性能測試的工具,100%的用java實現。JMeter能夠用於測試靜態或者動態資源的性能(文件、Servlets、Perl腳本、java對象、數據庫和查詢、ftp服務器或者其餘的資源)。JMeter用於模擬在服務器、網絡或者其餘對象上附加高負載以測試他們提供服務的受壓能力,或者分析他們提供的服務在不一樣負載條件下的總性能狀況。 java

2.啓動JMeter

進入JMeter的bin目錄,而後執行: 數據庫

sudo ./jmeter.sh

3.原始的測試方法

在沒有使用JMeter前,我對hetty的性能測試,都是經過本身寫多線程代碼去完成的,至關苦逼,至關麻煩,不過也能鍛鍊本身的編碼能力,我先貼出比較原始的測試方法,以下: api

public class RpcHessianClient {
	
        public static void main(String[] args) {
	
                String url = "http://localhost:8081/apis/hello";
	
                HessianProxyFactory factory = new HessianProxyFactory();
	
                ExecutorService es = Executors.newFixedThreadPool(10);
	
                int size = 1000000;
	
                final CountDownLatch cdl = new CountDownLatch(size);
	
                try {
	
                        long start = System.currentTimeMillis();
	
                        factory.setUser("client1");
	
                        factory.setPassword("client1");
	
                        factory.setOverloadEnabled(true);
	
                        final Hello basic = (Hello) factory.create(Hello.class,

                                        url);
	
                        for (int i = 0; i < size; i++) {

                                es.submit(new Runnable() {
	
                                        @Override

                                        public void run() {

                                                String u=basic.hello("guolei");
	
                                                //System.out.println(u);
	
                                                cdl.countDown();
	
                                        }
	
                                });

                        }
                        cdl.await();
                        long time = System.currentTimeMillis() - start;

                        System.out.println("SayHello:");

                        System.out.println("耗時:" + (double) time / 1000 + " s");
	
                        System.out.println("平均:" + ((double) time) / size +" ms");

                        System.out.println("TPS:" + (double) size / ((double) time / 1000));
	
                        // System.out.println("Hello, " + s.getMail());

                } catch (MalformedURLException e) {
	
                        e.printStackTrace();
	
                } catch (InterruptedException e) {

                        e.printStackTrace();
	
                }finally{

                        es.shutdown();
                }
        }
}

4.使用JMeter來進行現代化測試

咱們要使用JMeter來測試hetty,因爲hetty是一款基於hessian和netty的RPC產品,咱們必須使用JMeter的JAVA請求功能來進行測試,Java請求是指JMeter對Java Class進行性能測試。首先咱們須要編寫測試用例: 服務器

1)新建JAVA工程。 網絡

2)引入ApacheJMeter_java.jar 、ApacheJMeter_core.jar以及測試所須要的jar(jar包在JMeter目錄的lib/ext目錄中)。 多線程

3)繼承AbstractJavaSamplerClient類開始編寫主業務。以下: ide

public class HettyTest extends AbstractJavaSamplerClient {

	private static String label = "hettyTest";

	/**
	 * 執行runTest()方法前會調用此方法,可放一些初始化代碼
	 */
	public void setupTest(JavaSamplerContext arg0) {
	}

	/**
	 * JMeter測試用例入口
	 */
	public SampleResult runTest(JavaSamplerContext arg0) {
		SampleResult sr = new SampleResult();
		sr.setSampleLabel(label);
		try { // 這裏調用咱們要測試的java類,這裏我調用的是一個Test類
			Map<String,String> map = getDefaultParameters().getArgumentsAsMap();
			sr.sampleStart(); // 記錄程序執行時間,以及執行結果
			Test.execute(map.get("ip"),map.get("port"));
			sr.sampleEnd();
			sr.setSuccessful(true);
		} catch (Throwable e) {
			sr.setSamplerData(e.getMessage());
			e.printStackTrace();
			sr.setSuccessful(false); // 用於設置運行結果的成功或失敗,若是是"false"則表示結果失敗,不然則表示成功
		} 
		return sr;
	}

	/**
	 * JMeter界面中可手工輸入參數,代碼裏面經過此方法獲取
	 */
	public Arguments getDefaultParameters() {

		Arguments args = new Arguments();
		args.addArgument("ip", "localhost");
		args.addArgument("port", "8081");
		return args;
	}

	/**
	 * 執行runTest()方法後會調用此方法.
	 */
	public void teardownTest(JavaSamplerContext arg0) {
	}

}
Test類是我測試邏輯,以下:
public class Test {

	public static void execute(String ip,String port) throws MalformedURLException {
		
		
		String url = "http://"+ip+":"+port+"/apis/hello";

		HessianProxyFactory factory = new HessianProxyFactory();

		factory.setUser("client1");

		factory.setPassword("client1");

		factory.setOverloadEnabled(true);

		final Hello basic = (Hello) factory.create(Hello.class, url);

		//System.out.println("SayHello:" + basic.hello("guolei"));
	}
}

代碼中都有註釋,按照註釋實際操做去理解。  System.out等的輸出會顯示在啓動JMeter時的命令窗口內,但過多的輸出會影響性能的準確性。 工具


4)將項目打爲jar包,放到JMeter目錄下的lib/ext下(將項目依賴的jar也放到此目錄)。
性能

5)重啓JMeter。 測試

5.JMeter使用

1)選中主界面左側的「測試計劃」,右鍵菜單->添加->Threads(Users)->線程組。

2)再選中剛纔新增的"線程組",右鍵菜單->添加->Sampler->Java請求。

3)再選中剛纔新增的"Java請求",右鍵菜單->添加->監視器->聚合報告。

4)Ctrl + R,開始運行, Ctrl + E,清除歷史結果。

6.查看測試結果


聚合報告中基本已經包含咱們所關心的幾個數據了:

Samples -- 本次場景中一共完成了多少個Transaction

Average -- 平均響應時間

Median -- 統計意義上面的響應時間的中值

90% Line -- 全部transaction中90%的transaction的響應時間都小於xx

Min -- 最小響應時間

Max -- 最大響應時間

PS: 以上時間的單位均爲ms

Error -- 出錯率

Troughput -- 吞吐量,單位:transaction/sec

KB/sec -- 以流量作衡量的吞吐量

相關文章
相關標籤/搜索