1. 背景
為了讓大家更多地了解Jmeter并輕松使用它,稍后將添加性能章節.
Debug Sampler將在響應數據中輸出我們自定義的變量,這便于我們在調試時使用. 正式執行腳本后,需要刪除Debug Sampler.
Dummy Sampler可以更方便地模擬測試場景并自定義請求數據和響應數據,這在學習測試腳本編寫的過程中非常有用. 當然,撰寫文章時您無法公開公司的界面. 輸入太多代碼不舒服. 虛擬采樣器現在也非常舒適.
{ "resultCode": "1000", "resultMsg": "success", "userdic": { "Ali": "Moubao" }, "userlist": [ { "firstName": "Jiezai", "lastName": "Grizz", "id": 6 }, { "firstName": "Ben", "lastName": "Rose", "id": 8 } ]}
將虛擬采樣器的請求數據和響應數據配置為上述json字符串

讓我們演示如何提取用戶列表的第一個firstName的jiezai值,提取用戶列表的第二個firstName的Ben值,以及提取userlist [“ Jiezai”,“ Ben”]的firstName的所有值
在演示之前,我們將討論我們將使用的JSON Path Extractor(也是Jmeter擴展的第三方插件)的語法.
$代表整個對象. 代表絕對路徑,..代表相對路徑,[0]代表列表的第一個值,[0,1]和[: 2]都代表列表的前兩個元素
$. userlist
$. userlist [*]
$. userlist [-1: ]
$ .. userlist [?(@. id> 7)]
$ .. firstName
五個表達式的輸出如下:

》》》 [{“” FirstName“: ” Jiezai“,” lastName“: ” Grizz“,” id“: 6},{” firstName“: ” Ben“,” lastName“: ” Rose“,” id“ : 8}]
》》》 [{“” FirstName“: ” Jiezai“,” lastName“: ” Grizz“,” id“: 6},{” firstName“: ” Ben“,” lastName“: ” Rose“,” id“ : 8}]
》》》 [{“ firstName”: “ Ben”,“ lastName”: “ Rose”,“ id”: 8}]
》》》 [{“ firstName”: “ Ben”jmeter中正則表達式大全,“ lastName”: “ Rose”,“ id”: 8}]
》》 [[Jiezai],“ Ben”]
PS:
1. 正則表達式提取器-“ value =”(. +?)“-”模板$ 1 $
(): 封裝要返回的匹配字符串. . : 匹配任何單個字符串.
+: 一次或多次. ?: 找到第一個匹配項后停止.
2. JSON路徑提取器的使用-“,請參閱:
閱讀它之后,我知道它幾乎是無所不能的,因為它具有自己的語法,例如Xpath.
1. 提取用戶列表中第一個名字的值jiezai
每個人都應該非常擅長此事. 使用Jmeter提取json數據的任何人都知道
使用正則表達式提取器: “ firstName”: “(. +?)”

在Debug Sampler test3 = Jiezai中提取結果
使用JSON路徑提取器
JsonPath表達式: $ .. userlist.firstName [0]

在Debug Sampler test3 = Jiezai中提取結果
2,提取用戶列表Ben的第二個firstName的值
使用正則表達式提取器: “ firstName”: “(. +?)”

或使用正則表達式提取器: “ firstName”: “(. +?)” *“ firstName”: “(. +?)”


說明,模板代表正則表達式的數字“(. +?)”.
JsonPath表達式: $ .. userlist.firstName [1],該圖被省略.
在Debug Sampler test4 = Ben中提取結果
3. 提取userlist [“ Jiezai”,“ Ben”]的所有firstName值
似乎不可能只使用一次正則表達式,但是您可以使用JSON Path Extractor
JsonPath表達式: $ .. userlist.firstName

