jmeter使用詳解


1、如何在jmeter中調用自己寫的方法
a、先在IDEA工具里用Java編寫工具類(如加解密方法),然后打包成jar文件;
b、將jar包放到\apache-jmeter\lib\ext目錄里
c、在beanshell里就可以用import的方式導入工具包
舉例:

import cn.vv.vone.testengine.utils.EncryptUtils;

String str ="{\"pageSize\":10,\"pageNo\":1,\"reviewflag\":0}";
String body =EncryptUtils.encryptRequest(str);
vars.put("body",body);

2、jmeter常用內置變量
1)vars
不跨線程

vars.put(String key,String value);
vars.get(String key);

更多方法可參考:org.apache.jmeter.threads.JMeterVariables

2)props
該變量引用了JMeter的配置信息,可以操作jmeter屬性(跨線程,可當全局變量使用,只能操作String類型)

props.get("START.HMS");  注:START.HMS為屬性名,在文件jmeter.properties中定義 
encoding = props.get("sampleresult.default.encoding");
props.put("PROP1","1234");

3)log
寫入信息到jmeber.log文件

log.info("XXXX");
log.info("sampleresult.default.encoding="+encoding);

4)prev
獲取前面的sample返回的信息,常用方法:

prev.getResponseDataAsString():獲取響應信息
prev.getResponseCode() :獲取響應code
prev.setResponseCode("222");
prev.setResponseMessage("響應值返回成功");
prev.setResponseData("qiaoyeye你好","UTF-8");

更多方法可參考:org.apache.jmeter.samplers.SampleResult

5)sample

6)ctx
該變量引用了當前線程的上下文

ctx.getThreadNum();

更多方法可參考:org.apache.jmeter.threads.JMeterContext

3、jmeter BeanShell使用方法
BeanShell是一種松散類型的腳本語言,比如變量可以不用定義變量類型,此時默認為全局變量;打印方法print()。Java代碼可以在BeanShell中正常運行。
常用BeanShell腳本命令:
· source(), run() – 讀取,或者運行一個腳本文件
· frame() – 顯示一個窗口
· load(), save() – 讀取或者保存一個腳本對象到文件
· cd(), cat(), dir(), pwd(), etc. 使用Unix下面的命令
· exec() – 運行一個本地的方法
· javap() –使用javap命令.
· setAccessibility() – 設置可以接收private(私有)和protected(受保護)類型的變量

1)BeanShell預處理

import cn.vv.vone.testengine.utils.EncryptUtils;

String str ="{\"cityId\":null}";
String body =EncryptUtils.encryptRequest(str);
vars.put("body",body);

2)BeanShell后置處理器

import cn.vv.vone.testengine.utils.EncryptUtils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;

String response = EncryptUtils.decodeResponse(prev.getResponseDataAsString());

JSONObject responseObject = JSONObject.parseObject(response);
JSONArray ruleRows = responseObject.getJSONArray("rows");

String performanceRuleId = ruleRows.getJSONObject(0).getString("id");
String performanceRuleType = ruleRows.getJSONObject(0).getString("type");

vars.put("performanceRuleId",performanceRuleId);
vars.put("performanceRuleType",performanceRuleType);

注:
cn.vv.vone.testengine.utils.EncryptUtils為自己寫的加解密工具包,將jar包放入\apache-jmeter\lib\ext目錄里;
com.alibaba.fastjson.JSONObject和com.alibaba.fastjson.JSONArray包同樣要放入\apache-jmeter\lib\ext目錄里,才能調用得到。

4、jmeter斷言
1)響應斷言

斷言類型:
· Contains:上面選中的部分包含下面的正則表達式就算Pass
· Match:上面選中的整個部分匹配下面的正則表達式就算Pass。
· Equals:上面選中的整個部分和下面的字符串相等就算Pass。不支持正則表達式,同時對大小寫敏感。
· Substring:上面選中的部分包含下面的字符串就算Pass。不支持正則表達式,同時對大小寫敏感。
· Not:勾選上之后,會對前面選擇的進行反轉。比如Match + Not 就是不匹配就算Pass。
· Or:勾選上之后,會對配置內容多條件匹配。任一條件符合就算Pass。

