伺服器測試腳本
右上角設置->高級->系統->打開您計算機的代理設置->連接->區域網設置->勾選「為LAN使用代理伺服器」->地址輸入:127.0.0.1->端友知口輸入:8888->勾選『』對於本地地址不使用代理伺服器->確定。好敏消
PS:設置代理時要關掉抓包工具,因為它也是一個代理伺服器。
註:jmeter自帶代理伺服器
1、設置代理
啟動Jmeter->測試計劃->右鍵添加「非測試元件」->選擇HTTP代理伺服器->設置埠:8888->Test Plan Creation-> 目標控制器選擇「後面創建的自定義線程組」。
2、創建線程組存放腳本
測試計劃->右鍵添加「Threads」->選擇「線程組」-> 自定義線程組名稱 ->保存。
3、提前設置過濾
通常會碰到錄制完腳本後查看Jmeter有多餘的請求,我們可提前設置過濾去掉不需要的請求。
在HTTP代理伺服器頁面,點擊"Requests Filtering",找到「排除模式」後添加並輸入多個正則表達式 ,每行一個(.*\.php.* 或 .*\.js.* 或 .*\.png.* 或 .*\.gif.* 或 .*\.txt.* )。設置完成後,再重新啟動代理錄制腳本即可。
PS:話說之前學到的正則表達式終於用上了~
4、錄制腳本
在jmeter代理伺服器里「啟動」伺服器->彈出窗口點擊ok->操作瀏覽器里目標網頁->結束錄制需要的模塊後,點擊jmeter「停止」,在Jmeter里查看腳本。
5、優化腳本
錄制完成後,可能還存在一些漏網之魚,可根據實際需要增刪請求或配置。
PS:刪除了多餘的請求;配置了監聽器-查看結果樹後,有些請求失敗了,添加了cookie管理器後全都請求成功。
註:B/S錄制完腳本一定要添加cookie管理器
6、瀏覽器增加證書(如果有需求訪問Https,無可省略)
右上角設置->高級->隱私設置與安全性->證書->受信任的證書頒發機構->導入->在jmeter文件夾 bin 目錄下 選擇證拿亮書(只要開啟過代理伺服器,都會生成證書)。
錄制完成後,一定要記得關閉代理伺服器,否則上不了網。問題來了,如何取消代理伺服器的設置呢?
右上角設置->高級->系統->打開您計算機的代理設置->連接->區域網設置->取消勾選「為LAN使用代理伺服器」->確定。
『貳』 loadrunner如何使用
1、使用LoadRunner 完成測試一般分為四個步驟:
2、Vvitrual User Generator 創建腳本
創建腳本,選擇協議
錄制腳本
編輯腳本
檢查修改腳本是否有誤
3、中央控制器(Controller)來調度虛擬用戶
創建Scenario,選擇腳本
設置機器虛擬用戶數
設置Schele
如果模擬多機測試,設置Ip Spoofer
4、運行腳本
分析scenario
分析測試結果
5、安裝LoadRunner 中文版
LoadRunner 分為Windows 版本和Unix 版本。如果我們的所有測試環境基於Windows
平台, 那麼我們只要安裝Windows 版本即可。本章講解的安裝過程就是LoadRunner7.8中文的Windows 版本的安裝。
6、使用LoadRunner進行負載/壓力測試
7、錄制基本的用戶腳本
創建用戶腳本需要用到VuGen。提示: 運行VuGen 最好在1024*768 的解析度下, 否則有些工具欄會看不到。
啟動Visual User Generator 後, 通過菜單新建一個用戶腳本, 選擇系統通訊的協議。
這里我們需要測試的是Web 應用,同時考慮到後台sql資料庫所以我們需要選擇Web(HTTP/HTML)協議+SQL SERVER協議,確定後, 進入主窗體。通過菜單來啟動錄制腳本的命令。
8、在URL 中添入要測試的Web 站點地址..。
●測試http://lms.ah.sp.com.cn/lms-lmm/loginForm.do選擇要把錄制的腳本放到哪一個部分, 默認情況下是「Action」。
這里簡單說明一下:VuGen 中的腳本分為三部分:vuser_init、vuser_end 和Action。其
中vuser_init 和vuser_end 都只能存在一個, 不能再分割, 而Action 還可以分成無數多個部分( 通過點擊New 按鈕, 新建ActionXXX)。在錄制需要登陸的系統時, 我們把登陸部分放到vuser_init 中, 把登陸後的操作部分放到Action 中, 把注銷關閉登陸部分放到vuser_end 中。( 如果需要在登陸操作設集合點, 那麼登陸操作也要放到Action 中, 因為vuser_init 中不能添加集合點) 在其他情況下, 我們只要把操作部分放到Action 中即可。注意: 在重復執行測試腳本時,vuser_init 和vuser_end 中的內容只會執行一次, 重復執行的只是Action 中的部分。
點「 選項 」按鈕, 進入錄制的設置窗體, 這里一般情況下不需要改動。
●然後點「OK」 後,VuGen 開始錄制腳本。在錄制過程中, 不要使用瀏覽器的「 後退」 功能,LoadRunner 支持不太好! 錄制過程中, 在屏幕上會有一個工具條出現。錄制的過程和WinRunner 有些類似, 不再多介紹。錄制完成後, 按下「 結束錄制」 按鈕,VuGen 自動生成用戶腳本, 退出錄制過程。
完善測試腳本
當錄制完一個基本的用戶腳本後, 在正式使用前我們還需要完善測試腳本, 增強腳本的
靈活性。一般情況下, 我們通過以下幾種方法來完善測試腳本。插入事務、插入結合點、插入註解、參數化輸入。這里只舉例介紹參數化如何設置,其它只作簡單介紹。
插入事務
事務(Transaction): 為了衡量伺服器的性能, 我們需要定義事務。比如: 我們在腳本
中有一個數據查詢操作, 為了衡量伺服器執行查詢操作的性能, 我們把這個操作定義為一個事務, 這樣在運行測試腳本時,LoadRunner 運行到該事務的開始點時,LoadRunner 就會開始計時, 直到運行到該事務的結束點, 計時結束。這個事務的運行時間在結果中會有反映。
插入事務操作可以在錄制過程中進行, 也可以在錄制結束後進行。LoadRunner 運行在
腳本中插入不限數量的事務。
具體的操作方法如下: 在需要定義事務的操作前面, 通過菜單或者工具欄插入。輸入該事務的名稱。注意: 事務的名稱最好要有意義, 能夠清楚的說明該事務完成的動作。插入事務的開始點後, 下面需要在需要定義事務的操作後面插入事務的「 結束點」。同樣可以通過菜單或者工具欄插入。默認情況下, 事務的名稱列出最近的一個事務名稱。一般情況下, 事務名稱不用修改。事務的狀態默認情況下是LR_AUTO。一般情況下, 我們也不需要修改, 除非在手工編寫代碼時, 有可能需要手動設置事務的狀態。
插入集合點
插入集合點是為了衡量在加重負載的情況下伺服器的性能情況。在測試計劃中, 可能會
要求系統能夠承受1000 人同時提交數據,在LoadRunner 中可以通過在提交數據操作前面加入集合點, 這樣當虛擬用戶運行到提交數據的集合點時,LoadRunner 就會檢查同時有多少用戶運行到集合點,如果不到1000 人,LoadRunner 就會命令已經到集合點的用戶在此等待, 當在集合點等待的用戶達到1000 人時,LoadRunner 命令1000 人同時去提交數據, 從而達到測試計劃中的需求。
注意: 集合點經常和事務結合起來使用。集合點只能插入到Action 部分,vuser_init 和vuser_end 中不能插入集合點。具體的操作方法如下: 在需要插入集合點的前面, 通過菜單或者工具欄操作輸入該集合點的名稱。注意: 集合點的名稱最好要有意義, 能夠清楚的說明該集合點完
成的動作。
插入注釋
注釋的作用就不多說了, 不過插入注釋最好是在錄制過程中。具體的操作方法如下: 在需要插入注釋的前面, 通過菜單或者工具欄操作
參數化輸入
如果用戶在錄制腳本過程中, 填寫提交了一些數據, 比如要增加資料庫記錄。這些操作
都被記錄到了腳本中。當多個虛擬用戶運行腳本時, 都會提交相同的記錄, 這樣不符合實際的運行情況, 而且有可能引起沖突。為了更加真實的模擬實際環境, 需要各種各樣的輸入。參數化輸入是一種不錯的方法。
用參數表示用戶的腳本有兩個優點:
① 可以使腳本的長度變短。
② 可以使用不同的數值來測試你的腳本。例如, 如果你企圖搜索不同名稱的圖書, 你
僅僅需要寫提交函數一次。在回放的過程中, 你可以使用不同的參數值, 而不只搜索一
個特定名稱的值。
參數化包含以下兩項任務:
① 在腳本中用參數取代常量值。
② 設置參數的屬性以及數據源。
參數化僅可以用於一個函數中的參量。你不能用參數表示非函數參數的字元串。
另外, 不是所有的函數都可以參數化的。
參數化輸入的講解, 我們採用一個例子的方式來進行。
在本例中我們參數化用戶的登陸名:
先看如下腳本,通過腳本錄制找到用戶登陸部分,如圖
參數名隨意取,建議取通俗易懂的名字,下面我們重點介紹一下參數的類型。
●DateTime: 很簡單, 在需要輸入日期/時間的地方, 可以用DateTime 類型來替代。
其屬性設置也很簡單, 選擇一種格式即可。當然也可以定製格式。
.●Group Name:暫時不知道何處能用到,但設置比較簡單。在實際運行中,LoadRunner
使用該虛擬用戶所在的Vuser Group 來代替。但是在VuGen 中運行時,Group Name
將會是None
.●Load Generator Name: 在實際運行中,LoadRunner 使用該虛擬用戶所在Load Generator 的機器名來代替。
.●Iteration Number: 在實際運行中,LoadRunner 使用該測試腳本當前循環的次數來
代替。
.●Random Number: 隨機數。很簡單。在屬性設置中可以設置產生隨機數的范圍
.●Unique Number:唯一的數。在屬性設置中可以設置第一個數以及遞增的數的大小。
注意: 使用該參數類型必須注意可以接受的最大數。例如: 某個文本框能接受的
最大數為99。當使用該參數類型時, 設置第一個數為1, 遞增的數為1, 但100 個
虛擬用戶同時運行時,第100 個虛擬用戶輸入的將是100,這樣腳本運行將會出錯。
注意: 這里說的遞增意思是各個用戶取第一個值的遞增數, 每個用戶相鄰的兩次循
環之間的差值為1。舉例說明: 假如起始數為1, 遞增為5, 那麼第一個用戶第一
次循環取值1, 第二次循環取值2; 第二個用戶第一次循環取值為6, 第二次為7;
依次類推。
●Vuser ID: 設置比較簡單。在實際運行中,LoadRunner 使用該虛擬用戶的ID 來代
替,該ID 是由Controller 來控制的。但是在VuGen 中運行時,Vuser ID 將會是–1。
File: 需要在屬性設置中編輯文件,添加內容,也可以從現成的資料庫中取數據( 下
面我們將會介紹)
●User Defined Function: 從用戶開發的dll 文件提取數據。就目前我認為, 這種方式
沒有必要。VuGen 支持C 語言的語法,在VuGen 中重新編寫類似的函數應該不難。
上面的例子中, 我們取隨機數即可。點「Properties… ..」 按鈕, 進行屬性設置窗口
添入隨機數的取值范圍為(1-50), 選擇一種數據格式。在「屬性」 中有以下幾
個選項:
◆Each Occurrence:在運行時, 每遇到一次該參數, 便會取一個新的值
◆Each iteration:運行時, 在每一次循環中都取相同的值
◆Once:運行時, 在每次循環中, 該參數只取一次值
這里我們用的是隨機數, 選擇Each Occurrence 非常合適。
下面我們再介紹用資料庫中的用戶名來參數化登陸用戶名。
框選住登陸名,點滑鼠右鍵,彈出對話框,選擇「替換為新參數」彈出對話框,此時參數名輸入:name,參數類型選擇File,如圖
注意: 參數的文件名不要使用con.dat、pm.dat 或者lpt*.dat 等系統裝置名下面我們將會連接資料庫, 從數據表中選擇用戶名。點「數據向導」 按鈕,顯示如圖
添入連接字元串, 點「創建」 按鈕,選擇事先配置好的ODBC連接。在SQL語句里輸入select查詢語句,出現如圖窗口
提醒: 在參數數據顯示區, 最多隻能看到100 行, 如果數據超過100 行, 只能點「編輯」 按鈕, 進入記事本看。
「選擇下一行 」 有以下幾種選擇:
●Sequential: 按照順序一行行的讀取。每一個虛擬用戶都會按照相同的順序讀取
●Random: 在每次循環里隨機的讀取一個, 但是在循環中一直保持不變
●Unique : 唯一的數。注意: 使用該類型必須注意數據表有足夠多的數。比如Controller 中設定20 個虛擬用戶進行5 次循環, 那麼編號為1 的虛擬用戶取前5 個數, 編號為2 的虛擬用戶取6-10 的數, 依次類推, 這樣數據表中至少要有100 個數據, 否則Controller 運行過程中會返回一個錯誤。
「按編號」指選擇列表中的那一列數據,從左到右分別是1、2、3依次
通常用在有關聯性的數據上面。我們這里取值Sequential 即可。完成設置關閉即可
4.3 單機運行測試腳本
經過以上的各個步驟後, 腳本就可以運行了。運行腳本可以通過菜單或者工具欄來操作。
執行「 運行」 命令後,VuGen 先編譯腳本, 檢查是否有語法等錯誤。如果有錯誤,VuGen
將會提示錯誤。雙擊錯誤提示,VuGen 能夠定位到出現錯誤的那一行。為了驗證腳本的正
確性, 我們還可以調試腳本, 比如在腳本中加斷點等, 操作和在VC 中完全一樣, 相信大家誰都不會感到陌生。如果編譯通過, 就會開始運行。然後會出現運行結果。
『叄』 JMeter之代理伺服器錄制腳本
在JMeter中可以使用自身就帶的HTTP代理伺服器組件錄制腳本,可以錄制在WEB上的操作,也可以錄制在手機App上的操作。
1、測試計劃內包含的元件
添加元件操作步驟:
創建測試計劃
創建線程組:選中「測試計劃」右鍵 —> 添加 —> 線程(用戶) —> 線程組。
在線程組中,添加配置原件「HTTP Cookie管理器」組件:選中「線程組」右鍵 —> 添加 —> 配置元件 —> HTTP Cookie管理器。
說明:如果錄制的操作包括 用戶登錄操作 ,則需要添加「HTTP Cookie管理器」,添加之後不需要任何配置,錄制後,腳本中便保存用戶登錄的相關信息。
在測試計劃下,添加非測試元件「HTTP代理伺服器」組件:選中「測試計劃」右鍵 —> 添加 —> 非測試元件 —> HTTP代理伺服器。
在HTTP代理伺服器組件下,添加監聽器「察看結果樹」組件:選中「HTTP代理伺服器」右鍵 —> 添加 —> 監聽器 —> 察看結果樹。
最終測試計劃中的元件如下:
點擊運行按鈕,會提示你先保存該腳本,腳本保存完成後會直接自動運行該腳本。
2、HTTP代理伺服器的設置內容
在HTTP代理伺服器組件中,我們需要編輯:
埠: 默認8888,一般使用默認即可。主要不能與本地其他服務的埠號沖突,否則啟動不了。
HTTPS Domains: 我的理解就是,設置代理伺服器的主機IP地址或者域名。因為在我們本地使用,一般就是 localhost 或者127.0.0.1即可,當然不填寫也是可以的。(此填寫的地址一定要能夠連接外網)
設置目標控制器: 也就是錄制的組件存儲到什麼位置。這個一定要選,下圖中選擇了存儲到目標線程組中。
配置完的界面內容,如上圖所示。
3、設置瀏覽器的代理伺服器
每個瀏覽器都可以設置伺服器的代理,以Chrome瀏覽器為例。【設置需要區分是否為區域網】
點擊右上角的設置 —> 高級 —> 系統 —> 最下面的『』打開您計算機的代理設置『』,點擊右側圖標,就可以進入到代理伺服器的設置頁面了。
選要選中手動配置代理伺服器,然後輸入代理伺服器的地址或者域名,還有埠號。
這里的配置,要和上面JMeter的HTTP代理伺服器中的埠和HTTPS Domains的配置要對應上。
這樣的話,瀏覽器中的操作,會先發送到JMeter中的HTTP代理伺服器,在通過網路進行傳輸。這樣JMeter中就可以錄制下我們的操作,生成腳本了。
如下圖所示:
4、錄制腳本
以上內容設置完畢後,在瀏覽器地址欄中輸入要錄制腳本的地址。
然後在JMeter中的HTTP代理伺服器界面,點擊啟動按鈕。
提示:在HTTP代理伺服器界面點擊「啟動」時,Meter將生成自己的證書。證書生成可能需要一些時間,在此期間,GUI將無響應。證書生成完成後,GUI將顯示一個彈出對話框,其中包含根CA證書的詳細信息,證書有效期為7天。該證書需要由瀏覽器安裝,以便接受JMeter生成的主機證書。
如下圖所示:
瀏覽器配置證書: 瀏覽器中導入證書 ,jmeter安裝目錄下的ApacheJMeterTemporaryRootCA.crt
之後開始在網站上進行操作,所有操作發出的請求,都會錄制到JMeter腳本中。
操作完成之後,到JMeter的HTTP代理伺服器中點擊「停止」,然後將瀏覽器的代理設置恢復原樣即可。
不恢復的話,會導致你無法使用瀏覽器訪問外網。
如下圖所示:【錄制時彈出的控制器,不用進行設置,關閉時 點擊 停止 即可】
5、查看錄制的腳本
在JMeter中我們可以看到已經 記錄 了許多請求對應的信息,包括PHP、js、.jpg、.png、.txt等請求。
如下圖所示:
我們可以看到,我們只進行了簡單的幾步操作,卻錄制這么的請求。是因為JMeter錄制很多非關鍵性的請求,這就需要我們進行一些優化。
錄制腳本的優化有兩個步驟:
在錄制的時候,做一些過濾和排除操作。
在錄制後的腳本中手動優化,刪除不需要的組件,增加自己需要的組件。
1)伺服器名稱或IP與目標網站不同的、無關的,可以刪除。
2)js/css/png/jpeg等這類請求刪掉。
3)沒有傳遞任何數據的請求可以屏蔽掉,等流程能回放成功了,這些再刪除。如果回放不成功,再一個一個打開,進行檢查。
6、HTTP代理伺服器的排除模式
在測試腳本中有一些錄制的信息是沒有任何作用的,所以我們在錄制腳本的時候,就可以通過HTTP代理伺服器的排除模式,排除一些不需要的請求信息,如css、gif、png等請求。
例如:
在包含模式添加填上 .*\.jsp,只在請求JSP文件時錄制腳本。
這里通常都是設置JSP或者HTML,可以根據具體情況進行填寫。
在排除模式處填上.*\.js ,在請求js文件時不錄制腳本。
這里通常都是設置js、jpg、png、gif、css等,這些類型文件請求都是不需要錄制的。
當然我們也可以點擊添加建議排除按鈕,會自動生成一個過濾的正則表達式。
如下圖所示:
添加上這些時候,錄制出來的腳本,多餘的累贅會減少很多。
7、保存腳本
腳本錄制完成後,需要進行腳本的保存。
把腳本保存到本地,可以分享給其他成員,進行查看、編輯、回放等操作。
『肆』 jmeter怎麼測試其他伺服器上的測試資料庫
1.測試計劃是使用 JMeter 進行測試的起點,它是其它 JMeter 測試元件的容器。
2.線程組:代表一定數量的並發用戶,它可以用來模擬並發用戶發送請求。實際的請求內容在Sampler中定義,它被線程組包含。可以在「測試計
劃->添加->線程組」來建立它,然後在線程組面板里有幾個輸入欄:線程數、Ramp-Up Period(in
seconds)、循環次數,其中Ramp-Up Period(in seconds)表示在這時間內創建完所有的線程。如有8個線程,Ramp-Up
= 200秒,那麼線程的啟動時間間隔為200/8=25秒,這樣的好處是:一開始不會對伺服器有太大的負載。線程組是為模擬並發負載而設計。
3、取樣器(Sampler):模擬各種請求。所有實際的測試任務都由取樣器承擔,存在很多種請求。如:HTTP 、ftp請求等等。
4、監聽器:負責收集測試結果,同時也被告知了結果顯示的方式。功能是對取樣器的請求結果顯示、統計一些數據(吞吐量、KB/S……)等。
6、斷言:用於來判斷請求響應的結果是否如用戶所期望,是否正確。它可以用來隔離問題域,即在確保功能正確的前提下執行壓力測試。這個限制對於有效的測試是非常有用的。
7、定時器:負責定義請求(線程)之間的延遲間隔,模擬對伺服器的連續請求。
5、邏輯控制器:允許自定義JMeter發送請求的行為邏輯,它與Sampler結合使用可以模擬復雜的請求序列。
8. 配置元件維護Sampler需要的配置信息,並根據實際的需要會修改請求的內容。
9. 前置處理器和後置處理器負責在生成請求之前和之後完成工作。前置處理器常常用來修改請求的設置,後置處理器則常常用來處理響應的數據。
二、Jmeter報告 (轉載)
http://www.cnblogs.com/jackei/archive/2006/11/13/558720.html
1、Aggregate Report 解析
Aggregate Report 是 JMeter 常用的一個 Listener,中文被翻譯為「聚合報告」。今天再次有同行問到這個報告中的各項數據表示什麼意思,順便在這里公布一下,以備大家查閱。
如果大家都是做Web應用的性能測試,例如只有一個登錄的請求,那麼在Aggregate Report中,會顯示一行數據,共有10個欄位,含義分別如下。
Label:每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這里顯示的就是 Name 屬性的值
#Samples:表示你這次測試中一共發出了多少個請求,如果模擬10個用戶,每個用戶迭代10次,那麼這里顯示100
Average:平均響應時間——默認情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單位顯示平均響應時間
Median:中位數,也就是 50% 用戶的響應時間
90% Line:90% 用戶的響應時間
Note:關於 50% 和 90% 並發用戶數的含義,請參考下文
http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
Min:最小響應時間
Max:最大響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數
Throughput:吞吐量——默認情況下表示每秒完成的請求數(Request per Second),當使用了 Transaction Controller 時,也可以表示類似 LoadRunner 的 Transaction per Second 數
KB/Sec:每秒從伺服器端接收到的數據量,相當於LoadRunner中的Throughput/Sec
基本知識:
1、吞吐量:是指在沒有幀丟失的情況下,設備能夠接受的最大速率。
2、存儲的最小單位是位元組Byte,對於存儲單位,有以下幾個單位,GB、MB和KB,那麼這三者之間的換算關系是:1GB=1024MB,1MB=1024KB,1KB=1024Bytes。
Bit :「位」,稱為bit,也就是比特,有的時候也稱為位。一個位元組為8位二進製表示。
Byte:「位元組」,一個位元組就是8比特。
3、Mbps (million bits per second 兆位/秒) 代表每秒傳輸1,000,000比特。該縮寫用來描述數據傳輸速度。例如:4Mbps=每秒鍾傳輸4M比特。
數據傳輸速率的單位,字母b(bit)是比特和字母 B (Byte)是位元組。
4、吞吐量與帶寬的區分:吞吐量和帶寬是很容易搞混的一個詞,兩者的單位都是Mbps.先讓我們來看兩者對應的英語,吞吐
量:throughput ; 帶寬: Max net bitrate
。當我們討論通信鏈路的帶寬時,一般是指鏈路上每秒所能傳送的比特數。我們可以說乙太網的帶寬是10Mbps。但是,我們需要區分鏈路上的可用帶寬(帶
寬)與實際鏈路中每秒所能傳送的比特數(吞吐量)。我們傾向於用「吞吐量」一次來表示一個系統的測試性能。這樣,因為實現受各種低效率因素的影響,所以由
一段帶寬為10Mbps的鏈路連接的一對節點可能只達到2Mbps的吞吐量。這樣就意味著,一個主機上的應用能夠以2Mbps的速度向另外的一個主機發送
數據。
5、方差和標准差都是用來描述一組數據的波動性的(集中還是分散),標准差的平方就是方差。方差越大,數據的波動越大。
三.利用BadBoy生成測試計劃(測試腳本)
badBoy可以非常容易的生成web的測試腳本。類似與LoadRunner的使用,輸入站點的URL,點擊Record開始錄制。File –> Export to Jmeter ,導出為Jmeter認識的測試腳本。
四.一個簡單的測試示例思路(目前自己思路,不斷改進)
a. 需要的「測試腳本」,對應web的應用使用badboy生成測試腳本。直接導入Jmeter,進行配置。
b.如圖
TestPlan :是整個Jmeter測試執行的容器。
ThreadGroup :模擬請求,定義線程數、Ramp-Up Period、循環次數。
Step1 :循環控制器 ,控制Sample的執行次數。
Sample取樣器 :決定進行那種類型的測試,如http、ftp等。
監聽器 :圖形結果、聚合報告。
定時器 :Random類型,定義線程請求的延遲。
c.聚合報告的解釋
Label :各個模擬測試的名稱
#Samples :各個測試的樣本總數
Average :每個請求的平均響應時間
Median :中值,即50%請求的平均響應時間
90%Line :90%請求的響應時間
Min :最小響應時間 ,Max :最大的響應時間
Error% :錯誤響應的概率。即無法響應的概率。
ThroughPut :吞吐量 -- 默認情況下表示每秒完成的請求數(Request per Second)。
KB/Sec :每秒從伺服器端接收到的數據量。
五.Jmeter常見問題 (轉載) http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094
說明:這些問答是從網上轉載的,自己修改了其中的一些內容,如果大家興趣,可以將大家在使用Jmeter的時候碰到的問題寫下來,我們一起補充到這個問答裡面,共同努力完善jmeter的資料。
1. JMeter的工作原理是什麼?
向伺服器提交請求;從伺服器取回請求返回的結果。
2. JMeter的作用?
JMeter可以用於測試靜態或者動態資源的性能(文件、Servlets、Perl腳本、java對象、資料庫和查詢、ftp伺服器或者其他的資源)。
JMeter用於模擬在伺服器、網路或者其他對象上附加高負載以測試他們提供服務的受壓能力,或者分析他們提供的服務在不同負載條件下的總性能情況。你可
以用JMeter提供的圖形化界面分析性能指標或者在高負載情況下測試伺服器/腳本/對象的行為。
3. 怎樣能看到jmeter提供的腳本範例?
在\JMeter\jakarta-jmeter-2.0.3\xdocs\demos目錄下。
4. 怎樣設置並發用戶數?
選中可視化界面中左邊樹的Test Plan節點,單擊右鍵,選擇Add-> Thread Group,其中Number of Threads參數用來設置發送請求的用戶數目。
5. JMeter的運行指示?
Jmeter在運行時,右上角有個單選框大小的小框框,運行是該框框為綠色,運行完畢後,該框框為白色。
6. User Parameters的作用是什麼?
提高腳本可用性
7. 在result里會出現彩色字體的http response code,說明什麼呢?
Http response code是http返回值,彩色字體較引人注目,可以使用戶迅速關注。象綠色的302就說明在這一步驟中,返回值取自本機的catch,而不是server。
8. 怎樣計算Ramp-up period時間?
Ramp-up period是指每個請求發生的總時間間隔,單位是秒。如果Number of Threads設置為5,而Ramp-up
period是10,那麼每個請求之間的間隔就是10/5,也就是2秒。Ramp-up period設置為0,就是同時並發請求。
9. Get和Post的區別?
他們是http協議的2種不同實現方式。Get是指server從Request URL取得所需參數。從result中的request中可以看到,get可以看到參數,但是post是主動向server發送參數,所以一般看不到這些參數的。
10. 哪些原因可能導致error的產生?
a. Http錯誤,包括不響應,結果找不到,數據錯誤等等;
b. JMeter本身原因產生的錯誤。
11. 為什麼Aggregate Report結果中的Total值不是真正的總和?
JMeter給結果中total的定義是並不完全指總和,為了方便使用,它的值表現了所在列的代表值,比如min值,它的total就是所在列的最小值。下圖就是total在各列所表示的意思。
12. JMeter的Thread Number是提供多個不同用戶並發的功能么?
不是,Thread Number僅僅是指並發數,如果需要實現多個不同用戶並發,我們應該採用其它方法,比如通過在jmeter外建立csv文件的方法來實現。
13. 同時並發請求時,若需要模擬不同的用戶同時向不同的server並發請求,怎樣實現呢?
方法很靈活,我們可以將不同的server在thread裡面預先寫好。或者預先將固定的變數值寫入csv文件,這樣還可以方便修改。然後將文件添加到User Parameters。
14. User Parameter中的DUMMY是什麼意思?
當其具體內容是${__CSVRead(${__property(user.dir)}${FILENAME},next())}時用來模擬讀文件的下一行。
15. 當測試對象在多server間跳轉時,應該怎樣處理?
程序運行時,有些http和隱函數會攜帶另外的server IP,我們可以從他們的返回值中獲取。
16. 為何測試對象是http和https混雜出現?
Https是加密協議,為了安全,一般不推薦使用http,但是有些地方,使用https過於復雜或者較難實現,會採用http協議。
17. Http和https的默認埠是什麼?
Apache server (Http)的默認埠是80;
SSL (Https)的默認埠是443。
18. 為何在run時,有些頁面失敗,但是最後不影響結果?
原因較多,值得提及的一種是因為主流頁面與它不存在依賴關系,所以即使這樣的頁面出錯,也不會影響運行得到正常結果,但是這樣會影響到測試的結果以及分析結果。
19. 為什麼腳本剛開始運行就有錯誤,其後來的腳本還可運行?
在Thread
Group中有相關設置,如果選擇了continue,即使前面的腳本出現錯誤,整個thread仍會運行直到結束。選擇Stop
Thread會結束當前thread;選擇Stop Test則會結束全部的thread。推薦選項是Stop Thread。
20. 在Regular Expression Extractor會看到Template的值是$1$,這個值是什麼意思呢?
$1$是指取第一個()裡面的值。如果Regular Expression的數值有多個,用這種方法可以避免不必要的麻煩。
21. Regular Expression中的(.*)是什麼意思?
那是一個正則表達式(regular expression)。』.』等同於sql語言中的』?』,表示可有可無。』*』表示0個或多個。』()』表示需要取值。(.*)表達任意長度的字元串。
22. 在讀取Regular Expression時要注意什麼?
一定要保證所取數值的絕對唯一性。
23. 怎樣才能判斷什麼樣的情況需要添加Regular Expression Extractor?
檢查Http Request中的Send Parameters,如果有某個參數是其前一個page中所沒有給出的,就要到原文件中查找,並添加Regular Expression Extractor到其前一page的http request中。
24. 在自動獲取的腳本中有時會出現空的http request,是什麼意思呢?
是因為在獲取腳本時有些錯誤,是腳本工具原因。在run時這種錯誤不參與運行的。
25. 在運行結果中為何有rate為N/A的情況出現?
可能因為JMeter自身問題造成,再次運行可以得到正確結果。
26. 常用http錯誤代碼有哪些?
400無法解析此請求。
403禁止訪問:訪問被拒絕。
404找不到文件或目錄。
405用於訪問該頁的HTTP動作未被許可。
410文件已刪除。
500伺服器內部錯誤。
501標題值指定的配置沒有執行。
502 Web伺服器作為網關或代理伺服器時收到無效的響應。
27. Http request中的Send Parameters是指什麼?
是指code中寫定的值和自定義變數中得到的值,就是在運行頁面時需要的參數。
28. Parameters在頁面中是不斷傳遞的么?
是的。參數再產生後會在頁面中一直傳遞到所需頁面。所以我們可以在動態參數產生時捕獲它,也可以在所需頁面的上一頁面捕獲。(但是這樣可能有錯誤,最好在產生頁面獲取)
29. 在使用JMeter測試時,是完全模擬用戶操作么?造成的結果也和用戶操作完全相同么?
是的。JMeter完全模擬用戶操作,所以操作記錄會全部寫入DB.在運行失敗時,可能會產生錯誤數據,這就取決於腳本檢查是否嚴謹,否則錯誤數據也會進入DB,給程序運行帶來很多麻煩。
六.Jmeter測試心得(轉載) http://www.iteye.com/topic/211216
企業應用開發過程中,性能測試是很重要的一個環節,在這個環節中Apache的JMeter以它開源、100%純Java、操作方便等優點發揮著很大的作用。
經過一段時間的使用,多少有些心得和技巧,拿出來共享,希望能有些幫助。
1、製作測試腳本:
手工製作測試腳本,需要你知道請求的url和攜帶的參數等等,太花費時間,
所以可以用badboy工具錄制腳本。這個工具雖然不是開源的,但是卻可以用來免費的錄製成.jmx的腳本,使用起來很方便。
官方網站是:http://www.badboy.com.au/
2、出現亂碼了?
在用JMeter發行HTTPRequest時,在請求參數中有中文時,發現存儲到DB中後,相應的欄位是亂碼,
明明在參數後面的Encode選項中打了V。後來發現badboy錄制腳本的時候並沒有記錄編碼方式,所以修改腳本,
在Content encoding中設置正確的編碼方式就不會出現亂碼了。
3、JMeter的妙用---准備測試數據:
要求性能測試開始前,先准備5W條數據。當然可以通過直接修改DB,但是如果這5W條數據涉及到很多表的關聯,
甚至還要通過存儲過程的處理怎麼辦,直接修改DB很容易出現錯誤的數據,要是在客戶的機器上弄錯,可就闖禍了。
這時候想到了JMeter,它本來是用來模擬大量用戶並發請求的,現在用它來批量的生成數據吧。
如果要求每條數據都不同,就要修改腳本,使用JMeter的函數來動態產生數據,比較常用的是CSVRead函數,
記不住名的話Ctrl+F可以呼喚出函數助手。使用這個函數的時候需要注意幾點,首先是csv文件的編碼格式,
使用ansi沒有問題,使用unicode時會使讀取的第一行數據出現錯誤;
${__CSVRead(data.txt,0)}---讀取本行的第一列值
${__CSVRead(data.txt,1)}${__CSVRead(data.txt,next)}---讀取本行的第二列值,並把行標移動到下一行
試驗證明JMeter應該做好了同步,在多線程環境下上面的調用方法沒有問題;
最後,修改JMeter的線程數會加快數據生成的速度,原理是當並發線程在20左右的時候會達到最大的吞吐量(request/分),
所以應該設定線程數20左右。
4、JMeter中debug方法:
JMeter提供了log函數輸出log,但是有時候並不好用,比如我想輸出某個函數的返回值看是不是正確的,
${__log(${__CSVRead(data.txt,1)})}這樣的寫法是錯誤的,JMeter會拋出異常,該怎麼辦呢?
答案是巧用監聽器(Listener)來輸出想看到的數據,結果顯示為樹的那個監聽器,
它可以讓你查看每個sampler的請求數據和響應數據,在請求數據中就有你想看到的信息。
5、常用的功能:
・使用HTTP Cookie Manager或URL重寫實現同一線程內的多個請求共享Session。
・把Login的請求放到只執行一次的控制器中,那麼即使循環多次,Login也只請求一次。
・如果想讓多個線程在同一時刻同時請求,那麼用Synchronizing Timer來做集合點。
・為了節省系統資源,使用非窗口模式運行JMeter(jmeter -n -t test.jmx)
・如果模擬並發用戶過多,比如200線程,那麼可以分散到多台機器上運行Jmeter(比如4台電腦,每台50線程)
更多功能請參照使用手冊
中文手冊(未完成)http://wiki.javascud.org/pages/viewpage.action?pageId=5566
6、在winnt系統上,使用perfmon來幫助Jmeter採集伺服器的系統資源數據,可以配置log輸出這些數據作為性能瓶頸分析時使用。
七.置信區間 http://java.chinaitlab.com/tools/355421.html
對數據進行更科學的分析,確定測試結果。類似於Jmeter聚合報告的90% Line給出的參考,而不能僅僅參考均值。
『伍』 用python寫測試腳本,從本地傳文件至ftp遠程路徑
轉自:http://news.tuxi.com.cn/kf/article/jhtdj.htm
本文實例講述了python實現支持目錄FTP上傳下載文件的方法。分享給大家供大家參考。具體如下:
該程序支持ftp上傳下載文件和目錄、適用於windows和linux平台。
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importftplib
importos
importsys
classFTPSync(object):
conn=ftplib.FTP()
def__init__(self,host,port=21):
self.conn.connect(host,port)
deflogin(self,username,password):
self.conn.login(username,password)
self.conn.set_pasv(False)
printself.conn.welcome
deftest(self,ftp_path):
printftp_path
printself._is_ftp_dir(ftp_path)
#printself.conn.nlst(ftp_path)
#self.conn.retrlines('LIST./a/b')
#ftp_parent_path=os.path.dirname(ftp_path)
#ftp_dir_name=os.path.basename(ftp_path)
#printftp_parent_path
#printftp_dir_name
def_is_ftp_file(self,ftp_path):
try:
ifftp_pathinself.conn.nlst(os.path.dirname(ftp_path)):
returnTrue
else:
returnFalse
exceptftplib.error_perm,e:
returnFalse
def_ftp_list(self,line):
list=line.split('')
ifself.ftp_dir_name==list[-1]andlist[0].startswith('d'):
self._is_dir=True
def_is_ftp_dir(self,ftp_path):
ftp_path=ftp_path.rstrip('/')
ftp_parent_path=os.path.dirname(ftp_path)
self.ftp_dir_name=os.path.basename(ftp_path)
self._is_dir=False
ifftp_path=='.'orftp_path=='./'orftp_path=='':
self._is_dir=True
else:
#thisuescallbackfunction,thatwillchange_is_dirvalue
try:
self.conn.retrlines('LIST%s'%ftp_parent_path,self._ftp_list)
exceptftplib.error_perm,e:
returnself._is_dir
returnself._is_dir
defget_file(self,ftp_path,local_path='.'):
ftp_path=ftp_path.rstrip('/')
ifself._is_ftp_file(ftp_path):
file_name=os.path.basename(ftp_path)
#如果本地路徑是目錄,下載文件到該目錄
ifos.path.isdir(local_path):
file_handler=open(os.path.join(local_path,file_name),'wb')
self.conn.retrbinary("RETR%s"%(ftp_path),file_handler.write)
file_handler.close()
#如果本地路徑不是目錄,但上層目錄存在,則按照本地路徑的文件名作為下載的文件名稱
elifos.path.isdir(os.path.dirname(local_path)):
file_handler=open(local_path,'wb')
self.conn.retrbinary("RETR%s"%(ftp_path),file_handler.write)
file_handler.close()
#如果本地路徑不是目錄,且上層目錄不存在,則退出
else:
print'EROOR:Thedir:%sisnotexist'%os.path.dirname(local_path)
else:
print'EROOR:Theftpfile:%sisnotexist'%ftp_path
defput_file(self,local_path,ftp_path='.'):
ftp_path=ftp_path.rstrip('/')
ifos.path.isfile(local_path):
file_handler=open(local_path,"r")
local_file_name=os.path.basename(local_path)
#如果遠程路徑是個目錄,則上傳文件到這個目錄,文件名不變
ifself._is_ftp_dir(ftp_path):
self.conn.storbinary('STOR%s'%os.path.join(ftp_path,local_file_name),file_handler)
#如果遠程路徑的上層是個目錄,則上傳文件,文件名按照給定命名
elifself._is_ftp_dir(os.path.dirname(ftp_path)):
print'STOR%s'%ftp_path
self.conn.storbinary('STOR%s'%ftp_path,file_handler)
#如果遠程路徑不是目錄,且上一層的目錄也不存在,則提示給定遠程路徑錯誤
else:
print'EROOR:Theftppath:%siserror'%ftp_path
file_handler.close()
else:
print'ERROR:Thefile:%sisnotexist'%local_path
defget_dir(self,ftp_path,local_path='.',begin=True):
ftp_path=ftp_path.rstrip('/')
#當ftp目錄存在時下載
ifself._is_ftp_dir(ftp_path):
#如果下載到本地當前目錄下,並創建目錄
#下載初始化:如果給定的本地路徑不存在需要創建,同時將ftp的目錄存放在給定的本地目錄下。
#ftp目錄下文件存放的路徑為local_path=local_path+os.path.basename(ftp_path)
#例如:將ftp文件夾a下載到本地的a/b目錄下,則ftp的a目錄下的文件將下載到本地的a/b/a目錄下
ifbegin:
ifnotos.path.isdir(local_path):
os.makedirs(local_path)
local_path=os.path.join(local_path,os.path.basename(ftp_path))
#如果本地目錄不存在,則創建目錄
ifnotos.path.isdir(local_path):
os.makedirs(local_path)
#進入ftp目錄,開始遞歸查詢
self.conn.cwd(ftp_path)
ftp_files=self.conn.nlst()
forfileinftp_files:
local_file=os.path.join(local_path,file)
#如果fileftp路徑是目錄則遞歸上傳目錄(不需要再進行初始化begin的標志修改為False)
#如果fileftp路徑是文件則直接上傳文件
ifself._is_ftp_dir(file):
self.get_dir(file,local_file,False)
else:
self.get_file(file,local_file)
#如果當前ftp目錄文件已經遍歷完畢返回上一層目錄
self.conn.cwd("..")
return
else:
print'ERROR:Thedir:%sisnotexist'%ftp_path
return
defput_dir(self,local_path,ftp_path='.',begin=True):
ftp_path=ftp_path.rstrip('/')
#當本地目錄存在時上傳
ifos.path.isdir(local_path):
#上傳初始化:如果給定的ftp路徑不存在需要創建,同時將本地的目錄存放在給定的ftp目錄下。
#本地目錄下文件存放的路徑為ftp_path=ftp_path+os.path.basename(local_path)
#例如:將本地文件夾a上傳到ftp的a/b目錄下,則本地a目錄下的文件將上傳的ftp的a/b/a目錄下
ifbegin:
ifnotself._is_ftp_dir(ftp_path):
self.conn.mkd(ftp_path)
ftp_path=os.path.join(ftp_path,os.path.basename(local_path))
#如果ftp路徑不是目錄,則創建目錄
ifnotself._is_ftp_dir(ftp_path):
self.conn.mkd(ftp_path)
#進入本地目錄,開始遞歸查詢
os.chdir(local_path)
local_files=os.listdir('.')
forfileinlocal_files:
#如果file本地路徑是目錄則遞歸上傳目錄(不需要再進行初始化begin的標志修改為False)
#如果file本地路徑是文件則直接上傳文件
ifos.path.isdir(file):
ftp_path=os.path.join(ftp_path,file)
self.put_dir(file,ftp_path,False)
else:
self.put_file(file,ftp_path)
#如果當前本地目錄文件已經遍歷完畢返回上一層目錄
os.chdir("..")
else:
print'ERROR:Thedir:%sisnotexist'%local_path
return
if__name__=='__main__':
ftp=FTPSync('192.168.1.110')
ftp.login('test','test')
#上傳文件,不重命名
#ftp.put_file('111.txt','a/b')
#上傳文件,重命名
#ftp.put_file('111.txt','a/112.txt')
#下載文件,不重命名
#ftp.get_file('/a/111.txt',r'D:\')
#下載文件,重命名
#ftp.get_file('/a/111.txt',r'D:112.txt')
#下載到已經存在的文件夾
#ftp.get_dir('a/b/c',r'D:\a')
#下載到不存在的文件夾
#ftp.get_dir('a/b/c',r'D:\aa')
#上傳到已經存在的文件夾
ftp.put_dir('b','a')
#上傳到不存在的文件夾
ftp.put_dir('b','aa/B/')
希望本文所述對大家的Python程序設計有所幫助。
以下轉自:http://blog.csdn.net/linda1000/article/details/8255771
Python中的ftplib模塊
Python中默認安裝的ftplib模塊定義了FTP類,其中函數有限,可用來實現簡單的ftp客戶端,用於上傳或下載文件
FTP的工作流程及基本操作可參考協議RFC959
ftp登陸連接
from ftplib import FTP #載入ftp模塊
ftp=FTP() #設置變數
ftp.set_debuglevel(2) #打開調試級別2,顯示詳細信息
ftp.connect("IP","port") #連接的ftp sever和埠
ftp.login("user","password")#連接的用戶名,密碼
print ftp.getwelcome() #列印出歡迎信息
ftp.cmd("xxx/xxx") #更改遠程目錄
bufsize=1024 #設置的緩沖區大小
filename="filename.txt" #需要下載的文件
file_handle=open(filename,"wb").write #以寫模式在本地打開文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收伺服器上文件並寫入本地文件
ftp.set_debuglevel(0) #關閉調試模式
ftp.quit #退出ftp
ftp相關命令操作
ftp.cwd(pathname) #設置FTP當前操作的路徑
ftp.dir() #顯示目錄下文件信息
ftp.nlst() #獲取目錄下的文件
ftp.mkd(pathname) #新建遠程目錄
ftp.pwd() #返回當前所在位置
ftp.rmd(dirname) #刪除遠程目錄
ftp.delete(filename) #刪除遠程文件
ftp.rename(fromname, toname)#將fromname修改名稱為toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上傳目標文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)#下載FTP文件
網上找到一個具體的例子:
#例:FTP編程
fromftplibimportFTP
ftp=FTP()
timeout=30
port=21
ftp.connect('192.168.1.188',port,timeout)#連接FTP伺服器
ftp.login('UserName','888888')#登錄
printftp.getwelcome()#獲得歡迎信息
ftp.cwd('file/test')#設置FTP路徑
list=ftp.nlst()#獲得目錄列表
fornameinlist:
print(name)#列印文件名字
path='d:/data/'+name#文件保存路徑
f=open(path,'wb')#打開要保存文件
filename='RETR'+name#保存FTP文件
ftp.retrbinary(filename,f.write)#保存FTP上的文件
ftp.delete(name)#刪除FTP文件
ftp.storbinary('STOR'+filename,open(path,'rb'))#上傳FTP文件
ftp.quit()#退出FTP伺服器
完整的模板:
#!/usr/bin/python
#-*-coding:utf-8-*-
importftplib
importos
importsocket
HOST='ftp.mozilla.org'
DIRN='pub/mozilla.org/webtools'
FILE='bugzilla-3.6.7.tar.gz'
defmain():
try:
f=ftplib.FTP(HOST)
except(socket.error,socket.gaierror):
print'ERROR:cannotreach"%s"'%HOST
return
print'***Connectedtohost"%s"'%HOST
try:
f.login()
exceptftplib.error_perm:
print'ERROR:cannotloginanonymously'
f.quit()
return
print'***Loggedinas"anonymously"'
try:
f.cwd(DIRN)
exceptftplib.error_perm:
print'ERRORLcannotCDto"%s"'%DIRN
f.quit()
return
print'***Changedto"%s"folder'%DIRN
try:
#傳一個回調函數給retrbinary()它在每接收一個二進制數據時都會被調用
f.retrbinary('RETR%s'%FILE,open(FILE,'wb').write)
exceptftplib.error_perm:
print'ERROR:cannotreadfile"%s"'%FILE
os.unlink(FILE)
else:
print'***Downloaded"%s"toCWD'%FILE
f.quit()
return
if__name__=='__main__':
main()