在Debug Sampler中提取結果test1 = [“ Jiezai”,“ Ben”]
4,比較正則表達式提取器和JSON路徑提取器
正則表達式可以提取非json數據,JSON路徑提取器只能提取json數據(),但是我們通常以json格式返回HTTP請求,因為它簡單直觀.
當json數據的返回值為{“ firstName”: “ Jiezai”}時,正則表達式為“ firstName”: “(. +?)”,如果: (當以下位置時: 冒號),實際上是json數據,然后還需要添加正則表達式,但是不管冒號左右兩側是否有空格,JSON Path Extractor表達式都是$ .. firstName
1. 使用BeanShell和JavaScript
由于公司從事保險業務,因此保險期和猶豫期將使用時間偏移.
例如jmeter中正則表達式大全,如果我購買保險,保險期為一年,保險開始日期為當前日期2018-4-11,結束日期為一年之后的當前日期2019-4-11
. 開始日期,我們可以使用BeanShell表達式
$ {__ BeanShell($ {__ time(yyyy)})}-$ {__ BeanShell($ {__ time(MM)},)}-$ {__ BeanShell($ {__ time(dd,)}))->輸出當前日期為2018-4-11或JavaScript表達式
$ {__ javaScript((new Date(). getFullYear())+'-'+(new Date(). getMonth())+'-'+(new Date(). getDate()))) ->輸出當前日期2018-4-11. 如果再加一年零兩個月零三天怎么辦?
BeanShell表達式
$ {__ BeanShell($ {__ time(yyyy)} + 1,)}-$ {__ BeanShell($ {__ time(MM,)} + 2,)}-$ {__ BeanShell($ {__ time(dd,)} +3,)}
JavaScript表達式
$ {__ javaScript((new Date(). getFullYear()+ 1)+'-'+(new Date(). getMonth()+ 2)+'-'+(new Date(). getDate() +3),)}
輸出全部為2018-5-14
似乎沒有問題,但除此之外,因為今天是2018年12月30日

,上面表達式的結果是2019-14-33,哈哈哈,這個表達式不知道一年中有多少個月,一個月中有多少天,它只會累加起來. 但是,如果僅是年份偏移量,則仍可以使用上面的表達式. 如果有月或日的偏移量,我們可以使用BeanShell Sampler,它實際上是用來執行Java代碼的.
2,使用BeanShell腳本
如果要執行BeanShell腳本,則可以使用BeanShell PreProcessor,BeanShell Sampler或BeanShell PostProcessor
執行順序: BeanShell PreProcessor> BeanShell Sampler> BeanShell PostProcessor
BeanShell PreProcessor是一個預處理器,在調用接口之前執行. 我在這里用這個
BeanShell Sampler是一個接口請求,它將反映在結果樹中并寫入接口執行報告中,但不建議像執行Java代碼一樣使用它來計算時間偏移.
BeanShell PostProcessor是一個后處理器,在調用接口之后執行.
例如:
只要BeanShell PreProcessor和BeanShell PostProcessor在BeanShell Sampler的范圍之內,就必須首先運行BeanShell PreProcessor,然后運行BeanShell Sampler,然后運行BeanShell PostProcessor.

BeanShell PreProcessor的Java源代碼:
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;log.info(Label); //輸出原件的名稱try{ log.info("*****時間偏移*****"); //輸出日志 Date date =new Date(); //獲取當前時間 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); String nowDate = sf.format(date); Calendar cal = Calendar.getInstance(); cal.setTime(sf.parse(nowDate));//初始化為當前時間 cal.add(Calendar.DAY_OF_YEAR,+1); //后一天 String orderDate = sf.format(cal.getTime()); cal.setTime(sf.parse(nowDate)); cal.add(Calendar.DAY_OF_YEAR,+365); //后365天,即一年 String mouthDate = sf.format(cal.getTime()); vars.put("dayDate",orderDate);//把beanshell的變量傳給Jmeter vars.put("yearDate",mouthDate); log.info("輸出計算后的兩個時間"); log.info("dayDate="+orderDate); log.info("yearDate="+mouthDate);}catch(Exception e){}
時移的執行結果圖:

我們打開Jmeter的選項“檢查日志查看器,檢查Jmeter運行日志并執行上面的beanshell源代碼以獲取
dayDate = 2018-04-12,yearDate = 2019-04-11.
在beanshell中,log.info()可用于打印調試bean腳本的日志

