JMeter接口自動化發包與示例


JMeter接口自動化發包與示例

近期需要完成對於接口的測試,於是了解並簡單做了個測試示例,看了看這款江湖上聲名遠播的強大的軟件-Jmeter靠不靠譜。
官網:https://jmeter.apache.org/index.html

1簡介

  • Apache-Jmeter是一個使用java語言編寫且開源,可拓展性較強的測試框架,設計初期用於web應用的壓力性能測試較多,但現在功能已經非常豐富,不僅是壓力,而目前的接口自動化都可以使用該工具完成
  • 本次需求只依據業務,簡單設置定時任務,往指定的接口發送接口數據,對接口返回數據做assert斷言判斷結果,體驗一下該軟件與postman有何差異。

2結構

Jmeter左上角點擊文件-新建,即生成一個測試計划,相當於一個project,並創建以下層級結構

  • 聚合報告

    查看該測試計划的執行結果報告,每個執行的接口都統計在這,如果是做壓力測試的話,就可以得出很多次執行的一個接口的性能情況。

  • 查看結果樹

    查看每個測試接口的執行情況,包括該接口實際發送的包以及接口的響應都可以在這看到。

  • Http信息頭管理器

    消息頭信息可以在這里定義,沒定義就是按照默認的頭發包。

  • setUp線程組

    該線程組在整個項目的自動化時,可以將部分鑒權接口、參數生成與配置等放入該模塊,以便確保該模塊優先執行。

  • 線程組

    • 前置預處理程序

      這里我選擇beanshell預處理程序,構造后面接口發的數據,可以看到腳本上邊有個tips(scripts variable:ctx vars props prev sampler log),即Jmeter提示在編寫腳本的時候可以使用ctx、vars等類去調用相應的API,這些值比如ctx的具體用法可到官網:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html,常見的API:

      - ctx - ( [JMeterContext ](http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html)) - gives access to the context
      - vars - ( [JMeterVariables ](http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html)) - gives read/write access to variables: vars.get(key); vars.put(key,val); vars.putObject("OBJ1",new Object()); vars.getObject("OBJ2");
      - props - (JMeterProperties - class java.util.Properties) - e.g. props.get("START.HMS"); props.put("PROP1","1234");
      - prev - ( [SampleResult ](http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html)) - gives access to the previous SampleResult (if any)
      - sampler - (Sampler)- gives access to the current sampler
      
    • 業務請求代碼{單個/多個http請求/循環壓測等}

    • 后置預處理程序

      //一般來說提取響應內容等打印出來
      String statusCode = prev.getResponseCode();
      log.info(statusCode);
      
  • tearDown線程組

    該線程組將是最后處理的線程組,可以將清除測試數據等放在該模塊內部執行。

3代碼:

  • 測試計划:增加用戶定義變量如下:

    host 192.168.3.10
    port 50553
    longConPort 60443
    devNum 1
    projectId 1
    Token 1
  • beanshell預處理程序中處理需要往接口中帶入的一些隨機變量,這里需求是要依據主設備的MAC地址等信息,攜帶子設備的相關信息通過接口上報給服務器,於是需要在預處理腳本中新增易於維護的MAC地址信息,也便於后續壓力測試的時候生成百千萬個設備數據時候做改寫。以下定義一台主設備,31台子設備的MAC地址代碼如下:

    /**
     * 生成的device_mac為00-00-0X-00-00-00,其中X這里定義為了進程號。整個生成規則可自己依據需求定義 
     * 對應的25個連接中斷的MAC地址也可自定義,client_mac為00-00-0X-00-00-01、00-00-0X-00-00-02……00-00-0X-00-00-25
     */
     
    pre_mac = "";
    //getThreadNum獲取當前進程編號,進程號從0開始的,這里結果是1
    thread_index = ctx.getThreadNum(); 
    str_index = thread_index + "";
    log.info("當前線程編號: " + str_index );
    
    //最后生成六位字符串000001
    n = 6 - str_index.length();
    for (int i=0; i<n; i++) {
    	pre_mac += "0";
    }
    pre_mac += str_index;
    
    //正則,每隔兩位數字就在后面插入一個“-”,使其符合mac地址的規范,最后pre_mac變成00-00-01,device_mac00-00-01-00-00-0X為mac地址一共12位,
    pre_mac = pre_mac.replaceAll("(.{2})", "$1-");
    device_mac = pre_mac + "00-00-00";
    //將生成的值存入對象vars中,后續在腳本中都可以直接使用//vars.put("client_mac_"+i, client_mac_i)這個參數后面就可以使用${變量名}直接使用;
    vars.put("device_mac", device_mac);
    for (int i=1; i<10; i++) {
    	client_mac_i = pre_mac + "00-00-0" + i;
    	vars.put("client_mac_"+i, client_mac_i);
    	log.info(client_mac_i);
    }
    for (int i=10; i<31; i++) {
    	client_mac_i = pre_mac + "00-00-" + i;
    	vars.put("client_mac_"+i, client_mac_i);
    	log.info(client_mac_i);
    }
    //Token的定義規則,可以用函數生成,也可以在前面的參數中直接加上
    deviceToken = "test" + str_index;
    vars.put("deviceToken", deviceToken);
    
  • http請求格式

    依據前面在測試計划中設定的值,在這個頁面相應的位置寫上引用即可(格式${變量名}),並依據接口文檔定義,把需要發的包的數據編輯好附在body中並為該用例添加一個斷言即完成一個用例的編寫。

  • 循環發送
    如下圖所示

4運行結果

經過上面處理后,下面可以啟動測試計划,並觀察執行的結果如下圖:

5 小結

Jmeter做上述簡單接口的測試上與postman相差無幾,而Jmeter還有很多定時器、監聽器等功能還未使用到,后面使用jmeter做一次完整的性能壓力測試之后,也許才能真正體會到它的強大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM