工具應用:使用JMeter實現Agileone的介面測試

工具應用:使用JMeter實現Agileone的介面測試

來自專欄強哥學堂

實驗簡介

Apache JMeter是一款100%純Java應用程序,設計用於介面測試和性能測試。它最初是為測試Web應用程序而設計的,但是經過各類插件的擴展,目前針對常見的各類協議介面都有良好的支持。JMeter簡化了協議級介面的發送和對響應的斷言,同時對多線程的支持及各類並發場景的設計,和統計數據的處理都變得非常簡單。本實驗將為大家詳細講解如何利用JMeter完成基於HTTP協議的介面測試。

實驗目的

(1) 熟練運用JMeter的常見組件的功能及用法。

(2) 熟練使用JMeter完成基於協議的介面測試。

實驗流程

  1. JMeter的功能介紹

目前JMeter的最新版本是3.2,我們可以直接在其官方網站「jmeter.apache.org/」下載最新版本,並在一台安裝了Java的環境中直接運行其「bin」目錄下的「ApacheJMeter.jar」文件即可。啟動後主界面如下圖所示:

目前JMeter能夠支持和測試許多不同的應用程序/伺服器/協議類型:

(1) Web的HTTP,HTTPS協議。

(2) SOAP / REST Webservices。

(3) FTP 文件傳輸協議。

(4) 基於JDBC協議的資料庫測試,當然,也可以用該方法生成大量數據。

(5) LDAP協議。

(6) JMS協議。

(7) 郵件傳輸協議:SMTP, POP3和IMAP。

(8) 本地命令或Shell 腳本。

(9) TCP/UDP。

(10) 直接通過其內置的BeanShell腳本語言調用Java程序,也可以被Java程序調用。

除此之外,JMeter還具備如下一些功能:

(1)基於Java開發的全功能測試IDE,支持直接錄製協議請求。

(2)基於Java開發,支持Linux、Windows、MAC OS等各類平台。

(3)可以生成完整的動態HTML報告。

(4)可以從各類響應格式、HTML、JSON、XML或任何文本格式提取數據並進行斷言。

(5)多線程框架允許多線程並發採樣,同時通過不同的線程組進行不同功能的同時採樣。

(6)支持遠程多機協同測試。

(7)支持直接通過命令行運行測試計劃,為持續集成提供了快速運行入口。

(8)支持利用Java和BeanShell進行編程處理,提升測試腳本的靈活性和可擴展性。

(9)通過JMeter的插件管理器,可以擴展更多的應用。

(10)支持多語言,包括英文,簡體和繁體等。

2. 常用組件介紹

(1) 測試計劃(Test Plan):用來描述一個性能測試,包含與本次性能測試所有相關的功能。也就說JMeter創建的所有內容是於基於一個測試計劃的。

(2) 線程組(Thread Group):線程組可以看做是一個虛擬用戶組,線程組中的每個線程都可以理解為一個虛擬用戶。如果進行介面測試,我們可以設置線程數量為1即可。

(3) 配置元件(Config Element):用於提供對靜態數據配置的支持。針對HTTP協議,通常我們需要為某個線程組創建HTTP Cookie管理器。

(4) 定時器(Timer):用於為請求之間設置等待時間,等待時間是性能測試中常用的控制客戶端請求發送速度的重要手段,也便於模擬真實的使用場景。

(5) 前置處理器(Per Processors):用於在實際的請求發出之前對即將發出的請求進行特殊處理。

(6) 取樣器(Sampler):用於處理協議交互的核心組件,所有跟協議交互的參數均在此設置。

(7) 後置處理器(Post Processors):用於對發出請求後得到的伺服器響應進行處理。

(8) 斷言(Assertions):用於檢查測試中得到的相應數據等是否符合預期。

(9) 監聽器(Listener):用來對測試結果數據進行處理和可視化展示的一系列元件。 圖行結果、查看結果樹、聚合報告等都是我們經常用到的元件。

(10) 邏輯控制器(Logic Controller):包括兩類無件,一類是用於控制測試計劃中各Sampler節點發送請求的邏輯順序的控制器,常用的有「如果(If)控制器 、Switch Controller 、Runtime Controller、循環控制器」等。另一類是用來組織可控制Sampler節點的,如「事務控制器、吞吐量控制器」。

3. 測試Agileone的登錄介面

(1) 在「測試計劃」中創建一個新的「線程組」(位於Threads(Users)的子菜單中),保持默認設置即可。

(2) 為該線程組添加一個「HTTP請求」的Sampler。並將該請求命名為「登錄介面」。

(3) 為該HTTP請求設置請求地址,Post請求正文,關鍵參數等,如下圖所示:

