![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csMTWq50MrpnTz0keYdHMywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuMDN4AzM0YTM4ADOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
-
- CSV Data Set Config
- 應用場景:參數 UserID 是在一個檔案中取的,如果在檔案中取值需要添加 配置元件(CSV Date Set Config)進行參數化、
- Filename:檔案名,指儲存資訊的檔案目錄,可以相對或者絕對路徑(比如:D:\ceshi.Txt)
2)File encoding:csv檔案編碼,可以不填
3)Variable Names:變量名,多個變量用“,”(英文逗号)分開。變量使用格式${OA_VendingMachineNum}和${Name}【注:JMeter2.3.4以後的版本,支援CSV标題行,如果變量名為空,那麼檔案的第一行将被讀取,并被解釋為列名的清單。這些變量名必須使用分割符加以區分,他們可以使用雙引号加以引用。預設情況下,該檔案僅打開一次,而每個線程會使用檔案中不同的資料行。至于資料行傳遞給線程的順序,依賴于他們執行的順序,資料行在每次測試循環的開始階段讀取,檔案名和模式在第一次循環時解析。】
Delimiter:csv檔案中的分隔符(用”\t”代替tab鍵)(一般情況下,分隔符為英文逗号)
4)Allow quoted data:是否允許引用資料(尚不清楚)
5)Recycle on EOF :到了檔案尾處,是否循環讀取參數,選項:true和false。因為CSV Data Set Config一次讀入一行,分割後存入若幹變量交給一個線程,如果線程數超過文本的記錄行數,那麼可以選擇從頭再次讀入
6)Stop thread on EOF:到了檔案尾處,是否停止線程,選項:true和false
當Recycle on EOF 選擇true時,Stop thread on EOF選擇true和false無任何意義,通俗的講,在前面控制了不停的循環讀取,後面再來讓stop或run沒有任何意義
當Recycle on EOF 選擇flase時,Stop thread on EOF選擇true,線程4個,參數3個,那麼隻會請求3次
當Recycle on EOF 選擇flase時,Stop thread on EOF選擇flase,線程4個,參數3個,那麼會請求4次,但第4次沒有參數可取,不讓循環,是以第4次請求錯誤
7)Sharing mode:共享模式,All threads –所有線程,Current thread group—目前線程組,Current thread—目前線程。經試驗得出來的結果是(不考慮線程組疊代):
如果測試計劃中有線程組A、線程組B,A組内有線程A1到線程An,線程組B内有線程B1到線程Bn,CSV Data Set Config放線上程組A的下級組織樹,不管怎麼設定Sharing mode,都隻針對線程組A且取之情況一樣:線程A1取第一行,線程A2取第二行。CSV Data Set Config放在測試計劃下級組織樹(與線程組并列),情況如下 :
8)All threads:測試計劃中所有線程,線程組A、線程組B共用一個CSV檔案,所取資料與線程實際執行順序有關(先執行先取)。補充一點:線程組之間是并行執行,各線程實際執行時間根據Ramp-UP Period而來,如下圖,若線程A、線程B均設定Ramp-Up Period:2,取之情況是:線程A1取第1行,線程B1取第2行,線程A2取第3行,線程B2取第4行。
Current thread group:取之情況是:線程A1取第1行,線程A2取第2行,線程B1取第1行,線程B2取第2行。(線程組互不影響)
Current thread:目前線程。A1取第一行,A2取第一行;B1取第一行,B2取第一行(均取第一行)
- DNS Cache Manager
- FTP請求預設值
- HTTP Cache Manager
被用來為其作用域内的HTTP請求提供緩存功能,如果“Use Cache-Control/Expires header When ..."選中,那麼會根據目前時間來選擇,如果請求是”GET",而時間指向未來,那麼采樣器就會立即傳回,而無須從遠端伺服器請求URL,這樣是為了模拟浏覽器的操作,請注意Cache-Control頭必須是“pulic”的,并且隻有"max-age"終結選項會被處理,如果請求文檔自從其被緩存以來沒有發生任何改變,那麼響應包體就會為空。
5.5 HTTP Cookie 管理器
儲存在使用者本地終端上的資料,主要用于預設cookie管理
通常情況下,當使用者結束浏覽器會話時,系統将終止所有的cookie,當web伺服器建立了Cookie後,隻要在其有效期内,當使用者通路同一個Web伺服器時,浏覽器首先要檢查本地的cookies,并将其原樣發送給web伺服器
作用:
1)發送請求,經常要校驗cookies資訊
2 )錄制時使用的cookie管理器,隻能在指定的域下面使用,如果伺服器位址切換,發現發送請求時,就會出現no cookies
最典型的應用:
(1)判斷注冊使用者是否已經登入網站,使用者可能會收到提示,是否在下一次進入此網站時保留使用者資訊以便簡化登入手續
(2)購物車之類的處理,使用者可能會在一段時間内在同一家網站的不同頁面中選擇不同的商品,這些資訊都會寫入cookies,以便在最後付款時提取資訊
如圖,禁用了cookie,登入成功,但通路其它頁面時仍跳轉到了登入頁面
缺少cookie頁面不能通路.png
如何設定:
1、自動管理cookies,jmeter配置檔案中設定(bin目錄)CookieManage.save.cookies=true,去掉前面的#,然後重新開機jmeter
2、手動添加cookies,可以利用Firefox中導出cookies之後,再導入Jmeter中輕松完成(浏覽器需安裝Firebug)
5.6 HTTP資訊頭管理器
可添加或者重載HTTP請求頭,JMeter目前支援多個資訊頭管理器,資訊頭目将被合并起來構成采樣器清單。如果一個待合并條目比對一個已經存在的資訊頭名,那麼它就會替代目前的條目,除非條目值是空,在這種情況下已經存在的條目會被移除,這容許使用者設定一系列預設資訊頭,并對特定采樣器加以調整。
内容為空,有需要的時候進行添加,否則無需處理
一般的請求格式:
1、類似form表單
2、參數json格式,添加Content-Type:application/json,utf-8
3、參數是XML,添加text/xml
注:HTTP請求下的【HTTP資訊頭管理器】,有些值是發送請求必須的頭資訊,比如Referer、X-Requested-With、Content-Type(目前發現這幾個可能會影響請求是否成功)
5.7 HTTP授權管理器
可以了解為使用者名和密碼的驗證過程,也是一種驗證機制,比如說用戶端或浏覽器與服務端發生互動、發生請求時,需要提供憑證(URL、使用者名、密碼),送出後服務端通過後才會繼續後續的請求或者互動
- clear auth on each iteration:是不是每次疊代時都清空,不勾驗證一次可能就不再去驗證了,一般不勾
5.8 HTTP請求預設值
該元件可以為我們的http請求設定預設的值。假如,我們建立一個測試計劃有很多個請求且都是發送到相同的server,這時我們隻需添加一個 Http request defaults元件并設定“Server Name or IP”,然後添加多個http請求且不設定"server name or ip",這些http請求會預設使用Http request defaults元件設定的值。
參數清單:
Attribute | Description | Required |
Name | 元件名 | No |
Server | 域名或IP | No |
Port | 端口 | No |
Connect Timeout | 連接配接逾時時間(機關毫秒) | No |
Response Timeout | 響應逾時時間(機關毫秒) | No |
Implementation | 實作方式,預設值為Jmeter屬性:jemter.httpsampler | No |
Protocol | 協定,HTTP or HTTPS | No |
Method | 請求方法:HTTP GET or HTTP POST | No |
Path | 請求資源路徑 | No |
Send Parameters With the Request | 參數清單 | No |
Server (proxy) | 代理伺服器的域名或IP | No |
Port | 代理伺服器的端口 | No, unless proxy hostname is specified |
Username | 代理伺服器的使用者名 | No |
Password | 代理伺服器的密碼 | No |
Retrieve All Embedded Resources from HTML Files | 告訴Jmeter解析HTML檔案并發送所有資源請求(包括圖檔,java小程式,JS,CSS等) | No |
Use concurrent pool | 用一個連接配接池來擷取嵌入的資源 | No |
Size | 用于擷取嵌入式資源的并發連接配接池大小 | No |
Embedded URLs must match: | URL比對,過濾 | No |
☆特别注意:
在Jmeter之Http Cookie Manager這裡我們說過,一個測試計劃最好隻有一個Manager元件,因為Jmeter無法處理多個Manager的情況。但在一個測試計劃中可以有多個Defaults元件,多個Defaults元件的預設值會疊加。
例子:
如下,定義了兩個HTTP Request Defaults元件,一個Http sampler(one什麼也不填寫),一個View Resuls Tree:
HTTP Request Defaults1:Server Name or IP: www.baidu.com,一個參數:aaa=111
HTTP Request Defaults2:Server Name or IP: www.qq.com,兩個參數:bbb=22,aaa=333
運作結果:
總結:
1、一個測試計劃中可以有多個Defaults元件,多個Defaults元件的預設值會疊加,如上圖,雖然兩個Defaults 元件都定義了參數aaa,但發出的請求還是會疊加起來。
2、兩個default中都定義的"Server Name or IP",顯示在發送請求時隻能使用一個,這裡使用的是第一個default定義的值www.baidu.com
在說下預設請求的作用域,可以設定成全局變量,也可以設定成局部變量,當線上程外設定,線程内也設定了,使用線程内的預設值
5.9 Java請求預設值
5.10 JDBC Connection configuration
如果在Jmeter 中想用到連接配接資料庫的功能,必須下載下傳jar包,常見的關系型資料庫jar包見以下共享連結
連結:https://pan.baidu.com/s/1t-k9RW141lw0j_QSw53rqg
提取碼:p8ip
jar包下載下傳之後存放的路徑,網上大多數資料讓儲存在D盤根目錄下,我一般建議儲存在對應Jmeter的lib下的擴充目錄,比如 D:\00G_jmeter4.0\lib\ext
若是第一種: 下載下傳的jar包儲存在D盤根目錄下,則需要jmeter工程中測試計劃原件下指定一下jar包路徑,如圖:【圖中jar包隻是示意,不是jdbc依賴的jar包】
若是第二種: 下載下傳的jar包儲存在Jmeter的檔案的lib下的ext目錄下,則不需要做其他的配置了,也不用擔心以後給其他電腦copy檔案,忘記copy某個檔案夾了。
有了依賴的jar包後,從配置元件中選擇JDBC Connection Configuration,如下
将以上分為4個區域,先來介紹1區域Variable Name for created pool:
由于版本不同,我這邊是jmeter4.0版本,叫做Variable Name for created pool;其他的版本有叫做Variable Name...
Variable Name for created pool: 填寫入一個變量名,需要和用到的JDBC request 中,或者JDBC PreProcessor,或者JDBC PostProcessor中的變量名一緻;如此一來,一個測試計劃中可以綁定多個DB源;
其次介紹2區域,資料庫連接配接的配置,将資料庫url/port/db name/使用者名和密碼等填入
按照下面常用的sample填寫即可
1.mysql資料庫
Database URL :jdbc:mysql://localhost:3306/test --有時候會加上字元編碼等,如 jdbc:mysql://ip:3306/資料庫名?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
JDBC Driver class: 選擇com.mysql.jdbc.Driver
Username:root
Password:root
2. sqlserver資料庫
Database URL :jdbc:sqlserver://localhost:1433;databaseName=test
JDBC Driver class: 選擇com.microsoft.sqlserver.jdbc.SQLServerDriver
3. Oracle資料庫 【未親測】
Database URL : jdbc:oracle:thin:user/pass@//host:port/service
JDBC Driver class: 選擇 oracle.jdbc.OracleDriver
接下來介紹3區域,一般預設,Validation Query 一般選擇 select 1
最後是4區域,關于資料庫連接配接池的配置,你在一般使用中,預設即可;但是你想壓測,單獨負載測試DB,想找出DB最适合的連接配接池,就要稍加注意。我之後會再總結下.
MySQL
com.mysql.jdbc.Driver
jdbc:mysql://host:port/{dbname}
PostgreSQL
org.postgresql.Driver
jdbc:postgresql:{dbname}
Oracle
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:user/pass@//host:port/service
Ingres (2006)
ingres.jdbc.IngresDriver
jdbc:ingres://host:port/db[;attr=value]
MSSQL
com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc:sqlserver://IP:1433;databaseName=DBname
或者
net.sourceforge.jtds.jdbc.Driver
jdbc:jtds:sqlserver://localhost:1433/"+"library"
5.11 keystore configuration
5.12 LDAP Extended Request Defaults
5.13 LDAP 請求預設值
5.14 Random Variable
- 變量名稱(Variable Name) - 用于控制在其它元素中引用該值,形式:$(variable_name}
lOutput Format -可選格式,比如000,格式化為001,002,Minimum Value,Maximum Value都設定為1,Number format設定為000,那麼格式化後,第一個參數值為001,第二個為002,……,以此類推,假設format設定為user_000,那麼格式化後,第一個參數值為user_001,第二個參數值為user_002,...,以此類推。預設格式為Long.toString()
lMinimum Value 生成的最小随機數
lMaximum Value 生成的最大随機數
lSeed for Random function - 供随機數生成器使用的seed.如果為空,則使用預設的Random構造器。
lPer Thread(User)? - 如果設定為False,那麼所有線程共享同一個随機數生成器,如果設定為True,那麼每個線程獨享各自的随機數生成器
多線程運作的情況下:
l假如Seed for Random function不為空,為手動輸入的某個固定常量,
1) Per Thread(User)? 設定為True,那麼每個線程都使用自己的随機數生成器,因為Seed相同,是以,每次運作腳本,每個線程擷取到的随機數變量值是一樣的。
2) Per Thread(User)? 設定為False,那麼每個線程共享同一個随機數生成器,是以,每次運作腳本,每個線程擷取到的随機數變量值是不一樣的。
l假如Seed for Random function不為空,即按預設,那麼不管per Thread(User)?設定為True還是設定為False,生成的随機數都不相同
lseed相同,per Thread 設定為True ,每個線程使用各自的随機數生成器,是以兩個生成的随機數相同,要不同則設定為False
不管是多線程還是單線程,使用相同的Seed,運作相同次數,對應次數生成的随機數完全相同。
,也就是說,随機數生成器是根據Seed,然後按照某種算法一步一步生成随機數的,如果Seed一定,算法相同,那麼對應步驟産生的随機數也就一樣
推薦設定:
無特殊需求的情況下,建議Seed for Random function 不填,使用預設,Per Thread(User)?
設定為False
5.15 TCP取樣器配置
簡單來說,tcp取樣器的使用和HTTP請求流程基本一樣,都是建立sampler之後填寫必要的資訊即可。如下圖
參數填寫介紹
如上圖基本我們就是要注意紅框裡的幾處即可,下面分别做一個介紹。
TCPClient classname有三種設定:
TCPClientImpl:文本資料
BinaryTCPClientImpl:傳輸二進制資料,指定包結束符
LengthPrefixedBinaryTCPClientImpl:資料包中前2個位元組為資料長度。可在bin/jmeter.properties配置檔案中tcp.binarylength.prefix.length設定。
tcp的資料還是以二進制之類的居多吧,是以為了友善一般會選擇第二個設定。是以填寫org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
伺服器ip和端口:應該不用多說了,根據實際情況填寫即可;
要發送的文本:這裡就是16進制的資料了,可能會有朋友問這資料從哪裡擷取啊!當然是抓包擷取了。。。。。可以用wireshark來搞,類似下圖(從網上找的圖)
5.16 使用者定義的變量
- 使用場景:一組API根據業務流程制作成測試腳本,想要移植到其他測試環境時,由于資料庫發生了變更,有些初始化資料也相應發生了變化,例如環境位址、請求路徑等等。部落客甚至把伺服器位址和接口的部分共同請求路徑都做成了自定義變量。
- 自定義變量,與“測試計劃”中定義的變量效果是一樣的,這意味着使用“使用者定義的變量”添加的變量都是全局性的,不管你把它放到哪個線程組位置。
如果在其他地方定義了一個同樣名稱的變量,該變量的值會跟着更新。
引用已定義的變量:${變量名},比如: ${name}
如果變量未定義的話,引用變量會直接傳回表達式
比如變量 a 未定義,引用變量 ${a},傳回值就是:${a}
1.Jmeter對于變量名好像沒有什麼限制,任意字元都可以,比如數字、中文、特殊符号什麼的,甚至表達式本身也可以做為變量名,比如變量名設定為 ${age},最終結果變量名會是12(age的值是12),但一般不建議設定比較奇葩的變量名,免得不知道什麼時候就會出現個奇怪的問題
2.變量值盡量不要使用函數去生成不同的值,比如age值為:${__Random(1,10,),它事實上每次運作隻會産生一個值,而不會在每個請求中分别生成的不同的随機值。
需要說明的是,伺服器IP位址和端口号以及接口共同的請求路徑部分,作為變量引用時,需要在路徑填充表格的最前面添加兩個斜杠“//”,不加的話會引用失敗。
5.17 登陸配置元件/素
5.18 簡單配置元件
5.19 計數器
- 啟動(Starting value):開始值
- 遞增:即步長,以多少進行增長,若值為2,起始值為1,那麼第二個請求執行時就是3
- 最大值(Maxinum value):一直遞增到最大值時停止增長
- Number format:python-00000000,0表示占位符
- 引用名稱:存儲遞增後的值,如num
- 與每使用者獨立的跟蹤計數器:每個線程都去獨立計數,互不幹擾,準确性會更高一點
PS:如果周遊一次後已經達到最大值了,但還達到線程的循環數,此時又會重頭開始周遊
為了看起來更直覺一點,把線程數改成15,重新運作,結果如下:
作者:倔強的潇灑小姐
連結:https://www.jianshu.com/p/a36d964c5f0f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。