文章介紹了在JMeter中核對(duì)收貨地址信息的操作流程,并深入探討了JMeter中的IF控制器、日志等組件的使用。特別強(qiáng)調(diào)了Groovy和Jexl3在表達(dá)式語(yǔ)言上的區(qū)別,以及它們?cè)贘ava平臺(tái)上的應(yīng)用場(chǎng)景和語(yǔ)法特性。
聲明:本文所記錄的僅本次操作學(xué)習(xí)到的知識(shí)點(diǎn),其中商城IP錯(cuò)誤,請(qǐng)自行更改。
背景:提交訂單前,我們需要核對(duì)一些信息,比如商品信息,收貨地址,支付方式等。現(xiàn)在核對(duì)一下收貨地址信息。
思路:
1、前提條件:A用戶登錄。
2、先判斷地址列表是否有收貨地址
3、如果沒(méi)有收貨地址,則新增默認(rèn)收貨地址。
4、如果有收貨地址,全部刪除后再新增默認(rèn)收貨地址(先這樣粗暴的簡(jiǎn)單處理)。
1.認(rèn)識(shí)JMeter
(1)邏輯控制器【IF控制器】
可以通過(guò)條件來(lái)控制是否運(yùn)行其下面的測(cè)試元件(子元素)。只有結(jié)果為True時(shí)才會(huì)執(zhí)行層級(jí)下的測(cè)試元件。
(2)選項(xiàng)【日志】
提供了關(guān)于測(cè)試執(zhí)行情況的詳細(xì)信息,?幫助用戶分析和優(yōu)化測(cè)試策略,?確保測(cè)試的有效性和準(zhǔn)確性,是測(cè)試過(guò)程中不可或缺的一部分。
2.【HTTP請(qǐng)求默認(rèn)值】
![]()
3.【登錄】
![]()
4.【查看地址列表】
(1)查看地址列表
![]()
(2)獲取全部地址
![]()
5.【IF控制器-刪除】
![]()
(1)所有地址不為空
![]()
(2)刪除所有地址
![]()
![]()
![]()
![]()
(3)查看地址列表
![]()
![]()
![]()
6.【IF控制器-新增】
(1)所有地址為空
![]()
(2)新增默認(rèn)地址
![]()
![]()
![]()
(3)查看地址列表
![]()
![]()
![]()
7.【調(diào)試取樣器】
![]()
8.【查看結(jié)果樹(shù)】
![]()
9.【日志】
我是被【IF控制器】中的__groovy()方法給弄得快崩潰了,之前花了很多時(shí)間百度找原因,一直找不到是什么原因?qū)е屡袛嗍『竺娴牟僮鞫疾粓?zhí)行。最后是想通過(guò)日志看看能不能找到原因(因?yàn)閷?duì)JMeter工具不太熟悉,日志打印那塊有很多模塊也是一個(gè)一個(gè)的試),公司的日志也沒(méi)有這么多模式。
![]()
10.【認(rèn)識(shí)IF控制器】
(1)界面
![]()
![]()
For performance it is advised to check "Interpret Condition as Variable Expression" and use__jexl3 or __groovy evaluating to true or false or a variable that contains true or false:為了提高性能,建議勾選“將條件解釋為變量表達(dá)式”,并使用__jexl3或__groovy求值為真或假,或者使用包含真或假的變量。
Expression (must evaluate to true or false):表達(dá)式(必須求值為真或假)。在右邊文本框中輸入的條件值必須是 true 或 false,例如:${__jexl3("address_id_all_matchNr" != "0" or "1" and "address_id_all_matchNr" != "",)}。
Use status of last sample:上次樣品的使用情況。使用執(zhí)行該IF控制器前的最后一個(gè)取樣器結(jié)果作為判斷,如果最后一個(gè)取樣器通過(guò)就返回true,如果失敗就返回false。點(diǎn)擊一下按鈕即可,表達(dá)式輸入框里自動(dòng)添加:${JMeterThread.last_sample_ok}
Interpret Condition as Variable Expression:將條件解釋為變量表達(dá)式,默認(rèn)勾選,需要使用 ${__jexl3()}或${__groovy()}表達(dá)式。例如:${__groovy("${address_id_all1}"=="")}。
Evaluate for all children:條件作用域所有子元素。
(2)區(qū)別
我把遇到的區(qū)別給總結(jié)一下(目前就2個(gè)),沒(méi)遇到的就只能等以后再補(bǔ)充了,可以去官網(wǎng)看看(太簡(jiǎn)潔了):https://jmeter.apache.org/usermanual/functions.html#__groovy , https://jmeter.apache.org/usermanual/functions.html#__jexl3 。
① 字段上區(qū)別
${__groovy()}表達(dá)式里面的參數(shù)一定要有英文的雙引號(hào),例如${__groovy(${address_id_all_matchNr} == "0" or ${address_id_all1_matchNr} == "0",)},字段${address_id_all_matchNr}沒(méi)有加上雙引號(hào),JMeter運(yùn)行日志就報(bào)錯(cuò)。
![]()
![]()
例如:${__groovy("${address_id_all_matchNr}" == "0" },字段${address_id_all_matchNr}加上雙引號(hào),JMeter運(yùn)行日志就不會(huì)報(bào)錯(cuò)。
![]()
![]()
${__jexl3()}表達(dá)式里面的參數(shù)可以沒(méi)有英文的雙引號(hào),${__jexl3("${address_id_all_matchNr}" == "0" or "${address_id_all1_matchNr}" == "0",)},字段${address_id_all_matchNr}沒(méi)有雙引號(hào),JMeter運(yùn)行日志也不會(huì)報(bào)錯(cuò)。
![]()
![]()
② OR語(yǔ)法區(qū)別
${__groovy()}表達(dá)式里面有OR邏輯判斷時(shí),運(yùn)行結(jié)果一定是failed,例如${__groovy(${address_id_all_matchNr} == "0" or ${address_id_all1_matchNr} == "0",)},字段${address_id_all_matchNr}沒(méi)有加上雙引號(hào),JMeter運(yùn)行日志就報(bào)錯(cuò)。
![]()
![]()
${__jexl3()}表達(dá)式里面有OR邏輯判斷時(shí)就不會(huì)報(bào)錯(cuò)。
![]()
![]()
③ 其它還沒(méi)遇到
④ 百度的內(nèi)容
Groovy和Jexl3都是可以在Java平臺(tái)上運(yùn)行的表達(dá)式語(yǔ)言,?但它們?cè)谠O(shè)計(jì)目標(biāo)、?功能和使用場(chǎng)景上存在一些區(qū)別。
設(shè)計(jì)目標(biāo)與功能:?Groovy是一種動(dòng)態(tài)編程語(yǔ)言,?設(shè)計(jì)用于增強(qiáng)Java平臺(tái)的開(kāi)發(fā)體驗(yàn),?提供了豐富的特性如動(dòng)態(tài)類型、?閉包等,?旨在提供一種更簡(jiǎn)潔、?靈活的方式來(lái)編寫代碼。?它支持與Java的無(wú)縫集成,?允許開(kāi)發(fā)者使用Groovy編寫代碼,?同時(shí)也能調(diào)用Java庫(kù)和類。?相比之下,?Jexl3(?JEXL是Java Expression Language的擴(kuò)展)?更專注于提供一種輕量級(jí)的、?易于嵌入的表達(dá)式語(yǔ)言,?用于在運(yùn)行時(shí)動(dòng)態(tài)地解析和執(zhí)行表達(dá)式。?
使用場(chǎng)景:?Groovy適合于需要快速原型設(shè)計(jì)、?腳本編寫或者需要利用其提供的豐富特性來(lái)簡(jiǎn)化Java開(kāi)發(fā)的場(chǎng)景。?它特別適合與Spring等框架一起使用,?提供了一種更加敏捷的開(kāi)發(fā)方式。?而Jexl3則更適合于需要在Java應(yīng)用程序中嵌入簡(jiǎn)單的表達(dá)式解析和執(zhí)行功能的場(chǎng)景,?比如在規(guī)則引擎、?業(yè)務(wù)邏輯快速調(diào)整等場(chǎng)合。
語(yǔ)法與特性:?Groovy的語(yǔ)法更加接近自然語(yǔ)言,?提供了閉包、?元編程等高級(jí)特性,?使得代碼更加簡(jiǎn)潔易讀。?而Jexl3的語(yǔ)法相對(duì)更加精簡(jiǎn),?專注于表達(dá)式的快速解析和執(zhí)行,?不包含Groovy那樣的高級(jí)特性。?
總的來(lái)說(shuō),?Groovy和Jexl3都是為了在Java平臺(tái)上提供表達(dá)式語(yǔ)言的解決方案,?但Groovy作為一個(gè)完整的編程語(yǔ)言,?提供了更多的特性和靈活性,?適合于需要更復(fù)雜邏輯和快速開(kāi)發(fā)的場(chǎng)景;?而Jexl3則更加輕量級(jí),?專注于表達(dá)式的解析和執(zhí)行,?適合于簡(jiǎn)單的邏輯調(diào)整和嵌入使用。?
(3)函數(shù)助手
一個(gè)工具,感覺(jué)了解_jexl3()與__groovy()后用處不大。
頁(yè)面輸入表達(dá)式的值,然后點(diǎn)擊【生成】自動(dòng)拷貝函數(shù)字符串。然后輸出當(dāng)前JMeternal變量,JMeterTread.last_sample_ok就是IF控制器之前的HTTP請(qǐng)求結(jié)果。其它的信息就沒(méi)有了。
但是,這里沒(méi)有任何語(yǔ)法校驗(yàn),沒(méi)有提示報(bào)錯(cuò)或者是IF控制器的結(jié)果是True還是False,還沒(méi)有日志好用。對(duì)于熟悉${__jexl3()}或${__groovy()}寫法的人來(lái)說(shuō),這個(gè)助手好像沒(méi)什么用。
最上面的【幫助】,能夠跳轉(zhuǎn)到JMeter官網(wǎng)關(guān)于函數(shù)的介紹頁(yè)面。
![]()
![]()
![]()