(4) 保存當前測試計划到任意目錄。然後我們就可以直接點擊工具欄中的綠色三角形 「啟動」按鈕將上述構建出的HTTP的Post請求發送給伺服器。

(5) 為該請求添加「斷言」,否則我們無法知道,該登錄介面是否正確實現。在「登錄介面」上點擊右鍵創建一個「響應斷言」,並設置其斷言方式為檢查響應文本中是否包含「successful」。

(6) 單純只有上述的斷言,我們仍然無法在JMeter當中查看結果,所以我們還需要為「登錄介面」創建一個叫做「察看結果樹」的「監聽器」。保持默認設置即可。這樣,當我們運行完一次介面測試後,直接可以在「察看結果樹」中看到本次測試的執行結果。至此,一個基於HTTP協議的介面測試便完成了。

4. 測試Agileone的需求提案

(1) 以上述同樣的方式,在線程組中添加一個新的HTTP請求,並命名為「新增需求提案」,同時本次我們直接使用「key=value」的方式來設置POST請求的正文內容,設置如下:

請大家注意一點的地方是,上述截圖中請求的正文內容第一行是空行,這純粹是為了顯示效果。大家在使用時請勿在「Body Data」的前面加一個空行,這樣請求會發送失敗。

(2) 並為該取樣器添加「響應斷言」和「察看結果樹」。由於新增一條需求提案對應的響應是該條新增的記錄的ID號,是變化的,所以我們的「響應斷言」必須使用正則表達式,設置如下:

(3) 發送該請求,我們會在「察看結果樹」中看到,並沒有成功新增需求,響應內容為「no_permission」,這個錯誤我們在學習Java的介面測試部分遇到過,原因是因登錄和新增兩個請求並沒有進行狀態的維護,導致伺服器並不認為當前用戶已經處理登錄狀態。我們需要使用「HTTP Cookie管理器」來維護與伺服器之間的狀態。

(4) 在當前「線程組」上新建一個「HTTP Cookie管理器」,保持所有的默認設置,不需要做任何多餘的操作。重新運行當前線程組的兩個請求,此時我們通過「察看結果樹」可以看到,一條需求提案新增成功。

5. 為請求正文設置隨機數。

由於Agileone的需求提案模塊在新增時,不允許標題和內容重複,所以我們必須為POST請求正文中的標題和內容設置隨機數來保證每次成功執行。這裡我們可以使用JMeter自帶的「函數助手」來生成一個指定範圍的隨機婁。

(1) 為取樣器「新增需求提案」新增一個「前置處理器」,類型為「用戶參數」。為該用戶參數取名為「sequence」,其值我們使用函數助手來生成。

(2) 在菜單「選項」中打開「函數助手對話框」,從下拉列表中選擇「__random」,並為其設置最小值和最大值範圍,設置完成後點擊「生成」按鈕,將生成該隨機數生成器的調用方式。

(3) 將該隨機數生成器代碼複製到「sequence」參數中對應的值中,並且勾選「每次迭代更新一次」。

(4) 在「新增需求提案」的「Body Data」請求正文中,將標題和內容對應的序號用「${sequence}」來取該隨機數的值,然後每一次發送請求,該值都會更新為一個不一樣的隨機數。

6. 使用循環控制器執行測試

循環控制器可以指定讓某一個取樣器循環運行N次。比如上述的「新增需求提案」取樣器,由於我們已經設置了使用隨機數作為標題和內容的標記,所以我們可以運行多次而不用擔心重複,這種情況循環控制器當然也可以正常使用。

(1) 為線程組添加一個「邏輯控制器」下面的「循環控制器」。

(2) 為該「循環控制器」設置循環次數,此處我們設置為10次。

(3) 將「新增需求提案」取樣器拖動到該循環控制器下,這樣就表示循環運行10次取樣器。

(4) 最後,我們進入Agileone的需求提案模塊中查詢運行結果,的確新增了10條。

思考練習

(1) 將前面用Java開發的協議級介面測試代碼移植到JMeter上來。

(2) 自學了解BeanShell腳本語言的語法規則,並完成腳本優化。

(3) 自學使用JDBC取樣器操作資料庫。

(4) 自學使用JMeter的函數助手完成CSV文件讀取並進行數據驅動測試。

:希望學習更多技術,繼續在IT行業突破提升自己的各位朋友,歡迎加群594154674,不管你自我感覺牛不牛B。

推薦閱讀:

功能測試用例設計時的分層依據
在得到之前先評估一下自己會失去什麼吧
工具應用:Robot Framework->實現數據驅動測試
關於黑盒測試的一些總結(適合新手入門使用)

TAG:jmeter | 軟體測試 | 自動化測試 |