2)json斷言

Additionally assert value(額外校驗value):
· 是否額外驗證根據JSONPath提取的值。
· 不勾選,驗證JSONPath能否在JSON文檔中找到路徑;
· 勾選,驗證根據JSONPath提取值是否預期。
Match as regular expression(匹配正則表達式):
· 預期值是否可以使用正則表達式。
· 不勾選,預期值不能使用正則表達式表示;
· 勾選,預期值可以使用正則表達式表示。
Expected Value(預期值):
· 期望為空:若驗證提取的值為null,則勾選此項。
· 這里有兩個地方需要額外注意:
· a.驗證null值,還是需要勾選“Additionally assert value”,否則驗證的是JSONPath能否找到路徑;
· b.預期值不填表示空字符,與null不等價。

json元素路徑規則見附錄

3)BeanShell斷言

import cn.vv.vone.testengine.utils.EncryptUtils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;

String response = EncryptUtils.decodeResponse(prev.getResponseDataAsString());

JSONObject responseObject = JSONObject.parseObject(response);
JSONArray periodList = responseObject.getJSONArray("periods");
String startAction = periodList.getJSONObject(0).getString("startAction");
String endAction = periodList.getJSONObject(0).getString("endAction");

if(!(startAction.equals("0")&&endAction.equals("1"))){
    Failure = true; 
    FailureMessage = "次數區間校驗失敗";
    return;
}

if(!("${transportMethod_1}".equals("1"))){
    Failure = true; 
    FailureMessage = "交通類型校驗失敗";
    return;
 }

5、jmeter變量參數化
1)用戶定義的變量
· name和value,一對一,每次都取同一個值
· 調用方式:${name}

2)用戶參數
· name和value,一對多,不同線程從value中依序取值;同個線程循環多次,值一樣
· 調用方式:${name}

3)CSV文件引入
· 從CSV文件中遍歷取值(可應用於代碼一樣,只有數據不一樣的正反用例;或者避免同份數據有緩存的影響)

· 調用方式:${變量名稱}

{
      "lng": ${lng},
      "lat": ${lat}
}

4)用Jmeter中的函數獲取參數值

${__Random(,,)}
· 第一個參數為隨機數的下限,第二個參數為隨機數的上限,第三個參數為儲存隨機數的變量名

${__RandomString(,,)}
· 第一個參數為字符串長度,第二個參數為要生成的字符范圍,第三個參數為儲存隨機數的變量名

${__CSVRead(,)}
· 第一個參數是文件名,第二個參數是文件中的列(列數從0開始)

${__StringFromFile(,,,)}。
· 第一個參數是文件名,${__StringFromFile(,,,)}方法中沒有指定讀取文件中的哪一列的參數,所以${__StringFromFile(,,,)}只能讀取包含一列的文件

參看Jmeter函數的使用,通過菜單“工具”->“函數助手對話框”,即可在“函數助手”彈出框上找到Jmeter的函數。

5)數據庫取值
見第6點

6、jmeter數據庫操作,取值
第一,導入mysql包:將mysql-connector-java-8.0.15.jar包放到\apache-jmeter\lib\ext目錄里
第二,配置JDBC Connection Configuration

第三,JDBC Request


注:多個變量用逗號隔開
調用方法:${uid_#}表示結果數量,${uid_N}表示第N個結果;vars.getObject("riderUid").get(0).get("uid")表示uid列的第一個值

參數說明:
· Variable Name:數據庫連接池的名字,需要與JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
· Query:填寫的sql語句未尾不要加“;”
· Parameter valus:參數值
· Parameter types:參數類型,可參考:Javadoc for java.sql.Types
· Variable names:保存sql語句返回結果的變量名
· Result variable name:創建一個對象變量,保存所有返回的結果
· Query timeout:查詢超時時間
· Handle result set:定義如何處理由callable statements語句返回的結果

7、jmeter邏輯控制
1)if控制器
使用變量表達式
· 借助__jexl3函數來計算表達式的值: ${__jexl3(${var}==1,)}
表達式對所有子節點生效
· 即if邏輯控制器下的所有子節點會先判斷是否滿足if條件,滿足才執行

