使用JMeter的Java請求功能測試Hetty性能
1.JMeter介紹
JMeter是Apache組織的開放源代碼項目,它是功能和性能測試的工具,100%的用java實現(xiàn)。JMeter可以用于測試靜態(tài)或者動態(tài)資源的性能(文件、Servlets、Perl腳本、java對象、數(shù)據(jù)庫和查詢、ftp服務(wù)器或者其他的資源)。JMeter用于模擬在服務(wù)器、網(wǎng)絡(luò)或者其他對象上附加高負(fù)載以測試他們提供服務(wù)的受壓能力,或者分析他們提供的服務(wù)在不同負(fù)載條件下的總性能情況。
2.啟動JMeter
進(jìn)入JMeter的bin目錄,然后執(zhí)行:
sudo ./jmeter.sh
3.原始的測試方法
在沒有使用JMeter前,我對hetty的性能測試,都是通過自己寫多線程代碼去完成的,相當(dāng)苦逼,相當(dāng)麻煩,不過也能鍛煉自己的編碼能力,我先貼出比較原始的測試方法,如下:
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來進(jìn)行現(xiàn)代化測試
我們要使用JMeter來測試hetty,由于hetty是一款基于hessian和netty的RPC產(chǎn)品,我們必須使用JMeter的JAVA請求功能來進(jìn)行測試,Java請求是指JMeter對Java Class進(jìn)行性能測試。首先我們需要編寫測試用例:
1)新建JAVA工程。
2)引入ApacheJMeter_java.jar 、ApacheJMeter_core.jar以及測試所需要的jar(jar包在JMeter目錄的lib/ext目錄中)。
3)繼承AbstractJavaSamplerClient類開始編寫主業(yè)務(wù)。如下:
public class HettyTest extends AbstractJavaSamplerClient { private static String label = "hettyTest"; /** * 執(zhí)行runTest()方法前會調(diào)用此方法,可放一些初始化代碼 */ public void setupTest(JavaSamplerContext arg0) { } /** * JMeter測試用例入口 */ public SampleResult runTest(JavaSamplerContext arg0) { SampleResult sr = new SampleResult(); sr.setSampleLabel(label); try { // 這里調(diào)用我們要測試的java類,這里我調(diào)用的是一個Test類 Map<String,String> map = getDefaultParameters().getArgumentsAsMap(); sr.sampleStart(); // 記錄程序執(zhí)行時間,以及執(zhí)行結(jié)果 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); // 用于設(shè)置運(yùn)行結(jié)果的成功或失敗,如果是"false"則表示結(jié)果失敗,否則則表示成功 } return sr; } /** * JMeter界面中可手工輸入?yún)?shù),代碼里面通過此方法獲取 */ public Arguments getDefaultParameters() { Arguments args = new Arguments(); args.addArgument("ip", "localhost"); args.addArgument("port", "8081"); return args; } /** * 執(zhí)行runTest()方法后會調(diào)用此方法. */ 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時的命令窗口內(nèi),但過多的輸出會影響性能的準(zhǔn)確性。
代碼中都有注釋,按照注釋實際操作去理解。 System.out等的輸出會顯示在啟動JMeter時的命令窗口內(nèi),但過多的輸出會影響性能的準(zhǔn)確性。
4)將項目打為jar包,放到JMeter目錄下的lib/ext下(將項目依賴的jar也放到此目錄)。
5)重啟JMeter。
5.JMeter使用
1)選中主界面左側(cè)的“測試計劃”,右鍵菜單->添加->Threads(Users)->線程組。
2)再選中剛才新增的"線程組",右鍵菜單->添加->Sampler->Java請求。
3)再選中剛才新增的"Java請求",右鍵菜單->添加->監(jiān)視器->聚合報告。
4)Ctrl + R,開始運(yùn)行, Ctrl + E,清除歷史結(jié)果。
6.查看測試結(jié)果
聚合報告中基本已經(jīng)包含我們所關(guān)心的幾個數(shù)據(jù)了:
Samples -- 本次場景中一共完成了多少個Transaction
Average -- 平均響應(yīng)時間
Median -- 統(tǒng)計意義上面的響應(yīng)時間的中值
90% Line -- 所有transaction中90%的transaction的響應(yīng)時間都小于xx
Min -- 最小響應(yīng)時間
Max -- 最大響應(yīng)時間
PS: 以上時間的單位均為ms
Error -- 出錯率
Troughput -- 吞吐量,單位:transaction/sec
KB/sec -- 以流量做衡量的吞吐量
posted on 2013-11-25 10:38 順其自然EVO 閱讀(1779) 評論(0) 編輯 收藏 所屬分類: jmeter and badboy