
Jmeter是一款性能測驗工具,因輕量級、開源、社區接受度高、容易入門等優點,也被測驗人員廣泛用于做介面測驗,在使用Jmeter做較大規模、復雜場景的介面測驗時,往往會遇到一些困難,閱讀本文你將了解:
- 在作業時間緊張情況下,如何做好自動化測驗?
- 如何設計一套完整的、結構優化的jmeter介面自動化測驗方案?
- 如何設計復雜的Jmeter介面測驗用例?
- 如何提升撰寫Jmeter自動化腳本的能力?
專案背景
被測系統是泰康云TDS平臺,該平臺整合敏捷開發與DevOps研發管理工具,提供產品規劃、專案管理、代碼托管、代碼檢查、持續集成和持續發布、制品管理等能力,簡化研發協作程序,幫助研發團隊完成軟體生命周期管理,本篇內容以TDS平臺測驗為背景,介紹測驗人員如何設計介面自動化測驗,
遇到的問題
本文從我們作業中常遇到的問題入手,展開問題,詳細解答,
問題一:被測專案迭代頻繁,測驗用例設計、維護、執行已經占用了測驗工程師大部分作業時間,沒有時間搞自動化怎么辦?
問題二:為什么選jmeter做介面自動化測驗?
問題三:多人協同測驗情況下,自動化腳本結構如何設計?
問題四:單介面測驗用例設計、執行、斷言比較簡單,但是涉及多介面、異步等復雜場景該如何設計用例?
問題五:介面測驗用例如何斷言?只斷言被測介面回傳值就可以了嗎?
問題六:Jmeter與流水線集成,除了jmeter+ant+jenkins,還有更優的方案嗎?
問題七:如何度量介面自動化結果?介面用例成功率達到100%就夠了嗎?
問題八:測驗腳本執行程序中遇到的穩定性、執行效率等問題如何解決?
實踐分享
問題一:沒有時間搞自動化測驗?
下面將從敏捷專案迭代特點和自動化測驗時間規劃這兩個方面,介紹我們是如何確認自動化測驗目標、安排自動化測驗時間的,
1>分析敏捷專案迭代特點,確認自動化測驗目標
下圖展示了在敏捷開發模式中,隨著專案迭代進行,新功能特性與已有功能特性的數量變化,每個迭代新特性的測驗作業量變化不大,但是已有特性的回歸測驗任務量卻是累計增加的,

因此我們自動化介面測驗的目標是針對已有特性做自動化回歸測驗,提升回歸測驗效率,而對當前迭代的新特性以手工測驗為主,自動化測驗為輔,
-
針對當前迭代新特性,手工測驗為主,自動化測驗為輔,原因分析:
當前迭代中的新功能是逐漸成長起來的,功能可能不穩定,需要修改優化,對新功能立即開發自動化測驗腳本投入成本大;
當前迭代中的新功能,借助溝通,通過手動形式直接驗證更有效;
每天發好幾個版本,增加什么就測驗什么,手工測驗靈活性高,
-
針對上一個迭代已有特性,采用自動化回歸測驗,原因分析:
上一個迭代已有功能相對穩定,自動化腳本開發和除錯都沒有障礙,腳本開發效率更高;
自動化測驗發現缺陷的能力比手動測驗弱,用于回歸測驗更符合自動化測驗的特點,
2>為自動化測驗騰出時間
方法:
- 在迭代初期,通過思維導圖梳理測驗點,而不一定要寫詳盡的測驗用例,從而節省時間撰寫上一個迭代特性的自動化測驗腳本和腳本維護;
- 在迭代測驗程序中,利用探索式測驗風格,持續開展測驗學習、設計、執行、結果分析,提高測驗效率,積累測驗經驗,節省測驗時間,
問題二:為什么要用Jmeter做自動化介面測驗?
用Jmeter做介面測驗工具有以下優勢:
- 支持測驗腳本錄制,badboy、blazemeter等;
- 支持多平臺部署,易于與流水線集成;
- 開源免費,提供豐富組件及第三方插件庫;
- 支持多執行緒組并行,提高介面測驗效率;
- 一學多用,介面測驗->性能測驗,
問題三:多人協同測驗,自動化腳本結構如何設計?
Jmeter元件組合是非常靈活的,為了提升用例維護效率、方便多人協作,我們參考相關資料及專案實踐經驗,總結了如下圖腳本結構:

以下為主要腳本結構及對應Jmeter元件說明:
測驗計劃:專案根節點
jmeter相關元件說明:
TestPlan:控制測驗用例執行方式:并行/串行
全域引數配置:
jmeter相關元件說明:
User Defined Variables:存放測驗環境(dev/test)配置資訊
JDBC Connection Configuration:存放資料庫連接配置
HTTP Request Defaults:配置http介面默認引數,全域生效,eg:請求timeout=10000ms
當前腳本通用模塊庫:存放所有測驗相關采樣器,由用例模塊通過模塊控制器呼叫
包含健康檢查相關、webShell相關、資料準備模塊、變數初始化模塊、資料斷言模塊、登錄模塊、團隊管理模塊、流水線模塊、制品管理模塊等業務模塊
jmeter相關元件:
Transaction Controller
HTTP Request Sampler
JDBC Request Sampler
WebSocket request-response Sampler
WebSocket Open Connection Sampler
Response Assertion
JSON Assertion
BeanShell Assertion
歷史組件/模塊設計參考
介面測驗模板
用例模塊:存放介面測驗用例,通過模塊控制器呼叫當前腳本通用模塊庫
包含:專案管理、部署組管理、svn管理、團隊管理、流水線管理、代碼庫管理、制品管理等相關測驗用例集合
jmeter相關元件
Test Fragment:作為用例分割符
Thread Group:用例組,存放一組相關測驗用例
Transaction Controller:事務控制器
Module Controller:呼叫當前腳本通用模塊庫
User Defined Variables:存放用例相關測驗資料
BeanShell Sampler:實作用例編號自增,引數傳遞等
測驗結果展示
View Results Tree
Summary Report
問題四:復雜場景如何設計用例?
復雜場景用例設計之前,先分享下從功能角度出發,我們是如何設計用例的,如下圖所示:

除此之外,結合專案實際情況,還需要考慮其他非功能場景:
- 例外測驗,eg:冪等(重復提交、超時重試)、介面事務、分布式場景、環境例外、大資料量等;
- 性能測驗,eg:回應時間、吞吐量、資源利用率等;
- 安全測驗,eg:敏感資訊是否加密、介面權限控制、sql注入等,
下面以實際專案中的兩個場景為例,來分享我們是如何應對復雜測驗場景的,
1、多介面實體:流水線執行場景測驗,涉及6個介面
方法:
步驟1、分析相關介面呼叫順序、階段,
前置準備
新建專案介面、專案關聯代碼庫介面、新建部署組介面
用例執行
新建流水線介面、流水線執行介面
后置處理
專案洗掉介面
步驟2、測驗資料梳理:
需要在運行前初始化的資料,包含:
環境配置資訊,eg:ip、埠、資料庫配置等
測驗場景共享資料,eg:代碼庫資訊
單介面測驗資料
運行時動態生成的資料,包含:
某個介面的回傳資料,其他介面需要使用,eg:專案id、部署組id、流水線id等
需要呼叫相關函式或工具動態生成的資料,eg:uuid、時間戳等
步驟3、梳理測驗用例,撰寫相關腳本,腳本圖示如下:

2、異步實體:流水線配置定時任務后,驗證定時任務是否按照配置時間成功觸發
難點分析:流水線配置定時任務不會立即執行,定時任務觸發需要等待websocket推送訊息
方法:
步驟1:新建流水線配置定時任務執行時間為當前時間+1min
使用beanshell采樣器實作
Calendar calendar = Calendar.getInstance();//獲取當前時間
calendar.set(Calendar.MINUTE,calendar.get(Calendar.MINUTE)+1);
步驟2:通過WebSocket request-response Sampler監聽定時任務推送的訊息,完成斷言,腳本圖示如下:

問題五:介面測驗用例如何斷言?
對于介面的正確性驗證,只驗證被測介面回傳body很明顯是不夠的,這里總結了如下斷言方法:
-
基礎斷言:
回應斷言
正則匹配
回應碼匹配
jackson + beanshell斷言
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
//獲取介面回傳body--實際結果
String json_response = prev.getResponseDataAsString();
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(json_response);
JsonNode dataNode = rootNode.path("data");
JsonNode totalNode = dataNode.path("total");
String actual = totalNode.toString();
//介面回傳的總條數--期望結果
String except = vars.getObject("program_source_data").size().toString();
if(actual.toString().equals(except)){
Failure = false;
}else{
Failure = true;
FailureMessage = "期待數量:"+except+" VS 實際數量:"+actual+"不一致";
}
- 相關介面輔助驗證:

- 資料庫匹配,JDBC Request + BeanShell斷言,示例如下:
// JDBC Request 采樣器 獲取回傳結果 -> triggers_count
SELECT
count(*)
FROM
qrtz_triggers a
WHERE
a.JOB_NAME LIKE '%${search_key}%' ORDER BY JOB_NAME desc;
// BeanShell斷言
String except = vars.get("except_count");//期望結果
String actual = vars.get("triggers_count_1");//資料庫查詢到的總條數
if(actual.equals(except)){
Failure = false;
}else{
Failure = true;
FailureMessage = "期待數量:"+except+" VS 實際數量:"+actual+"不一致";
}
問題六:jmeter+ant+jenkins如何改進?
jmeter+ant+jenkins是一種常用的流水線集成方法,但在集成程序中存在環境配置繁瑣的問題,比如:
-
需要安裝jdk、ant、jmeter環境,版本變更還需要重新卸載安裝
-
jmeter依賴第三方jar包,每次都需要手動打包上傳服務器
-
jmeter組態檔變更,需要去服務器手動修改
-
jenkins中不同流水線依賴jmeter版本不一致時,需要手工安裝多個jmeter版本
針對以上問題,我們采用的替代方案是 jmeter-maven-plugin + mvnw ,運行環境只需要安裝jdk就可以了,將maven、jmeter版本以及第三方jar包管理,都托管到gitlab一個代碼庫中進行集中管理,
進行介面測驗只需要git clone代碼,然后執行 mvnw clean verify就可以觸發測驗執行,代碼庫配置如下圖:

工具依賴

問題七:如何度量介面自動化結果?
1、jmeter原生報告優化
jmeter CLI運行方式產生的測驗報告統計資訊偏向性能指標,無法滿足jmeter介面測驗需求,因此使用dom4j決議jmeter生成的xml結果檔案,使用ExtentReports5生成html報告,報告示例如下:


2、使用jacoco統計介面測驗代碼級覆寫率報告
介面測驗用例成功率即使達到100%,仍然會存在漏測,因此使用jacoco來統計代碼覆寫率,分析介面測驗未覆寫的代碼,進行測驗用例補充完善,
關鍵步驟說明:
步驟1:被測服務打樁
java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=9002,address= * -jar 被測服務.jar
步驟2:呼叫jmeter腳本執行測驗
./mvnw clean verify --settings=settings.xml
步驟3:dump覆寫率報告
java -jar jacococli.jar dump --address 被測服務IP --port 9002 --destfile ./jacoco1.exec
步驟4:生成覆寫率報告
java -jar jacococli.jar report ./jacoco1.exec --classfiles BOOT-INF/classes --sourcefiles /src/main/java --encoding utf-8 --html jacoReport
報告展示如下圖 :


問題八:如何提升用例執行穩定性和效率?
當測驗case數量持續增加時,需要考慮執行穩定性和效率,
總結如下:
預置資料代替創建程序
由于操作越多穩定性越低,使用預置資料而非實時生成的資料,速度更快,穩定性更高,
隔離
使用不同賬號等進行隔離,通過隔離,用例執行失敗的臟資料就不會影響其他用例;
自動化腳本測驗資料與功能測驗資料隔離,
jmeter配置優化
設定全域采樣器超時等待,eg:timeout=12000ms , 超時自動失敗;
針對性能較差的介面配置jmeter定時器 , 防止被測服務壓力過大;
設定JMeterProcessJVMSettings,增大記憶體,
防御式編程
撰寫測驗代碼時 , 不能假設資料已存在或者沒有臟資料殘留,所以預先的判斷和清理很重要,比如檢查到資料缺失就實時修復、用例運行之前考慮清除臨時資料,
不足之處,歡迎指正,

最后: 可以在公眾號:傷心的辣條 ! 免費領取一份216頁軟體測驗工程師面試寶典檔案資料,以及相對應的視頻學習教程免費分享!,其中包括了有基礎知識、Linux必備、Shell、互聯網程式原理、Mysql資料庫、抓包工具專題、介面測驗工具、測驗進階-Python編程、Web自動化測驗、APP自動化測驗、介面自動化測驗、測驗高級持續集成、測驗架構開發測驗框架、性能測驗、安全測驗等,
如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏” 一鍵三連哦!喜歡軟體測驗的小伙伴們,可以加入我們的測驗技術交流扣扣群:914172719(里面有各種軟體測驗資源和技術討論)
好文推薦
轉行面試,跳槽面試,軟體測驗人員都必須知道的這幾種面試技巧!
面試經:一線城市搬磚!又面軟體測驗崗,5000就知足了…
面試官:作業三年,還來面初級測驗?恐怕你的軟體測驗工程師的頭銜要加雙引號…
什么樣的人適合從事軟體測驗作業?
那個準點下班的人,比我先升職了…
測驗崗反復跳槽,跳著跳著就跳沒了…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302731.html
標籤:其他
