如何用jmeter做接口測試(怎樣用jmeter做接口測試)
目錄

1?????? 前言... 3
2?????? 什么是Jmeter?... 4
3?????? 安裝Jmeter 5
3.1??????? 下載安裝包... 5
3.2??????? 安裝軟件... 6
3.3??????? 啟動JMeter 6
4?????? 使用指南... 7
4.1??????? 主界面... 7
4.2??????? 工具欄... 7
4.3??????? 工程窗口... 9
4.3.1???????? 創(chuàng)建新工程... 9
4.3.2???????? Thread Group(線程組)... 9
4.3.3???????? Test Fragment(測試片段)... 11
4.3.4???????? Listerner(-)... 11
4.3.5???????? Config Element(配置元件)... 13
4.3.6???????? Sampler(取樣器)... 14
4.3.7???????? Logic Controller(邏輯控制器)... 15
4.3.8???????? Pre/Post Processor(前置/后置處理器)... 17
4.3.9???????? Timer(定時器)... 17
5?????? API接口示例詳解... 18
5.1??????? 總覽... 18
5.1.1???????? 設(shè)置-... 18
5.1.2???????? 設(shè)置變量... 18
5.1.3???????? 設(shè)置線程組... 19
5.1.4???????? 設(shè)置Test ?Fragment 21
5.2??????? 單個用例執(zhí)行... 23
5.3??????? 用例連跑... 25
6?????? 改進(jìn)... 27
1????? 前言
你是不是剛剛脫離手工測試的苦海,又走進(jìn)寫go語言自動化用例的另一片苦海?是否對代碼中高度重復(fù)性的工作感到心累?如果是,那么,你的福利來了~~~
本文應(yīng)用JMeter的背景是:PaaS 1.2開放K8S原生API,針對開放的90+原生接口,開始遍歷各種場景寫自動化用例,首先自動化用例不能嵌套太深,其次,在低耦合的情況下,代碼冗余很嚴(yán)重(我們做的可是接口參數(shù)校驗(yàn)啊),每一個測試點(diǎn)的差異都是一個冗長的測試用例。后來在夏老師的指導(dǎo)下,開始使用JMeter對接口進(jìn)行定義,調(diào)試方便,結(jié)果直觀,運(yùn)行只在秒級,尤其在檢視《API 接口》文檔時發(fā)揮了無與倫比的優(yōu)勢。這樣的神器,你值得掌握~~~
由于小女子也才接觸不多時日,本文旨在給想要使用JMeter進(jìn)行接口測試的童鞋提供一點(diǎn)點(diǎn)幫助,想要更深入的了解JMeter的功能,也可以咨詢夏老師~~~如果有哪些改進(jìn)建議,也歡迎與我聯(lián)系,如果想獲得本文的示例代碼,那就只能與我聯(lián)系了,我不會告訴你,已經(jīng)更新到SVN上了,地址為:http://hghsvn04-rd:6801/svn/CRDU_PaaS_V100R002_SVN/DOC/04.Test/99 測試交流/CCE服務(wù)/OpenAPI/測試設(shè)計/驗(yàn)收用例
2????? 什么是JMeter?
Apache JMeter是Apache組織開發(fā)的基于Java的壓力測試工具。其原本的目的是提供一款易用且功能強(qiáng)大的Web服務(wù)器性能測試工具,但隨著不斷的發(fā)展,JMeter已經(jīng)可以完成很多的性能測試場景,其支持的協(xié)議包括:FTP, HTTP, JDBC, SOAP, LDAP, SMTP等等。
3????? 安裝JMeter
3.1????? 下載安裝包
-:http://jmeter.apache.org/
Step 1:
Step 2:
Step 3:
Step 4:用戶可以根據(jù)需要下載JMeter的版本。本文寫作時所用版本為JMeter 3.0。
3.2????? 安裝軟件
JMeter本身并不需要安裝,下載后解壓到本地即可,但需要有Java環(huán)境的支持,在JMeter的主頁已經(jīng)說明清楚,并對Java版本有具體要求。
3.3????? 啟動JMeter
在解壓后的JMeter目錄有一個bin子目錄,進(jìn)入bin子目錄后雙擊jmeter.bat即可啟動JMeter。啟動JMeter時,會彈出一個Dos窗口,如果關(guān)閉該窗口,則JMeter自身也會關(guān)閉。
可以寫一個vbs腳本啟動JMeter而不必彈出Dos窗口。腳本內(nèi)容如下:
Dim wsh
Set ? wsh=WScript.CreateObject("WScript.Shell")
wsh.run "jmeter.bat",0
將以上腳本保存為JMeter.vbs并存放到JMeter的bin目錄,再雙擊JMeter.vbs即可運(yùn)行JMeter且不彈出Dos窗口。
4????? 使用指南
4.1????? 主界面
Jmeter的主界面比較簡潔,分為工具欄,工程窗口和屬性窗口。當(dāng)選中工程窗口中的節(jié)點(diǎn)時,屬性窗口會顯示相關(guān)的屬性。
4.2????? 工具欄
(1)----打開已有的工程;
(2)----選中/去選中某個已選中的用例,灰色表示這個下面的所有用例均不會被選中參與用例執(zhí)行;
(3)----運(yùn)行測試任務(wù);
(4)---停止測試任務(wù);
(5)----清除歷史結(jié)果;前一個按鈕只會清除選中的Listener的結(jié)果, 后一個按鈕會清除所有的結(jié)果;
(6)----獲取聯(lián)機(jī)幫助:在工程窗口選中樣本,在工具欄上點(diǎn)擊幫助按鈕,會彈出如下的幫助窗口;
(7)----調(diào)試窗口
4.3????? 工程窗口
4.3.1??????? 創(chuàng)建新工程
點(diǎn)擊工具欄第一個按鈕可以新建一個工程。新工程分為兩個節(jié)點(diǎn):Test Plan(測試計劃),WorkBench(工作臺),Test Plan中的任務(wù)就是整個測試工程的核心,在其中會創(chuàng)建線程組,配置元件,樣本等等。
在測試計劃中選中“Run Thread Groups consecutively”(獨(dú)立運(yùn)行每個線程組),則可以設(shè)置線程組順序執(zhí)行。如果Test Plan下有多個Thread Group,則會按前后順序等前一個線程組執(zhí)行完成后,后面的線程組才會執(zhí)行。如果不選中“Run Thread Groups consecutively”,則所有活動的線程組將會并發(fā)執(zhí)行。
測試計劃是使用JMeter進(jìn)行測試的起點(diǎn),它是其他JMeter測試元件的容器。下面介紹JMeter使用的主要元件。
4.3.2??????? Thread Group(線程組)
線程組就是測試任務(wù),可以指定該任務(wù)執(zhí)行多少次,是否自動停止等。一個Test Plan可以添加多個線程組,相當(dāng)于多個測試任務(wù),多個測試任務(wù)可以并行執(zhí)行,也可以順序執(zhí)行。
線程組代表一定數(shù)量的并發(fā)用戶,它可以用來模擬并發(fā)用戶發(fā)送請求。實(shí)際的請求內(nèi)容在Sampler中定義,Sampler被線程組包含。
添加線程組
在Test Plan上單擊右鍵,選擇“Add => Threads(Users) => Thread Group”。
線程組類型
① Setup Thread Group
該種類型的線程組相當(dāng)于一個預(yù)處理線程組,其任務(wù)會在Thread Group線程組前執(zhí)行,可以用于設(shè)置一些預(yù)置條件。
② Teardown Thread Group
Teardown Thread Group剛好和setUp Thread Group作用相反,它用于執(zhí)行后置條件,可以用于測試任務(wù)完成后進(jìn)行環(huán)境恢復(fù)等運(yùn)作。
③ Thread Group
使用最多的就是這種類型的線程組,該線程組就是測試任務(wù)的載體。
線程組配置
① Number of Threads
用于配置線程數(shù)的個數(shù),線程數(shù)越多,發(fā)送的消息量也越大。
② Ramp-Up Period
可以理解為爬坡時間,該時間是指從任務(wù)啟動開始,到創(chuàng)建完所有的線程。比如100個線程,所需要的時間。如果Ramp-Up Period設(shè)置為10,而Number of Threads設(shè)置為100, 則表示這個100個線程,要花費(fèi)10秒,平均每秒會啟動10個線程。
③ Loop Count
表示線程循環(huán)執(zhí)行多少次,如果是進(jìn)行調(diào)試測試工程,一般都會先設(shè)置成1次。而到正式執(zhí)行壓力測試時,會設(shè)置成“Forever”,即待久執(zhí)行,由用戶手工停止。
4.3.3??????? Test Fragment(測試片段)
測試片段是控制器上的一個種特殊的線程組,它在測試樹上與線程組處于一個層級。它與線程組有所不同,因?yàn)樗槐粓?zhí)行,除非它是一個模塊控制器或者是被控制器所引用時才會被執(zhí)行。為了在調(diào)試過程中可以隨意指定執(zhí)行哪個測試用例,所以本文將所有的組件都設(shè)置成了Test Fragment。
4.3.4??????? Listerner(-)
Jmeter中通過監(jiān)視元件(Listener)來觀察樣本發(fā)送的消息的狀態(tài)。常用的監(jiān)視元件有:View Results Tree和Summary Report。
添加監(jiān)聽元件
(2)View Results Tree(察看結(jié)果樹)
該監(jiān)視元件會將樣本發(fā)送的每條消息的請求和響應(yīng)都詳細(xì)的記錄下來,方便進(jìn)行調(diào)試,可以協(xié)助測試人員在測試工程制作階段排除問題。
(3)Summary Report(聚合報告)
該監(jiān)視元件不會記錄詳細(xì)的請求和響應(yīng)報文,而只是記錄各個樣本請求和響應(yīng)的次數(shù),成功率及時間指標(biāo)等信息,該監(jiān)視元件對于系統(tǒng)的評價實(shí)測系統(tǒng)的各項(xiàng)指標(biāo)能提供直觀的數(shù)據(jù)。
各個標(biāo)題的意義如下:
Label: 樣本的名稱,如果工程中使用了多個樣本,可以通過label進(jìn)行區(qū)分;
Samples: 總計發(fā)送的消息數(shù)
Average: 消息的平均時延, 單位是ms
Median:中位數(shù),也就是?50% 用戶的響應(yīng)時間
90% Line:90% 用戶的響應(yīng)時間
Min: 消息的最小時延: 單位是ms
Max: 消息的最大時延: 單位ms
Error: 失敗比例
Throughput: 吞吐量,可以理解為TPS,即每秒發(fā)送的消息個數(shù)
KB/Sec: 每秒發(fā)送的數(shù)據(jù)量
4.3.5??????? Config Element(配置元件)
配置元件(Config Element)相當(dāng)于協(xié)議管理器,主要用來管理協(xié)議連接,用的最多的主要是一些協(xié)議的默認(rèn)請求模板。比如要測試HTTP協(xié)議,就會用到HTTP類型的配置元件。需要注意的是,配置元件并不是消息驅(qū)動器,而只是協(xié)議管理器,只添加配置元件,并不能發(fā)送消息。
(1)添加配置元件
添加配置元件通過線程節(jié)點(diǎn),或者在Test Plan節(jié)點(diǎn)上單擊右鍵,選擇“Add => Config Element => HTTP Request Defaults”,如下圖所示:
(2)配置元件作用范圍
配置元件對同級別的后續(xù)節(jié)點(diǎn)生效,對子節(jié)點(diǎn)生效。配置元件并不是必須的,可以直接添加樣本元件,并進(jìn)行相關(guān)協(xié)議接口的配置。
(3)添加變量
使用變量的一個好處是可以通過一處修改,所有引用該變量的元件都會相應(yīng)修改。在測試計劃中添加的變量,在整個工程中都可以使用。如下圖所示:
使用“User Defined Variables”配置元件來定義變量,比在測試計劃節(jié)點(diǎn)定義變量更靈活,用戶變量配置元件可以添加到不同的節(jié)點(diǎn)下,用來限制其作用范圍。
4.3.6??????? Sampler(取樣器)
Config Element相對來說是一個靜態(tài)的配置器,其并不會發(fā)送或者接收消息,而只會對同類型的樣本提供配置參考,如果樣本沒有配置服務(wù)器,而配置元件中配置了服務(wù)器信息,則樣本參照配置元件中的服務(wù)器配置信息進(jìn)行鏈路建立及消息收發(fā)。
樣本是真正的執(zhí)行器,因此對一個工程來說,樣本是不可少的。
添加樣本:樣本的類型決定了測試接口的類型
Debug Sampler
一般而言,View Results Tree就能滿足我們簡單調(diào)試工程的需要,但對于復(fù)雜的工程,特別是參數(shù)引用及變量引用非常多時,可能會出現(xiàn)要跟蹤各種變量的情況,Jmeter提供了一個元件叫Debug Sampler,該樣本可以在View Results Tree中顯示,并把所有的變量結(jié)果打印出來。可以添加多個Debug Sampler在不同的樣本后面, 這樣, 每個樣本執(zhí)行后的變量的狀態(tài)都可以進(jìn)行跟蹤。
4.3.7??????? Logic Controller(邏輯控制器)
邏輯控制器可以自定義JMeter發(fā)送請求的行為邏輯,它與Sampler結(jié)合使用可以模擬復(fù)雜的請求序列。Logic Controller類似于編程語言中的for循環(huán)那樣的控制結(jié)構(gòu),它可以控制樹形結(jié)構(gòu)下面包含的Samplers的執(zhí)行方式。
添加Logic Controller
(2)邏輯控制器類型
①僅一次控制器
例如我們需要進(jìn)行一次用戶登陸操作,每一個用戶(Thread)都需要單獨(dú)login,但是在一個用戶的所有HTTP requests中(即一個session)只需要login一次。因此如果可以將這個Sampler放到Once Only Controller下面,即可保證login只在一個session中執(zhí)行一次。
②簡單控制器
本文在K8S接口測試中,定義了大量的簡單控制器,其功能類似于Ginkgo中的Context,給用例添加說明,方便區(qū)分不同的用例級別。K8S的所有接口都定義在了簡單控制器中。
③模塊控制器
本文在K8S接口測試中,同樣使用了大量的模塊控制器。前文提到,為了方便調(diào)試,把可以定義線程組的地方定義成了Test Fragment,因此,執(zhí)行這些Test Fragment就需要模塊控制器。如下圖,點(diǎn)擊模塊控制器,可以選擇執(zhí)行哪個定義的組件。
4.3.8??????? Pre/Post Processor(前置/后置處理器)
前置/后置處理器負(fù)責(zé)在生成請求之前和之后完成工作。前置處理器常常用來修改請求的設(shè)置,后置處理器則常常用來處理響應(yīng)的數(shù)據(jù)。比如Pre-processor(預(yù)處理器)可以在Sampler向Server發(fā)送請求之前定義一些變量或做處理;而Post-Processor可以在得到Response之后作一些操作。
4.3.9??????? Timer(定時器)
定時器負(fù)責(zé)定義請求之間的延遲間隔。例如需要在兩個HTTP請求之間延時一個時間段,可以加上定時器,這樣不至于給服務(wù)器造成過多的影響。
5????? API接口示例詳解
5.1????? 總覽
整個K8S接口測試的工程結(jié)構(gòu)如上圖所示。
5.1.1??????? 設(shè)置-
本工程共設(shè)置了兩個-:察看結(jié)果樹和聚合報告,用于查看每次測試用例執(zhí)行的情況。
5.1.2??????? 設(shè)置變量
為了展示方便,本文針對PaaS 1.2開放的API接口各個組件的變量分別進(jìn)行了定義:
k8s相關(guān)變量
該節(jié)點(diǎn)定義了整個工程公共的變量,主要包括api gateway的ip和port,iam的ip和port以及測試過程中應(yīng)用到的鏡像。
組件相關(guān)變量
K8S開放的API接口主要概括為8部分:Cluster(自研)、RC、Service、Pod、Secret、Namespace、PodTemplate以及Endpoint。為了方便查看、修改,針對每個接口分別設(shè)置了一個變量模塊,定義的內(nèi)容主要是接口中會引用到的name、labels等信息。以RC為例如下所示:
5.1.3??????? 設(shè)置線程組
本工程共設(shè)置了兩個線程組:
SetUp Thread Group
該線程組的任務(wù)會在Thread Group線程組前執(zhí)行,可以用于設(shè)置一些預(yù)置條件。這里設(shè)置的預(yù)置條件包括獲取token,獲取集群Clusteruuid,作為其他組件執(zhí)行前的頭域。且將其設(shè)置為僅一次控制器,這樣在執(zhí)行線程組時,只需要執(zhí)行一次獲取token操作,不需要重復(fù)獲取。
①獲取token:按照具體的用戶名、密碼等獲取token;
②獲取token變量:這里添加了一個后置處理器來獲取token變量保存token值,方便后續(xù)引用;
③獲取集群clustername、clusteruuid
④設(shè)置全局屬性:將token、clustername、clusteruuid通過函數(shù)設(shè)置為全局變量;
Thread Group線程組(命名為“單用例執(zhí)行”):該部分是整個工程執(zhí)行的入口;
①HTTP信息頭管理器:定義了用例的執(zhí)行需要攜帶的頭域信息。
②RUN:這是一個模塊控制器,在這里可以選擇要執(zhí)行的用例。
5.1.4??????? 設(shè)置Test Fragment
上文提到過,Test Fragment和線程組的區(qū)別是Test Fragment不被執(zhí)行,但可以被模塊控制器執(zhí)行。因此,這里將K8S開放的API接口以組件為單位進(jìn)行了定義,以RC為例,如下圖所示:
(1)每一個接口定義為一個簡單控制器,沒有特殊的功能,主要是定義一些描述信息(暫時這么理解),由于沒有統(tǒng)一的寫作規(guī)范,所以定義的接口可能給讀者閱讀帶來不便,簡單說明如下:
Create:創(chuàng)建一個RC;
Delete:刪除指定的RC;
……
(2)添加Sample:HTTP請求,這是接口的核心部分,定義了請求的URL及body體。有了這部分,就可以發(fā)送請求了。
Test Fragment的模塊控制器
如上圖所示,RC組件中的Replace接口有一個Read的模塊控制器,像鏈接一樣連接到了其他接口。沒錯,這就是模塊控制器與簡單控制器的區(qū)別,在執(zhí)行RC組件的Replace接口之前,需要先獲取接口信息,如果再重新定義一個Read接口,顯然是多余的,因此就可以添加一個模塊控制器,直接點(diǎn)擊其要“鏈接”的接口就可以獲取接口信息了,是不是很方便呢?
5.2????? 單個用例執(zhí)行
至此,JMeter的關(guān)鍵元件就介紹完了,定義的接口各部分也作了說明,下面就執(zhí)行一個完整的K8S用例看一下吧。還是以RC為例,執(zhí)行以下用例(各組件均已提前定義好名稱):
創(chuàng)建Namespace
接口定義:
用例執(zhí)行
查看結(jié)果:
清理數(shù)據(jù):
創(chuàng)建RCà更新RCà列舉RCà刪除RCà刪除Namespace:同樣的方法執(zhí)行這些操作,可以在結(jié)果樹中查看每一步的執(zhí)行情況;
5.3????? 用例連跑
這樣執(zhí)行用例怎么行呢,有100個用例我不是很心累嘛~~嗯,也許你已經(jīng)想到解決辦法了,沒錯,當(dāng)然就是使用模塊控制器啦,想怎么安排用例就怎么安排用例。
創(chuàng)建一個Test Fragment,命名為“RC的一系列操作”;
再創(chuàng)建一系列模塊控制器,“鏈接”到某個接口,如下圖:
執(zhí)行測試用例時,只需要選中“RC的一系列操作”,就可以將該Test Fragment下的所有用例運(yùn)行起來了;
察看一下運(yùn)行結(jié)果
所有的用例都一次性執(zhí)行,并且可以看到,與之前執(zhí)行結(jié)果不同的是,SetUp Thread Group中定義的內(nèi)容只執(zhí)行一次,為什么?翻翻前面的內(nèi)容就知道了~~~
5.4????? 結(jié)果展示
今天發(fā)現(xiàn)了一個不錯的功能,如圖:
默認(rèn)情況下,察看結(jié)果樹為“Test”類型,響應(yīng)的body體堆疊不能清晰識別,或者還要找一個Josn的解析器來幫我們分析一下響應(yīng)body體。然而察看結(jié)果樹的展示類型是可選擇的,如下圖:
選擇顯示的類型為“Json”結(jié)構(gòu),Jmeter就可以輕松幫我們呈現(xiàn)結(jié)構(gòu)清晰的響應(yīng)body體。
6????? 改進(jìn)
(1)在測試過程中,測試人員都是根據(jù)自己的使用習(xí)慣進(jìn)行各個節(jié)點(diǎn)的定義、引用,沒有統(tǒng)一的規(guī)范,維護(hù)需要一定的成本,如果推廣JMeter的使用,應(yīng)該定義一個統(tǒng)一的規(guī)范。
Java 自動化測試 任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。