8、jmeter設置延遲
單位:毫秒

Thread.sleep(5000);

9、jmeter常用函數
1)__BeanShell(要執行的語句,保存結果的變量名稱)

${__BeanShell(11*11)}
${__BeanShell(11*11,result)};

2)__regexFunction:正則表達式函數

3)__counter:計數器函數

4)__StringFromFile:讀取文件中的字符串函數,支持讀取多個文件
· 每次調用函數,都會從文件中讀取下一行。當到達文件末尾時,函數又會從文件開始處重新讀取,直到最大循環次數。
· 如果在一個測試腳本中對該函數有多次引用,那么每一次引用都會獨立打開文件,即使文件名是相同的(如果函數讀取的值,在腳本其他地方也有使用,那么就需要為每一次函數調用指定不同的變量名)
示例:

${_StringFromFile(demo.txt,,,)} 讀取demo.txt
${_StringFromFile(PIN#'.'DAT,,1,2)} 讀取demo1.txt, demo2.txt
${_StringFromFile(PIN.DAT,,,2)} 讀取demo.txt兩次

函數的第三個參數:初始的序列號,如果省略,那么結束序列號就代表文件的循環讀取次數。
函數的第四個參數:結束序列號,如果省略,那么序列號會無限增長。

5)__Random:返回指定最大值和最小值之間的隨機數

${__Random(1,10,num)} 返回1-10之間的隨機數,存儲在num變量里

6)__RandomString():隨機字符串函數

${__RandomString(5,abcdefg123456,value)} 在“abcdefg123456”中隨機取5個字符,存儲進value里

7)__property:返回一個JMeter屬性的值
· 如果函數找不到屬性值,而又沒有提供默認值,則它會返回屬性的名稱。
舉例:

${__property(user.dir)}:返回屬性user.dir的值。
${__property(user.dir,UDIR)}:返回屬性user.dir的值,並保存在變量UDIR中。
${__property(abcd,ABCD,atod)}:返回屬性abcd的值 (如果屬性沒有定義,返回"atod"),並保存在變量ABCD 中。
${__property(abcd,,atod)}:返回屬性abcd 的值(如果屬性沒有定義,返回"atod"),但是並不保存函數的返回值。

8)__P:簡化版的屬性函數,目的是使用在命令行中定義的屬性。
· 不同於函數_property,本函數沒有提供選項用於設置保存屬性值的變量。另外,如果沒有設置默認值,默認值自動設為1。
舉例:
定義屬性值:jmeter -Jgroup1.threads=7 -Jhostname1=www.realhost.edu

${__P(group1.threads)}:返回屬性group1.threads的值。
${__P(group1.loops)}:返回屬性group1.loops 的值。
${__P(hostname,www.baidu.com)}:返回屬性hostname的值,如果沒有定義該屬性則返回值www.baidu.com。

在上面的例子中,第一個函數調用返回7,第二個函數調用返回1,而最后一個函數調用返回www.baidu.com(除非這些屬性在其他地方有定義)。

9)__log
· OUT 和ERR的日志級別,將會分別導致輸出記錄到System.out和System.err中。在這種情況下,輸出總是會被打印(它不依賴於當前的日志設置)。

${__log(Message)}:寫入日志文件,形如"...thread Name : Message"。
${__log(Message,OUT)}:寫到控制台窗口。
${__log(${VAR},,,VAR=)}:寫入日志文件,形如"...thread Name VAR=value"。

10)__split:字符串分割函數
· 函數__split會通過分隔符來拆分傳遞給它的字符串,並返回原始的字符串。如果分隔符緊挨在一起,那么函數就會以變量值的形式返回"?"。拆分出來的字符串,以變量${VAR_1}、{VAR_2}…以此類推的形式加以返回。
· 分隔符默認是逗號,如果你想要多此一舉,明確指定使用逗號,需要對逗號轉義,如“,”
舉例:
在測試計划中定義變量VAR="a||c|":
${__split(${VAR},VAR),|} :該函數調用會返回VAR變量的值,例如"a||c|",並設定VAR_n=4、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null變量的值。

