JMeter(5) JMeter之BeanShell使用

BeanShell介紹

BeanShell是用Java寫成的,一個小型的、免費的、可以下載的、嵌入式的Java源代碼解釋器,具有對象腳本語言特性。本篇只記錄一下基本的使用。有以下五個組件:

  • Beanshell Sampler
  • Beanshell PreProcessor
  • Beanshell PostProcessor
  • Beanshell Assertion
  • __Beanshell Function

常用變量

  1. vars:實際引用jmeter線程的局部變量,連通jmeter和beanshell
    vars.get(String key) //獲取變量值
    vars.put(String key, String value)//存儲value到變量key
  2. log: 寫入信息到日志中,log.info("")
  3. prev: 獲取前一個sample的響應
    getResponseDataAsString()
    getResponseCode()
  4. props: class java.util.Properties
    變量屬性賦值給變量props.put("some_variable",vars.get("some_variable"))

Jmeter Log

  1. Jmeter日志默認存放在%JMeter_HOME%\bin\JMeter.log, 腳本中使用log.info("日志")打印需要的日志信息
    JMeter里面點擊右上角可打開日志窗口

  2. Jmeter使用Log4j日志組件輸出日志,%JMETER_HOME%\bin\jmeter.properties\log_level.jmeter用于控制Jmeter日志記錄級別??梢栽O置以下日志級別:FATAL_ERROR, ERROR, WARN, INFO,DEBUG,其中FATAL_ERROR打印日志最少,DEBUG級別日志最詳細。
    log_level.jmeter=INFO //INFO級別,只有等于及高于這個級別的才打印日志,如果配置為INFO只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會被顯示。

  3. jmeter可以為不同的模塊設置不同的日志級別,如下:


Beanshell PreProcessor

預先處理,生成一段隨機字符串并賦值給變量,同個線程組內通過${變量名}讀取

import java.util.Random; 
String random_len(int length) {
    chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; 
    int string_length = 8; 
    randomstring =""; 
    for (int i=0; i<string_length; i++) { 
        Random randomGenerator = new Random(); 
        int randomInt = randomGenerator.nextInt(chars.length()); 
        randomstring += chars.substring(randomInt,randomInt+1); 
    } 
    return randomstring;
}
log.info(random_len(8));
log.info(random_len(16));

vars.put("random_8", random_len(8)); 
vars.put("random_16", random_len(16)); 

Beanshell Assertion

斷言結果字段是Failure=true/false; 運行結果需要打印出的信息寫在FailureMessage = "XXXX";
eg1. 斷言uid=預期的值

if(!"${uid}".equals("774170"))
{
    Failure=true;
    FailureMessage = "error, check";
}
else
{
    FailureMessage = "ok!";
}

實例: 斷言返回的數據類型

先把用到的jar包org.json放在jmeter/lib文件下,并在測試計劃中導入


思路
function(standardData,respData){
standardJson =getJson();
respJson = getJson(respData);
循環(huán)N次{
if(standardJson.getType == respJson.getType); //逐個判斷json的字段類型是否符合標準
}
Beanshell代碼

import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by Susie on 2016/8/25.
 */
public static String equalsJson(JSONObject standardJson, JSONObject responseJson) {//輸入兩個json,判斷第一個里面的所有字段在第二個中的類型是否相同
    String err_message = ""; 
    Iterator it = standardJson.keys(); // 儲存所有要驗證的Key
     while (it.hasNext()) {
          String key = (String) it.next();
          String thisKetType = standardJson.get(key).getClass().getName(); //獲取當前Key的標準type
          log.info("standard Key = " + key + ", Value = " + standardJson.get(key) + ", Type = " + thisKetType);

          if(responseJson.isNull(key)){ //判斷response中有無當前Key
             log1 = "------ExistError: " + key + " Not found.";
             log.info("!!Failed: " + log1);
             err_message = (err_message + "\n" + log1);
          }
          else{  //response中找到Key了,再判斷type
               String respKetType = responseJson.get(key).getClass().getName(); //獲取響應的字段類型

               if(respKetType.equals(thisKetType)){
                    log.info("Passed.");
                    if(thisKetType.equals("org.json.JSONObject")){ //object類型的字段繼續(xù)往內層判斷
                        err_message += equalsJson(standardJson.getJSONObject(key), responseJson.getJSONObject(key)); //!!進入遞歸時,保存當前錯誤信息
                    }
                } else {
                    String log1 = "------TypeError : " + key + " is " + respKetType + " (should be " + thisKetType + ")";
                    log.info("!!Failed: " + log1);
                    err_message = (err_message + "\n" + log1);
                }
            }
        }
     return err_message;
}
public static Boolean respTypeAssertion(String standardData) { //輸入標準響應,轉為json并調用比較函數,得到斷言結果
    String resData = prev.getResponseDataAsString(); //獲取前一個請求的響應
    log.info("res: " + resData);
    JSONObject standardJson = new JSONObject(standardData); 
    JSONObject jo = new JSONObject(resData);
    JSONObject responseJson = jo.getJSONObject("data");
    log.info("------------------------Beanshell assertion7-------------");
    String message = equalsJson(standardJson, responseJson);
    log.info("------------------------ResultMessage--------------------" + message);
    if(message == ""){    //如果錯誤信息是空,說明斷言結果通過
        FailureMessage = "Pass!";
        return true;
    }
    else{   //有錯誤信息打印到斷言結果里面
        Failure=true;
        FailureMessage = "Type Error!" + message;
    }
    return false;
}   


//-----------------------------------------------
String standardData = "{'uid':'123','phone':'13580478329','has_password':true,'location':{'province':true,'city':'\u6c55\u5934\u5e02'},'cpma':null}";
respTypeAssertion(standardData);

運行,查看結果


參考鏈接

Jmeter接口文檔:
https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
Java數據類型:
http://webcache.googleusercontent.com/search?q=cache:SgdVfka7SZIJ:www.runoob.com/java/java-basic-datatypes.html+&cd=1&hl=zh-CN&ct=clnk&gl=ph

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Jmeter Bean shell 最近在學習使用 Jmeter 來進行接口測試,使用 Jmeter 提供的基礎方...
    csmijo閱讀 2,978評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 在應用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統(tǒng)計分析...
    時待吾閱讀 5,203評論 1 13
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評論 6 342
  • 在應用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統(tǒng)計分析...
    時待吾閱讀 5,146評論 0 6

友情鏈接更多精彩內容