qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          使用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

          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 马尔康县| 天祝| 方城县| 阿拉尔市| 泰来县| 彩票| 靖边县| 南澳县| 木兰县| 稻城县| 深泽县| 大邑县| 拜泉县| 金山区| 修武县| 江北区| 梧州市| 昌邑市| 辽源市| 韩城市| 永修县| 马边| 龙里县| 泗水县| 淄博市| 邵阳县| 顺义区| 佛山市| 抚宁县| 鄄城县| 红河县| 伊金霍洛旗| 格尔木市| 远安县| 通道| 鄄城县| 乐亭县| 太湖县| 明光市| 林甸县| 广昌县|