11)__XPath
· 函數__XPath讀取XML文件,並在文件中尋找與指定XPath相匹配的地方。每調用函數一次,就會返回下一個匹配項。到達文件末尾后,會從頭開始。如果沒有匹配的節點,那么函數會返回空字符串,另外,還會向JMeter日志文件寫一條警告信息。
· 整個節點列表都會被保存在內存之中。
舉例:

${__XPath(/path/to/build.xml, //target/@name)} 

這會找到build.xml文件中的所有目標節點,並返回下一個name屬性的內容。

12)__setProperty:設置JMeter屬性的值
· 函數的默認返回值是空字符串,因此該函數可以被用在任何地方,只要對函數本身調用是正確的。
· 通過將函數可選的第3個參數設置為"true",函數就會返回屬性的原始值。
· 屬性對於JMeter是全局的,因此可以被用來在線程和線程組之間通信。

13)__time:通過多種格式返回當前時間
· 如果省略了格式字符串,那么函數會以毫秒的形式返回當前時間。其他情況下,當前時間會被轉成簡單日期格式。包含如下形式:
· YMD = yyyyMMdd。
· HMS = HHmmss。
· YMDHMS = yyyyMMdd-HHmmss。
· USER1 = JMeter屬性time.USER1。
· USER2 = JMeter屬性time.USER2。
· 用戶可以通過修改JMeter屬性文件來改變默認格式,或者自定義格式,例如修改YMD格式: time.YMD=yyMMdd。

14)__evalVar:用來執行保存在變量中的表達式,並返回執行結果
· 用戶可以從文件中讀取一行字符串,並處理字符串中引用的變量。
舉例:
假設變量"query"中包含有"select ${column} from ${table}",而 "column"和"table"中分別包含有"name"和"customers",那么${__evalVar(query)}將會執行"select name from customers"。

15)__eval:用來執行一個字符串表達式,並返回執行結果。
· 用戶可以對字符串(存儲在變量中)中的變量和函數引用做出修改。
舉例:
給定變量name=Smith、column=age、table=birthdays、SQL=select ${column} from ${table} where name='${name}',那么通過${__eval(${SQL})},就能執行"select age from birthdays where name='Smith'"。這樣一來,就可以與CSV數據集相互配合,例如,將SQL語句和值都定義在數據文件中。

16)__escapeHtml
· 函數__escapeHtml用於轉義字符串中的字符(使用HTML實體)。支持HTML 4.0實體。

17)__unescapeHtml
· 函數__unescapeHtml用於反轉義一個包含HTML實體的字符串,將其變為包含實際Unicode字符的字符串。支持HTML 4.0實體。
· 如果函數不認識某個實體,就會將實體保留下來,並一字不差地插入結果字符串中。例如,">&zzzz;x"會變為">&zzzz;x"。

18)__FileToString
· 函數__FileToString可以被用來讀取整個文件。每次對該函數的調用,都會讀取整個文件。
· 如果在打開或者讀取文件時發生錯誤,那么函數就會返回字符串"ERR"。

10、正則表達式
match no(匹配數字)
· 通過正則表達式匹配,可能會有多個結果,match no為0時代表隨機取值,正數n則表示取第n個值(比如1代表取第一個值),負數則表示提取所有符合條件的值
group
· 指某個match的某一個匹配內容,如([0-9]+).([0-9]+)匹配12.34和56.78,則match no=1&group=1的結果為12,match no=1&group=2的結果為34,match no=2&group=1的結果為56
模板
· 通過${group}$來指定正則表達式的匹配結果的輸出格式,如$1$則只截取group=1的內容,即12和56;$1$X$2$則可以得到12X34和56X78
舉例:
待匹配字符串:12.34!=56.78
引用名稱:num
正則表達式:([0-9]+).([0-9]+)
模板:$1$---$2$
匹配數字:2
結果如下:
${num}:56---78
${num_g0}:56.78
${num_g1}:56
${num_g2}:78

附:
json元素路徑

正則表達式規則


免責聲明!

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



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