說到beanshell,我不得不說我們使用beanshell腳本來加密和解密密碼,因為出于安全原因,登錄或付款期間的密碼將被加密和解密. 這里以加密為例:
首先,您需要開發同學的幫助,將添加的Java代碼鍵入password.jar包(以您自己命名)中,然后將password.jar包添加到Jmeter的測試計劃頁面,以便您可以在beanshell Java類中執行Java時導入加密. 如圖所示:

Jar包的密鑰代碼,調用FrameDemo.java的generateKey方法:

例如,我們要加密登錄密碼qq1111并參考Jmeter中的步驟

1,Jmeter添加jar包
2,在Beanshell中導入FrameDemo.java
3. 調用FrameDemo.java的generateKey方法執行加密操作. GenerateKey具有3個輸入參數. 前兩個是加密密鑰,第三個是要加密的密碼. 我們的密鑰是固定的,需要加密. 密碼是qq1111,我們可以在beanshell中編寫要加密的密碼,也可以從Jmeter傳遞它. 然后,我們將選擇從Jmeter中傳遞,這更加靈活.
4. Beanshell將加密的字符串發送到Jmeter,以供Jmeter引用.
BeanShell PreProcessor的Java源代碼:
//在測試計劃頁面先添加加密jar包import com.forth.FrameDemo;//加密log.info("*****加密*****"); //輸出日志String password = vars.get("login_pw");//輸入登錄密碼-這樣寫會取Jmeter變量login_pw的值log.info("jmeter-loginpw="+password);String password = "qq1111"; //輸入登錄密碼String tpk = "30818902818100ccd601e07aeffc7f5f6d20d…";String kek = "308189028181009fa6334baf70c336163222…";String loginpw = FrameDemo.generateKey(tpk,kek,password); //調用工具類中的方法進行加密vars.put("loginpw",loginpw); //把值保存到jmeter變量loginpw中log.info("loginpw="+loginpw);

PS:
Beanshell內置對象vars訪問Jmeter變量
vars.get(“ login_pw”)//從Jmeter獲取變量login_pw的值
vars.put(“ loginpw”,loginpw); //將bean中的loginpw值存儲到Jmeter變量loginpw
中
當我們使用Jmeter進行接口測試時,每個接口都需要輸入IP和端口. 如果將采樣器中的IP和端口寫為172.20.128.188和8077. 因此,一旦遷移了測試環境,就需要在批處理腳本中修改批處理接口的IP和端口. 修改數量=腳本數量X腳本接口數量. 那是一件非常令人恐懼的事情,沒有技術含量. . 聰明,我們知道,我們必須先在Jmeter中定義IP和端口,這樣修改量才會大大減少. 如圖所示:

但是,通過這種方式,我們的IP和端口已更改. 我們仍然必須一個一個地打開和修改每個腳本. 修改數量=腳本數量,這仍然有些麻煩. 我們可以嘗試在同一位置將Jmeter腳本中的IP和端口引用為相同的值. 實際上,它是為腳本定義一個全局變量. 然后了解jmeter屬性變量,如圖所示:

修改數量= 1,完美,
Jmeter的bin目錄中的jmeter.properties文件可以定義jmeter屬性變量
打開jmeter.properties文件并插入兩行
IP=172.20.128.188PORT=8077
在Jmx腳本中引用為$ {__ P(IP,)},$ {__ P(PORT,)},修改jmeter.properties后,需要重新啟動jmeter才能生效.
bin下的User.properties也可以定義jmeter屬性值,那么問題是,user.properties和jmeter.properties同時定義了PORT的值,一個是8077,另一個是8078,最后是$ { __P(PORT,)}參考時值是多少?好奇的朋友可以嘗試一下并發表評論,并通過其他方式討論Jmeter的其他知識. Git尚未完成. 完成后,將代碼和相關腳本放在一起.
我覺得我的排版和描述可以優化,尤其是代碼和英文排版. 我希望能看到它的人能夠提及它. 感謝您的閱讀.
作者: 西邊的人
本文來自本站,轉載請注明本文網址:
http://www.pc-fly.com/a/jisuanjixue/article-286368-1.html