以前用LR,到新公司了不能用了,只能用jmeter.html
想實現參數化隨機取值的效果.參考了下面的連接java
http://lijingshou.iteye.com/blog/2047613 連接A正則表達式
http://www.51testing.com/html/12/252512-222896.html 連接Bshell
使用All threads,好比說參數化文件裏有4個值express
1apache
2windows
3centos
4bash
兩個線程,迭代兩次,那麼第一個線程使用的數據是1和3,第二個線程使用的是2和4.服務器
下面是從連接B中取出來的內容
jmeter 2.3閃退
一直用jmeter3.1作作接口測試,有一天要作壓測了,溝通了以後發現公司用的壓測機是2.3版本的.
下載了jmeter2.3,居然閃退,日誌根本沒有看清就消失了,查看了一下java版本,發現java -version和ehco %java_home%居然不對應,在網上找了一通,說是把%JAVA_HOME%\bin提到path環境變量的最前面,可是我已經提到最前面的了仍是不行,後來想一想是否是由於我一直有用戶的環境變量下配置的緣由.因而換到系統環境變量的配置JAVA_HOME和path而且把java_home的配置放到path的最前面,最後在cmd裏看就改好了.java -version和java_home已經一致了.
jmeter加載依賴包
參考自 http://blog.csdn.net/musen518/article/details/50233897
jmeter依賴包加載方式不少的
常規方法
jmeter_home/lib,這裏能夠放依賴包,重啓jmeter生效,可是這樣不便於包管理
點擊測試計劃根節點,右下角有」Add directory or jar to classpath「,能夠選擇須要加載的jar包,相對前一種方法有所改善,能夠自主管理不一樣測試依賴包
進階方法
修改jmeter.properties配置項,找到# Classpath configuration區域(修改下面一種就行)
1. 修改user.classpath選項,指定爲單個路徑,該目錄下全部包都自動加載(這裏jar多了容易出現jvm oom,謹慎使用)
2. 修改plugin_dependency_paths選項,指定爲單個路徑,該目錄下全部包都自動加載(推薦,還沒出現oom現象)
填寫項說明:
一、名稱、註釋:元件的名稱及註釋
二、Config the CSV Data Source:
1)Filename:csv文件的名稱(包括絕對路徑,當csv文件在bin目錄下時,只需給出文件名便可)
2)File encoding:csv文件編碼,能夠不填
3)Variable Names(comma-delimited):csv文件中各列的名字(有多列時,用英文逗號隔開列名),這個變量名稱是在其餘處被引用的,因此爲必填項。
4)Delimiter(use 「\t」 for tab):csv文件中的分隔符(用」\t」代替tab鍵)(通常狀況下,分隔符爲英文逗號)
5)Allow quoted data?:是否容許引用數據,---這個目前還未弄明白,設置成True或者False都能正常引用數據。
6)Recycle on EOF?:到了文件尾是否循環,True—繼續從文件第一行開始讀取,False—再也不循環
7)Stop thread on EOF?:到了文件尾是否中止線程,True—中止,False—不中止,注:當Recycle on EOF設置爲True時,此項設置無效。
8)Sharing mode:共享模式,All threads –全部線程,Current thread group—當前線程組,Current thread—當前線程。這個地方和LoadRunner中的迭代取之相反,經試驗得出來的結果是:
All threads:測試計劃中全部線程,假如說有線程1到線程n (n>1),線程1取了一次值後,線程2取值時,取到的是csv文件中的下一行,即與線程1取的不是同一行。
Current thread group:當前線程組,假設有線程組A、線程組B,A組內有線程A1到線程An,線程組B內有線程B1到線程Bn。取之狀況是:線程A1取到了第1行,線程A2取第2行,如今B1取第1行,線程B2取第2行。
Current thread:當前線程。假設測試計劃內有線程1到線程n (n>1),則線程1取了第1行,線程2也取第1行。
【在試驗的過程當中,發現:線程循環時,去取csv值時,也算入迭代。例如,當設置爲Current thread時,線程1第1次取了第1行,第2次取的就是第2行】
配置好CSV Data Set Config後,就能夠在須要調用參數的地方進行調用了,如上圖中配置的pp.csv文件,就能夠用${passport},進行調用了。
JMETER取當前時間參數
函數的wiki在https://jmeter.apache.org/usermanual/functions.html
函數不要用在用戶自定義的變量裏,要用在beanshell裏,url,body等地方
beanshell裏寫文件操做
import java.io.*; import java.io.IOException; log.info("start"); FileWriter fw = new FileWriter("examples/wtf.csv",true); log.info("writhe ${username}的 token:${token}"); if("${error_code}".equals("36202")){ fw.write(vars.get("username")+"\n"); } log.info("close"); fw.close();
beanshell裏寫if
if("${error_code}".equals("36202")){ fw.write(vars.get("username")+"\n"); }
beanshell裏用這些函數的方法爲: 直接當字符串使用,
String body = "${__time(,)}${__threadNum}${__counter(true)}"; vars.put("body","${__UUID()}");
若是發現最後獲取的數據爲StandardJMeterEngine,則是函數用錯地方了,好比說用在用戶自定義參數裏了
用戶自定義參數只會執行一次,全部的用戶自定義參數不管放在哪裏,地位都是同樣的,只加載一次
${__time(,)} 1450056496991 //無格式化參數,返回當前毫秒時間 ${__time(yyyyMMdd,)} 20151214 //返回年月日 ${__time(HHmmss,)} 092816 //返回時分秒 ${__time(yyyyMMdd-HHmmss,)} 20151214-092816 //全 //線程ID-迭代次數ID-當時時間精確到秒-當前時間精確到毫秒數計數 ${__threadNum}_${__counter(true)}_${__time(yyyyMMddHHmmss,)}_${__time(,)} Jmeter函數Random自動生成隨機數 Random使用方式:${__Random( param1,param2 ,param3 )} param1爲隨機數的下限 param2爲隨機數的上限 param3爲存儲隨機數的變量名,是選填項。 ${__Random(100,200,id)}
JMETER響應斷言 Response_Assertion
今天寫腳本的時候遇到一個場景,響應裏有個字段,好比 isblackuser,這個字段是false或者true都是正確的.可是若是沒有值那就是接口有問題.即須要判斷響應裏包含 "isblackuser":false, 或者 isblackuser":true, 很明顯,這裏要用正則匹配了,寫起來比較簡單,直接是 "isblackuser":(false|true), 不能用默認的substring了,得用contains,由於substring不支持正則,contains才支持正則.
參考的頁面是: https://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion
JMETER設置超時時間 Duration Assertion
參考的網頁爲:https://jmeter.apache.org/usermanual/component_reference.html#Duration_Assertion
The Duration Assertion tests that each response was received within a given amount of time. Any response that takes longer than the given number of milliseconds (specified by the user) is marked as a failed response.
Screenshot of Control-Panel of Duration Assertion
還能夠對響應的大小進行判斷,不過這個應該用的比較少
參考的網頁: https://jmeter.apache.org/usermanual/component_reference.html#Size_Assertion
JMETER中使用正則表達式提取器
http://jmeter.apache.org/usermanual/component_reference.html#Regular_Expression_Extractor
Screenshot of Control-Panel of Regular Expression Extractor這裏在寫regular expression時,若是用了*來匹配,要注意是否使用貪婪,好比響應是
{"id":123456,""isSuccess":true,"code":"0","info":"成功"}若是要獲取ID值,regular若是寫成id":(.*),那麼匹配出來的值是123456,""isSuccess":true,"code":"0",由於*在正則表達式裏默認是貪婪的,會一直匹配到最後一個逗號,這裏就須要用到非貪婪,寫regular expression時使用id":(.*?),加一個問號.
參考於: http://www.cnblogs.com/wuyepiaoxue/p/5661194.html
JMETER參數跨線程組共享
參考的連接爲: http://blog.csdn.net/jasonliujintao/article/details/71542021
假設腳本里有2個線程組A和B,如何在線程組B中使用線程組A裏提取出的參數值?
如在線程A的某個sample的響應裏提取到了一個參數名爲ID
在線程A的最後添加BeanShell Sampler,內容爲
${__setProperty(idBeanShell,${id},)}
注意,這個BeanShell Sampler必定要添加到已經提取參數ID的sample以後,不然腳本內容沒法生效,通常放在最在線程組的最後面便可.
而後在線程組B裏使用的時候這樣寫
${__property(idBeanShell)}
上面兩個紅色的參數要一致,不然沒法實現效果
還有用其它方法實現的,使用的是BeanShell PostProcessor,寫法比這個複雜,
參考: http://www.cnblogs.com/allen-zml/p/6552535.html
JMETER響應亂碼
參與出處: http://tenfee.blog.51cto.com/6353835/1915332
Jmeter安裝目錄/bin/jmeter.properties中sampleresult.default.encoding默認爲ISO-8859-1,將參數修改成
sampleresult.default.encoding=utf-8 便可
同時注意將註釋符號#去掉,不然不會生效
JMETER二次開發-在eclipse裏調試
參考於: http://www.cnblogs.com/taoSir/p/5144274.html
JMETER二次開發-修改編譯語言爲英語
來源於: https://my.oschina.net/u/1245468/blog/863053
JMETER二次開發-基於jmeter3.0版本的csv data set config二次開發(實現從指定行開始讀取)
來源於: http://zfy421.iteye.com/blog/2322251
jmeter隨機取參數值
jmeter能用來作參數化的組件有幾個,可是都沒有隨機取值的功能,遇到隨機取值的需求怎麼辦呢?
突發奇想,能夠用函數__CSVRead()來實現:
__CSVRead()
CSV file to get values from | *alias:表示要讀取的文件路徑
CSV文件列號| next| *alias:表示當前變量讀取第幾列數據,注意第一列是0;
因而可知咱們只需將參數化數據在csv中橫向排列,而後用隨機函數__Random()指定文件序列號便可。
${__CSVRead(D:\t.txt,${__Random(1,6,)})} t.txt文件內容:a,s,d,f,g,h
上面的方法親測可用,可是也不足的地方,若是參數值的數量過大的話,處理起來比較麻煩,不過notepad++能夠輕鬆搞定.但即使如此,也不如一行行地看方便對吧.
其中的${__Random(1,6,)}中的6,表示有多少個參數值,若是有70000個參數值,這裏就寫70000就行了;
注意用了上面的方法後就不用再設置CSV Data Set Config了,直接在寫參數對就能夠了
注意,上面的D:\t.txt是指的參數文件的位置,這個必須寫絕對路徑,相對路徑這裏很差使;
另外,若是腳本里沒有成功獲取參數值,而是把整個函數打出來了,說明多是函數的格式不對,少了大括號,小括號等等.
Jmeter之Constant Timer與constant throughput timer的區別
http://www.cnblogs.com/111testing/p/6729551.html
Constant Throughput Timer 的主要屬性介紹:
名稱 :定時器的名稱
Target throughput(in samples per minute):目標吞吐量。注意這裏是每分鐘發送的請求數,所以,對應測試需求中所要求的20 QPS ,這裏的值應該是1200 。
Calculate Throughput based on :有5個選項,分別是:
This thread only :控制每一個線程的吞吐量,選擇這種模式時,總的吞吐量爲設置的 target Throughput 乘以矣線程的數量。
All active threads : 設置的target Throughput 將分配在每一個活躍線程上,每一個活躍線程在上一次運行結束後等待合理的時間後再次運行。活躍線程指同一時刻同時運行的線程。
All active threads in current thread group :設置的target Throughput將分配在當前線程組的每個活躍線程上,當測試計劃中只有一個線程組時,
該選項和All active threads選項的效果徹底相同。
All active threads (shared ):與All active threads 的選項基本相同,惟一的區別是,每一個活躍線程都會在全部活躍線程上一次運行結束後等待合理的時間後再次運行。
All cative threads in current thread group (shared ):與All active threads in current thread group 基本相同,惟一的區別是,
每一個活躍線程都會在全部活躍線程的上一次運行結束後等待合理的時間後再次運行。
如上圖,該元件僅做用於fnng.cnblogs.com ,設置定時器的Target throughput爲1200/分鐘(20 QPS),設置Calculate Throughput based on 的值爲All active threads 。
固然,Constant Throughput Timer只有在線程組中的線程產生足夠多的request 的狀況下才有意義,所以,即便設置了Constant Throughput Timer的值,也可能因爲線程組中的線程數量不夠,或是定時器設置不合理等緣由致使整體的QPS不能達到預期目標。
關於jmeter控制併發量的設置
爲了控制量,須要計算每一個線程每分鐘的請求數,使用Constant throughout timer,好比需求是每分鐘10萬的請求量, 我如今有16臺壓測機,每一個壓測機20個線程,那麼每一個線程每分鐘的請求數大概是32個.
線程組的設置
控制併發量
咱們有一個jmeter master-slave環境,master是windows12, slave是centos
最近運維同事有個需求,全部的windows服務器都要開啓防火牆,只開放固定的端口
我開始的時候在防火牆的入口規則里加上4445端口,可是master連slave仍是失敗,查了資料沒有結果
我暫時把防火牆打開,讓master連slave,跑起來,而後在master windwos服務器上用netstat -an及在slave上也用一樣的命令查看了master和slave之間的溝通
master連slave的1099端口,slave連master的55762端口,我查了下jmeter的源代碼和資料配置等,沒有地方看到有55762端口,
我把slave和master重啓一下,再試一次,slave仍是連master的55762端口,而後我就在防火牆的入口規則裏配置上55762端口,而後開啓防火牆
再次啓動slave和master,再試一次壓測,成功了,防火牆開着,master開啓55762端口,slave和master能溝通成功