互聯(lián)網(wǎng)壓力性能Badboy.Jmeter

互聯(lián)網(wǎng)壓力性能Badboy.Jmeter
http://itopic.org/jmeter-http-tcp.html

使用JMeter錄制手機(jī)App腳本

1、 添加線程組? 選中“測(cè)試計(jì)劃”,右鍵依次添加【線程組】,用于保存錄制的腳本。2、 添加HTTP代理服務(wù)器? 選中“工作臺(tái)”,右鍵依次添加【HTTP代理服務(wù)器】。? 配置HTTP代理服務(wù)器,端口可以使用默認(rèn)8080,目標(biāo)控制器選擇“測(cè)試計(jì)劃>線程組”。? 啟動(dòng)HTTP代理服務(wù)器,彈出“Root CA……”的提示框,點(diǎn)擊“確定”表示HTTP代理服務(wù)器開始工作。3、 配置手機(jī)網(wǎng)絡(luò)代理? 進(jìn)入手機(jī)WIFI設(shè)置,選擇一個(gè)WIFI,長按WIFI名稱,在彈出的提示框中,選擇“修改網(wǎng)絡(luò)”? 在修改網(wǎng)絡(luò)頁,勾選【顯示高級(jí)選項(xiàng)】,填寫代理服務(wù)器主機(jī)名(JMeter軟件所在的主機(jī)IP地址)和代理服務(wù)器端口(添加HTTP代理服務(wù)器配置的端口,默認(rèn)8080),保存配置4、 查看JMeter錄制的手機(jī)App腳本[

](https://testerhome.com/uploads/photo/2017/2a131cd8-a9ac-4103-aa0b-932f26d71e19.png!large)
備注:本人不太喜歡用Jmeter的錄制功能,因?yàn)闀?huì)錄制很多無效的網(wǎng)絡(luò)請(qǐng)求,但若不知道接口參數(shù)的情況下,可以采用錄制方式,然后刪除修改。
線程組的設(shè)置
普通線程組1、 線程數(shù):設(shè)置并發(fā)用戶線程數(shù)量,即通常意義的并發(fā)用戶數(shù)2、 Ramp-Up Period (in seconds):設(shè)置并發(fā)用戶加載時(shí)間,假設(shè)并發(fā)用戶數(shù)設(shè)置為100,此處設(shè)置為10,則認(rèn)為jmeter會(huì)在10s內(nèi)加載完成100并發(fā)用戶數(shù),也就是說每隔10秒加載一個(gè)3、 循環(huán)次數(shù):輸入框與復(fù)選框只能選擇一種,不能同時(shí)被選擇為場(chǎng)景循環(huán)方式;輸入框輸入數(shù)字則被認(rèn)為是當(dāng)前線程組所控制的腳本區(qū)域的執(zhí)行次數(shù);【永遠(yuǎn)】復(fù)選框選擇后,輸入框內(nèi)的數(shù)字將失效,啟動(dòng)后腳本將一直執(zhí)行下去。4、 調(diào)度器:對(duì)于調(diào)度而言,顧名思義就是我們想在什么時(shí)間開始運(yùn)行,運(yùn)行多長時(shí)間自動(dòng)停止諸如此類的場(chǎng)景需求均可以在此設(shè)置。  ? 啟動(dòng)時(shí)間:在設(shè)置時(shí)間點(diǎn)開始運(yùn)行場(chǎng)景,比如你想在下班后開始運(yùn)行,如果時(shí)間小于當(dāng)前時(shí)間,啟動(dòng)后立即執(zhí)行,大于當(dāng)前時(shí)間,啟動(dòng)后等待本地時(shí)間到了自動(dòng)運(yùn)行  ? 結(jié)束時(shí)間:在設(shè)置時(shí)間點(diǎn)結(jié)束運(yùn)行場(chǎng)景,比如上班前結(jié)束運(yùn)行,結(jié)束時(shí)間如果小于開始時(shí)間或者當(dāng)前時(shí)間,自動(dòng)運(yùn)行后立即終止  ? 持續(xù)時(shí)間:設(shè)置當(dāng)前場(chǎng)景持續(xù)運(yùn)行的時(shí)間  ? 啟動(dòng)延遲:設(shè)置場(chǎng)景啟動(dòng)后多長時(shí)間再開始真正運(yùn)行,比如你想在下班后5分鐘開始運(yùn)行場(chǎng)景其中持續(xù)時(shí)間和啟動(dòng)延遲的優(yōu)先級(jí)高于啟動(dòng)時(shí)間和結(jié)束時(shí)間,也就是說當(dāng)你設(shè)置了持續(xù)時(shí)間或者啟動(dòng)延遲,那么你的啟動(dòng)時(shí)間或者結(jié)束時(shí)間將失效,5、 幾種設(shè)置場(chǎng)景組合:  ? 不勾選【永遠(yuǎn)】,選擇【調(diào)度器】,設(shè)置完成后,啟動(dòng)運(yùn)行也只會(huì)運(yùn)行當(dāng)前并發(fā)用戶數(shù)循環(huán)次數(shù),運(yùn)行完成即會(huì)結(jié)束。所以此中選擇可用于希望未來某時(shí)間點(diǎn)開始運(yùn)行完成并發(fā)用戶數(shù)循環(huán)次數(shù)的場(chǎng)景  ? 勾選【永遠(yuǎn)】,設(shè)置啟動(dòng)時(shí)間及結(jié)束時(shí)間,持續(xù)時(shí)間和啟動(dòng)延遲均為空,可用于希望未來某時(shí)間點(diǎn)自動(dòng)運(yùn)行并且到未來某時(shí)間點(diǎn)自動(dòng)結(jié)束的場(chǎng)景  ? 勾選【永遠(yuǎn)】, 設(shè)置 持續(xù)時(shí)間和啟動(dòng)延遲, 可用于希望在啟動(dòng)多久后自動(dòng)運(yùn)行并持續(xù)多長時(shí)間的場(chǎng)景
另外介紹一個(gè)調(diào)試工具Debug Sampler,會(huì)把我們自定義的變量輸出在response data中,方便我們調(diào)試的時(shí)候使用,但在正式執(zhí)行腳本時(shí)需要?jiǎng)h除Debug Sample[

](https://testerhome.com/uploads/photo/2017/e1e8d832-6d0e-466b-9c3d-1eead591b061.png!large)
jp@gc - Stepping Thread Group
[

](https://testerhome.com/uploads/photo/2017/a59940a0-c7da-4bfd-8c76-8a4b72b9cb35.png!large)類似loadrunner的場(chǎng)景設(shè)置,解釋:? This Group will start 100 threads:這次的測(cè)試總共會(huì)起100個(gè)線程。? First , wait for 0 seconds:等待0s后開始起線程,也就是不等待直接起線程。? Then start 10 threads every 30 seconds:每起10個(gè)線程后會(huì)運(yùn)行30s,再起余下的10個(gè)線程,再運(yùn)行30s,以此類推。? Using ramp-up 5 seconds:前面每起多少個(gè)線程的時(shí)候花5s,與上面結(jié)合起來即5s內(nèi)起10個(gè)線程,運(yùn)行30s,然后再再5s內(nèi)再起10個(gè)線程,再運(yùn)行30s,以此類推。? Then hold load for 60 seconds. :全部的線程起來后,運(yùn)行60s 后開始停止(跟loadrunner類似,從jmeter聚合報(bào)告里面可以看出來,這里的hold load 的意思,其實(shí)是這些線程,一直在請(qǐng)求,相當(dāng)于jmeter普通線程組里面的循環(huán)運(yùn)行)。? Finally , stop 5 threads every 1 seconds:最后停止線程,5個(gè)線程停一次,等1s再停5個(gè)線程(當(dāng)然,第一次是hold時(shí)間一過就先停5個(gè)線程,然后等1s再停余下的5個(gè)線程)。
介紹幾個(gè)常用的邏輯控制器
JMeter中的Logic Controller分為兩類:a) 控制測(cè)試計(jì)劃執(zhí)行過程中節(jié)點(diǎn)的邏輯執(zhí)行順序,如:循環(huán)控制器(Loop Controller)、if控制器(If Controller)等;b) 對(duì)測(cè)試計(jì)劃中的腳本進(jìn)行分組、方便JMeter統(tǒng)計(jì)執(zhí)行結(jié)果以及進(jìn)行腳本的運(yùn)行時(shí)控制等,如:吞吐量控制器(Throughput Controller)、事務(wù)控制器(Transaction Controller)。一、ForEach控制器(ForEach Controller)  作用:ForEach控制器一般和用戶自定義變量一起使用,其在用戶自定義變量中讀取一系列相關(guān)的變量。該控制器下的采樣器或控制器都會(huì)被執(zhí)行一次或多次,每次讀取不同的變量值。二、包含控制器(Include Controller)  作用:用于引用外部的Jmx文件;從而控制多個(gè)測(cè)試計(jì)劃組合三、事務(wù)控制器(Transaction Controller)  作用: 事務(wù)控制器會(huì)生產(chǎn)一個(gè)額外的采樣器,用來統(tǒng)計(jì)該控制器子結(jié)點(diǎn)的所有時(shí)間。四、僅一次控制器(Once Only Controller)  作用:在測(cè)試計(jì)劃執(zhí)行期間,該控制器下的子結(jié)點(diǎn)對(duì)每個(gè)線程只執(zhí)行一次,登錄場(chǎng)景經(jīng)常會(huì)使用到這個(gè)控制器。五、吞吐量控制器(Throughput Controller)  作用:控制其下的子節(jié)點(diǎn)的執(zhí)行次數(shù)與負(fù)載比例分配,也有兩種方式:  Total Executions:設(shè)置運(yùn)行次數(shù)  Percent Executions:設(shè)置運(yùn)行比例(1~100之間,不用寫%)  如:設(shè)置線程組循環(huán)5次,吞吐量控制器1:百分比40,吞吐量控制器2:百分比60[

](https://testerhome.com/uploads/photo/2017/2345227d-9435-47c0-9680-efe544dae85b.png!large)
六、If 控制器(If Controller)  作用:根據(jù)給定表達(dá)式的值決定是否執(zhí)行該節(jié)點(diǎn)下的子節(jié)點(diǎn),默認(rèn)使用javascript的語法進(jìn)行判斷[

](https://testerhome.com/uploads/photo/2017/88ecd8db-f685-4e9a-a7af-3c4d7b6fb711.png!large)
腳本參數(shù)化的幾種方式
一、使用Jmeter自帶函數(shù)獲取參數(shù)值  Jmeter中可以產(chǎn)生值的函數(shù)有:Random( , , ),threadNum,CSVRead( , ),StringFromFile( , , , ) 。函數(shù)調(diào)用方法就不細(xì)說了,因?yàn)镴meter中有函數(shù)助手[

](https://testerhome.com/uploads/photo/2017/74059e48-7c1e-4bf0-8920-3246b46bb669.png!large)  然后將函數(shù)復(fù)制到需要用到隨機(jī)數(shù)的地方,當(dāng)我們?cè)O(shè)置的線程數(shù)超過隨機(jī)數(shù)范圍時(shí),隨機(jī)數(shù)將會(huì)重復(fù)生成。
不過需要重點(diǎn)介紹下正則表達(dá)式的使用,后續(xù)有需要用到關(guān)聯(lián)測(cè)試,因?yàn)樵跍y(cè)試過程過有些數(shù)據(jù)是經(jīng)常發(fā)生變化的,要獲取并使用這些數(shù)據(jù),就要使用關(guān)聯(lián)。[

](https://testerhome.com/uploads/photo/2017/92824be3-63ec-488c-859a-7be8aabb4c7e.png!large)
1、 第一個(gè)參數(shù):用于解析服務(wù)器響應(yīng)數(shù)據(jù)的正則表達(dá)式。它會(huì)找到所有的匹配項(xiàng)。如果測(cè)試人員希望將表達(dá)式中的某部分應(yīng)用在模板字符串中,記得加上圓括號(hào)。2、 第二個(gè)參數(shù):這是一個(gè)模板字符串,函數(shù)會(huì)動(dòng)態(tài)填寫字符串的部分內(nèi)容。要在字符串中引用正則表達(dá)式捕獲的匹配組合,請(qǐng)使用語法:$[group_number]$。例如$1$或者 $2$。測(cè)試人員的模板可以是任何字符串3、 第三個(gè)參數(shù):第3個(gè)參數(shù)告訴JMeter使用第幾次匹配。測(cè)試人員的正則表達(dá)式可能會(huì)找到多個(gè)匹配項(xiàng)。對(duì)此,測(cè)試人員有4種選擇:? 整數(shù),直接告訴JMeter使用第幾個(gè)匹配項(xiàng)。 “1”對(duì)應(yīng)第一個(gè)匹配,“2”對(duì)應(yīng)第二個(gè)匹配,以此類推? RAND,告訴JMeter隨機(jī)選擇一個(gè)匹配項(xiàng)? ALL,告訴JMeter使用所有匹配項(xiàng),為每一個(gè)匹配項(xiàng)創(chuàng)建一個(gè)模板字符串,并將它們連接在一起? 浮點(diǎn)值0到1之間,根據(jù)公式(找到的總匹配數(shù)目*指定浮點(diǎn)值)計(jì)算使用第幾個(gè)匹配項(xiàng),計(jì)算值向最近的整數(shù)取整4、 第四個(gè)參數(shù):如果在上一個(gè)參數(shù)中選擇了“ALL”,那么這第4個(gè)參數(shù)會(huì)被插入到重復(fù)的模板值之間5、 第五個(gè)參數(shù):如果沒有找到匹配項(xiàng)返回的默認(rèn)值6、 第六個(gè)參數(shù):重用函數(shù)解析值的引用名,參見上面內(nèi)容7、 第七個(gè)參數(shù):輸入變量名稱。如果指定了這一參數(shù),那么該變量的值就會(huì)作為函數(shù)的輸入,而不再使用前面的采樣結(jié)果作為搜索對(duì)象
二、使用CSV Data Set Config獲取參數(shù)值[

](https://testerhome.com/uploads/photo/2017/07956f7f-1acf-4e80-a6d7-aa20b674f7ea.png!large)
三、使用用戶定義的變量獲取參數(shù)值[

](https://testerhome.com/uploads/photo/2017/d3747148-55e5-4ac2-8928-98fab49cef51.png!large)  一般配合ForEach控制器一起使用
參數(shù)值的傳遞
一、利用Cookie進(jìn)行值的傳遞  用JMeter進(jìn)行接口調(diào)試時(shí),有時(shí)候會(huì)遇到需要登錄的情況,如請(qǐng)求wetest的DataSearchAjax接口:[

](https://testerhome.com/uploads/photo/2017/040fc1fd-a17e-411f-b566-493ac6d14e19.png!large)  出現(xiàn)這種情況的原因很明顯是未登錄引起的。一個(gè)較好的解決方法就是將登錄后的cookies保存下來,在訪問DataSearchAjax接口的時(shí)候,帶上用戶登錄后的cookies信息進(jìn)行查看。  在JMeter中,我們可以通過如下途徑進(jìn)行cookies的傳遞,如下圖添加HTPP Cookie管理器:[

](https://testerhome.com/uploads/photo/2017/9133cdb9-ea5b-4d9a-b6cf-d14f14060e84.png!large)  再給登錄的接口添加前置處理器Bean Shell PreProcessor,用來保存登錄的cookies:[

](https://testerhome.com/uploads/photo/2017/29b96836-e878-4d5f-aed1-0741b168fdc3.png!large)  我們要在Bean Shell PreProcessor里面添加我們的cookies值了。二、利用正則匹配提取上一個(gè)接口的返回?cái)?shù)據(jù)作為下個(gè)請(qǐng)求的輸入  用JMeter進(jìn)行接口調(diào)試時(shí),經(jīng)常會(huì)遇到上一接口的返回值中的某個(gè)字段,要作為下一接口的輸入,這種情況下,我們需要利用正則匹配來提取我們需要的值?! ±?,若要提取相應(yīng)數(shù)據(jù)中的userid字段作為下個(gè)接口的輸入的話,可以在該接口請(qǐng)求后面添加正則表達(dá)式提取器:[

](https://testerhome.com/uploads/photo/2017/8af43d26-d2bb-418d-977a-cc7b1a819b98.png!large)  我們給正則表達(dá)式提取器命名為get_userid,并填寫引用名稱、正則表達(dá)式、模板、匹配數(shù)值、缺省值,填寫后的如如下:[

](https://testerhome.com/uploads/photo/2017/c2055827-ae22-4656-a658-dbc979696876.png!large)
  填寫完成后,在添加新的HTTP請(qǐng)求,來測(cè)試提取到的user_id字段:[

](https://testerhome.com/uploads/photo/2017/3be56d03-2e7e-4401-ba62-8bbf4339b314.png!large)
介紹幾個(gè)定時(shí)器的用法,類于loadrunner中的thinktime,集合點(diǎn)的設(shè)置
一、固定定時(shí)器(Constant Timer)[

](https://testerhome.com/uploads/photo/2017/2c8b307a-1aef-4566-8eec-a9cb009606c4.png!large)  這是一個(gè)很重要的定時(shí)器,如果你需要讓每個(gè)線程在請(qǐng)求之前按相同的指定時(shí)間停頓,那么可以使用這個(gè)定時(shí)器;需要注意的是,固定定時(shí)器的延時(shí)不會(huì)計(jì)入單個(gè)sampler的響應(yīng)時(shí)間,但會(huì)計(jì)入事務(wù)控制器的時(shí)間?! ?duì)于“java請(qǐng)求”這個(gè)sampler來說,定時(shí)器相當(dāng)于loadrunner中的pacing(兩次迭代之間的間隔時(shí)間);  對(duì)于“事務(wù)控制器”來說,定時(shí)器相當(dāng)于loadrunner中的think time(思考時(shí)間:實(shí)際操作中,模擬真實(shí)用戶在操作過程中的等待時(shí)間)。二、高斯隨機(jī)定時(shí)器(Gaussian Random Timer)[

](https://testerhome.com/uploads/photo/2017/0752d6c0-0ba5-4bed-a6c1-d98db575508e.png!large)  如果需要讓每個(gè)線程在請(qǐng)求之前按隨機(jī)的時(shí)間停頓,那么可以使用這個(gè)定時(shí)器,上圖表示暫停時(shí)間會(huì)分布在100到400之間三、同步定時(shí)器(Synchronizing Timer)[

](https://testerhome.com/uploads/photo/2017/94dcf155-b39f-4ca8-8639-f5ab2673d5c3.png!large)  這個(gè)定時(shí)器和loadrunner當(dāng)中的集合點(diǎn)(rendezvous point)作用相似,其作用是:阻塞線程,直到指定的線程數(shù)量到達(dá)后,再一起釋放,可以瞬間產(chǎn)生很大的壓力(1)Number of Simulated Users to Group by:模擬用戶的數(shù)量,即指定同時(shí)釋放的線程數(shù)數(shù)量(2)Timeout in milliseconds:超時(shí)時(shí)間,即超時(shí)多少毫秒后同時(shí)釋放指定的線程數(shù)
監(jiān)聽器配置
  將下載的JMeterPlugins.jar包復(fù)制到Jmeter的lib目錄下面的ext目錄下面,重新啟動(dòng)Jmeter,我們點(diǎn)擊添加就可以看到出現(xiàn)了很多的jp@gc-開頭的文件。這里監(jiān)控內(nèi)存我們使用的是:jp@gc - PerfMon Metrics Collectot  在使用之前,我們需要下載ServerAgent-2.2.1,然后運(yùn)行/serverAgent/startAgent.bat這個(gè)文件,我們需要將serverAgent目錄及下面的文件復(fù)制到我們測(cè)試的服務(wù)器上,然后點(diǎn)擊打開,它的默認(rèn)端口為4444?! 〕S玫谋O(jiān)聽器還有如下jp@gc - Active Threads Over Time,jp@gc - Transactions per Second,jp@gc - Response Times Over Time,jp@gc - Composite Graph,保存響應(yīng)到文件,聚合報(bào)告,察看結(jié)果樹[

](https://testerhome.com/uploads/photo/2017/fcb834f1-6257-4c54-9992-95ac55cfd73a.png!large)其中jp@gc - Composite Graph可以將多個(gè)監(jiān)聽視圖進(jìn)行合并分析
最后測(cè)試報(bào)告的生成
  使用jmeter進(jìn)行性能測(cè)試,運(yùn)行完畢后生成html格式的測(cè)試報(bào)告,需要進(jìn)行如下操作(3.0含及以上的版本):一、在jmeter.properties或者user.properties確認(rèn)如下配置項(xiàng)
? jmeter.save.saveservice.bytes = true? jmeter.save.saveservice.label = true? jmeter.save.saveservice.latency = true? jmeter.save.saveservice.response_code = true? jmeter.save.saveservice.response_message = true? jmeter.save.saveservice.successful = true? jmeter.save.saveservice.thread_counts = true? jmeter.save.saveservice.thread_name = true? jmeter.save.saveservice.time = true? jmeter.save.saveservice.timestamp_format = ms? jmeter.save.saveservice.timestamp_format = yyyy/MM/dd HH:mm:ss

o 如果希望在Errors報(bào)告中展示更詳細(xì)數(shù)據(jù),需要確保如下配置: jmeter.save.saveservice.assertion_results_failure_message = trueo 如果使用了事務(wù)控制器(Transaction Controller),確認(rèn)Generate parent sample為未勾選狀態(tài)
運(yùn)行jmeter程序,在命令行輸入如下信息1)Windows系統(tǒng)輸入格式如下:jmeter.bat -n -t -l -e -o 實(shí)際輸入:C:\apache-jmeter-3.0\bin\jmeter.bat -n -t Movie.jmx -l movie.jtl -e -o test
2)Linux系統(tǒng)輸入格式如下:jmeter -n -t -l -e -o 實(shí)際輸入:/opt/apache-jmeter-3.0/bin/jmeter -n -t final-result.jmx -l final-result.jtl -e -o /opt/apache-jmeter-3.0/test
[

安裝必要插件jmeter-plugins(windows下)
下載插件管理器
http://www.jmeter-plugins.org/get/ 將下載所得的jar包放在{jmeter}/bin/lib/ext目錄下
打開GUI模式下的jmeter下載所需插件
選擇菜單欄中的“選項(xiàng)”,選擇“Plugings Manager”,如圖

這里寫圖片描述

選擇所需插件安裝
打開插件管理器后選擇Available Plugings,勾選3 Basic Graph 以及Custom Thread Groups,點(diǎn)擊Apply Changes and Restart JMeter,等待下載完成重啟JMeter即可。
這里寫圖片描述

安裝必要插件jmeter-plugins(Linux下)
查找并復(fù)制jar包
在windows的界面下,安裝好插件后,根據(jù)上圖的Review Changes中的信息,在{jmeter}/bin/lib/ext中找到新增jar包,復(fù)制到linux上。
使用JMeter測(cè)試
GUI模式下測(cè)試接口
添加線程組
在GUI模式,打開JMeter。右鍵點(diǎn)擊“測(cè)試計(jì)劃”,選擇“添加”→“Threads(Users)”→“線程組”,如圖所示:
這里寫圖片描述

添加HTTP請(qǐng)求
線程組屬性不做修改,右鍵點(diǎn)擊新添加的“線程組”,選擇“添加”→“Sampler”→“HTTP請(qǐng)求”,如圖所示:
這里寫圖片描述

完成HTTP請(qǐng)求
根據(jù)請(qǐng)求信息,完成“HTTP請(qǐng)求”:修改名稱;注意IP和端口號(hào),在路徑欄補(bǔ)齊除ip端口號(hào)的剩余路徑;Implementation使用httpClient4;使用https的協(xié)議需要在協(xié)議欄填寫https;選擇請(qǐng)求的方法,多數(shù)為POST或這GET;若請(qǐng)求體中含有中文,最好在content encoding中填寫utf-8;請(qǐng)求參數(shù)可以選擇Parameters或者Body Data,Parameters的參數(shù)更加直觀,Body Data的更加方便參數(shù)修改且參數(shù)以parameter1=value1&mmeter2=value2形式。
添加查看結(jié)果數(shù)
右鍵點(diǎn)擊“HTTP請(qǐng)求”,選擇“添加”→“監(jiān)聽器”→“查看結(jié)果樹”,如圖所示:
這里寫圖片描述

添加證書文件
協(xié)議為Https的請(qǐng)求還需要加載證書,如果為https協(xié)議,在沒有加載證書的情況下,進(jìn)行了測(cè)試,最好保存測(cè)試計(jì)劃,然后重啟JMeter,重啟后先加載證書,再進(jìn)行測(cè)試,否則,報(bào)錯(cuò)。選擇“選項(xiàng)”→“SSL管理器”,如圖所示:
這里寫圖片描述

選擇pkcs12的證書文件
使用pkcs12的證書文件,jks直接用是不行的,需要java打包下
啟動(dòng)測(cè)試
點(diǎn)擊“啟動(dòng)”按鈕,啟動(dòng)測(cè)試,如圖所示
這里寫圖片描述

輸入pcks12的密碼
啟動(dòng)測(cè)試后,彈出“KeyStore Password”,輸入pcks12生成時(shí)用的密碼。
這里寫圖片描述

測(cè)試后查看結(jié)果樹
測(cè)試結(jié)束后,點(diǎn)擊“查看結(jié)果樹”,可以看到當(dāng)前測(cè)試運(yùn)行了一個(gè)實(shí)例,選中該結(jié)果,點(diǎn)擊“響應(yīng)數(shù)據(jù)”查看響應(yīng)的文本,檢查文本是否為正確的響應(yīng)數(shù)據(jù),JMeter會(huì)把所有響應(yīng)碼200的回復(fù)都當(dāng)成成功,一些服務(wù)例如查詢等,可能會(huì)設(shè)置查詢失敗下返回提示語句但響應(yīng)碼依舊是200。此時(shí)需要查看響應(yīng)文本中正確響應(yīng)的關(guān)鍵詞,方便壓測(cè)時(shí)設(shè)置響應(yīng)斷言。
GUI模式下創(chuàng)建壓力測(cè)試計(jì)劃
添加Concurrency Thread Group
可以新建一個(gè)測(cè)試計(jì)劃,也可以在原先接口測(cè)試的測(cè)試計(jì)劃上修改。本例直接修改原先的接口測(cè)試,右鍵“測(cè)試計(jì)劃”,選擇擇“添加”→“Threads(Users)”→“Concurrency Thread Group”,如圖所示:
這里寫圖片描述

設(shè)置Concurrency Thread Group
根據(jù)需求完成線程組的設(shè)置,需要填寫“Target Concurrency”,為壓力測(cè)試預(yù)期的并發(fā)壓力(注意Jmeter采用線程模擬并發(fā)的策略,大并發(fā)意味著大量線程,測(cè)試機(jī)性能會(huì)大量消耗,甚至影響測(cè)試結(jié)果,所以需要大并發(fā)的情況下,建議采用分布式部署Jmeter進(jìn)行測(cè)試);“Ramp Up Time”,為測(cè)試并發(fā)數(shù)啟動(dòng)所需時(shí)間(注意測(cè)試并不是所有并發(fā)啟動(dòng)后才運(yùn)行,在啟動(dòng)過程中,先啟動(dòng)的線程會(huì)先運(yùn)行請(qǐng)求);“Ramp Up Steps Counts”,為是否將啟動(dòng)線程分階段的啟動(dòng),例如10即為分10次階段性的啟動(dòng)一部分線程,可以為空;“Hold Target Rate Time”,為并發(fā)達(dá)到要求后再運(yùn)行多久時(shí)間;“Time Unit”,時(shí)間單位,非常重要,有分和秒,不要選擇錯(cuò)誤。
這里寫圖片描述

添加Http請(qǐng)求
直接復(fù)制之前接口測(cè)試時(shí)的http請(qǐng)求,刪去查看結(jié)果樹即可。
添加聚合報(bào)告
右鍵http請(qǐng)求,選擇“添加”→“監(jiān)聽器”→“聚合報(bào)告”。如圖所示
這里寫圖片描述

聚合報(bào)告中保存測(cè)試數(shù)據(jù)
在聚合報(bào)告的“文件名”欄,填入./*****-${__time(yyyyMMdd-HHmmss,)}.jtl,表示在當(dāng)前目錄生成jtl(jmeter的數(shù)據(jù)文件格式),${__time(yyyyMMdd-HHmmss,)}為jmeter的時(shí)間函數(shù),生成測(cè)試的年月日分鐘秒,方便后期管理測(cè)試數(shù)據(jù)。
這里寫圖片描述

添加響應(yīng)斷言
右鍵http請(qǐng)求,選擇“添加”→“斷言”→“響應(yīng)斷言”,如圖所示:
這里寫圖片描述

配置響應(yīng)斷言
不同請(qǐng)求配置不同的斷言。根據(jù)之前的接口測(cè)試,點(diǎn)擊添加,輸入判斷文本,不同模式匹配規(guī)則,自行百度
這里寫圖片描述

保存測(cè)試計(jì)劃
刪除接口測(cè)試的線程組,點(diǎn)擊“文件”,選擇“保存測(cè)試計(jì)劃為”,保存測(cè)試計(jì)劃。壓測(cè)計(jì)劃創(chuàng)建完成。注意3.1版本“保存測(cè)試計(jì)劃為”下面是“選中部分保存為”,舊版就是“保存為”,會(huì)保存選中的部分,然后實(shí)際測(cè)試的時(shí)候因?yàn)闇y(cè)試計(jì)劃不完整是沒法跑測(cè)試的,會(huì)報(bào)Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan class!,這雷舊版很容易踩上。
這里寫圖片描述

NO-GUI模式下啟動(dòng)壓力測(cè)試
Windows下
打開cmd,目錄切換到測(cè)試計(jì)劃(jmx)所在的目錄,證書放在同一目錄下,輸入{jmeter}/bin/jmeter -Djavax.net.ssl.keyStore=****.pkcs12 -Djavax.net.ssl.keyStorePassword=**** -n -t *.jmx {jmeter}為jmeter的安裝目錄 -Djavax.net.ssl.keyStore=****.pkcs12 是證書文件 -Djavax.net.ssl.keyStorePassword=**** 是證書文件生成時(shí)的密碼 -n 為nogui模式 -t 后面為測(cè)試計(jì)劃文件(jmx)
linux下(推薦)
目錄切換到測(cè)試計(jì)劃(jmx)所在的目錄,證書放在同一目錄下,輸入{jmeter}/bin/jmeter -Djavax.net.ssl.keyStore=****.pkcs12 -Djavax.net.ssl.keyStorePassword=**** -n -t *.jmx |tee -a *.out {jmeter}為jmeter的安裝目錄 -Djavax.net.ssl.keyStore=****.pkcs12 是證書文件 -Djavax.net.ssl.keyStorePassword=**** 是證書文件生成時(shí)的密碼 -n 為nogui模式 -t 后面為測(cè)試計(jì)劃文件(jmx) tee -a 參數(shù)后為文本文件,用于保存測(cè)試時(shí)輸出summarize數(shù)據(jù) 若是為http的,Djavax.net.ssl.keyStore=****.pkcs12 -Djavax.net.ssl.keyStorePassword=**** 直接省去
使用JMeter查看數(shù)據(jù)
在GUI模式下
選擇報(bào)表
打開Jmeter,右擊測(cè)試計(jì)劃,選擇“添加”→“監(jiān)聽器”→“聚合報(bào)告”;“添加”→“監(jiān)聽器”→“Response Times Over Time”;“添加”→“監(jiān)聽器”→“Transactions per Second”(有其他圖表需要可以自行下載插件安裝),如圖所示:
這里寫圖片描述

加載數(shù)據(jù)
選擇聚合報(bào)告,點(diǎn)擊文件名欄后的瀏覽,選擇jtl文件,加載數(shù)據(jù)(其余監(jiān)聽器類似),如圖所示:
這里寫圖片描述

其他:
http會(huì)產(chǎn)生cookie的,需要?jiǎng)h除或者其他操作的,需要添加cookie管理器。 默認(rèn)jtl數(shù)據(jù)不保存響應(yīng)文本,需要保存錯(cuò)誤文件的信息,可以添加監(jiān)聽器中的保存響應(yīng)到文件,勾選Save Failed Responses only(不推薦有較多錯(cuò)誤的情況去保存文本,容易卡?。?。 Bin目錄下有個(gè)templates文件夾,里面有些JMeter用法的例子,可以看看。 NOGUI模式下可以使用jmeter -g result.jtl -o ./ResultReport生成一個(gè)html的報(bào)表(3.0版本以上)
[jmeter進(jìn)行分布式測(cè)試]
一、背景:
之前在Jmeter插件監(jiān)控服務(wù)器性能一篇中說到,在非GUI環(huán)境中監(jiān)控時(shí)為了保存監(jiān)控?cái)?shù)據(jù)需要修改jmeter腳本,并且每次通過施壓機(jī)(遠(yuǎn)程服務(wù)器,非GUI環(huán)境)來壓測(cè)時(shí)都要將jmeter腳本上傳然后在服務(wù)器上通過命令行啟動(dòng),測(cè)試完成后再把結(jié)果數(shù)據(jù)下載到本地GUI環(huán)境中查看,總是有很多不方便。
本次壓測(cè)需求需要很大的并發(fā)量,例如3000,但是單臺(tái)施壓機(jī)難以實(shí)現(xiàn),因此希望多臺(tái)施壓機(jī)并行,并且我能同步控制它們。
在這樣的需求下經(jīng)過了解,jmeter工具本身有一個(gè)很強(qiáng)大的遠(yuǎn)程啟動(dòng)功能,于是嘗試了一下。

二、jmeter分布式原理

這個(gè)遠(yuǎn)程啟動(dòng),網(wǎng)上說的高大上一點(diǎn),就是jmeter的分布式控制~ 具體控制如下圖:

客戶端機(jī)器作為一個(gè)控制器controller,控制多臺(tái)slave機(jī)器的操作。
controller通過GUI界面啟動(dòng)slave機(jī)器,將jmeter壓測(cè)發(fā)送給每臺(tái)啟動(dòng)的slave,slave獲得腳本后開始執(zhí)行。slave本地不需預(yù)先存儲(chǔ)腳本;
各臺(tái)slave執(zhí)行完成后,將結(jié)果傳回給controller,controller收集整合顯示。

三、jmeter遠(yuǎn)程啟動(dòng)配置
服務(wù)器(slave)配置
服務(wù)器(slave)需安裝jmeter,最好與客戶端(controller)保持同版本,jdk最好也保持同版本,無法滿足時(shí)至少保證服務(wù)器上的jmeter能正常運(yùn)行(如jmeter3.0以后需要jdk1.7及以上版本)。

在slave的%JMETER_HOME%bin目錄下執(zhí)行./jmeter-server命令啟動(dòng)jmeter服務(wù)就可以,啟動(dòng)成功如下圖:

注意:上圖紅框中的ip為服務(wù)器的ip地址,當(dāng)服務(wù)器有多網(wǎng)卡時(shí)它會(huì)隨機(jī)挑選一個(gè)網(wǎng)卡使用,紅框中的端口號(hào)port為啟動(dòng)jmeter服務(wù)監(jiān)聽的port,一般會(huì)有個(gè)默認(rèn)端口號(hào)1099,但最好自定義,確保端口號(hào)不沖突。修改方法在下文介紹。

客戶端(controller)配置
在客戶端上要保證執(zhí)行命令能發(fā)送到服務(wù)器,因此需配置客戶端遠(yuǎn)程的ip地址和port。在客戶端安裝目錄的bin文件夾下,找到j(luò)meter.properties,修改配置如下圖,其中ip和port即為上一步slave的ip和port,如上圖中jmeter-server啟動(dòng)時(shí)紅框中顯示的內(nèi)容。多個(gè)slave機(jī)器的配置可通過逗號(hào)分隔。
remote_hosts=10.165.124.6:1029

配置完成后打開客戶端jmeter的GUI界面,在運(yùn)行-遠(yuǎn)程啟動(dòng)中即可看到自己配置的slave機(jī)器。

添加一個(gè)腳本,點(diǎn)擊遠(yuǎn)程啟動(dòng)即可啟動(dòng)運(yùn)行slave機(jī)器,此時(shí)在服務(wù)器上可看到控制臺(tái)信息,在客戶端通過監(jiān)聽器-聚合報(bào)告或察看結(jié)果數(shù)可看到執(zhí)行結(jié)果。

四、問題
slave機(jī)器的自定義端口號(hào)配置
在slave機(jī)器的%JMETER_HOME%bin目錄下找到j(luò)meter.properties,修改如下兩項(xiàng)配置,即可自定義端口號(hào):
server_port=1029server.rmi.localport=1029

修改后執(zhí)行服務(wù)端的jmeter-server即可看到控制臺(tái)消息中修改是否生效;修改生效后需在客戶端修改相應(yīng)的jmeter.properties下的remote_hosts。

slave機(jī)器和客服端多網(wǎng)卡的問題
我在執(zhí)行過程中slave機(jī)器的jmeter-server.log和客戶端的jmeter.log中均報(bào)錯(cuò)提示connect refused。經(jīng)過檢查后發(fā)現(xiàn)服務(wù)器上有2個(gè)網(wǎng)卡,客戶端有兩個(gè)網(wǎng)卡,兩臺(tái)機(jī)器通過vpn在內(nèi)網(wǎng)環(huán)境通信。而jmeter在遠(yuǎn)程通信的時(shí)候是隨機(jī)選擇一個(gè)網(wǎng)卡的ip,這樣很容易導(dǎo)致連接不成功。
可通過如下配置指定服務(wù)器和客戶端的網(wǎng)卡,在服務(wù)器端的jmeter-server文件中,修改配置指定服務(wù)器端的網(wǎng)卡ip
RMI_HOST_DEF=-Djava.rmi.server.hostname=10.165.124.6

在客戶端的jmeter.bat中修改配置指定客戶端的網(wǎng)卡ip
增加配置項(xiàng):set rmi_host=-Djava.rmi.server.hostname=10.165.120.4修改配置項(xiàng):set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %CLASS_UNLOAD% %DDRAW% %rmi_host%

在修改配置后嘗試遠(yuǎn)程啟動(dòng),發(fā)現(xiàn)還是不成功,打開客戶端jmeter.log,發(fā)現(xiàn)客戶端發(fā)送成功;打開服務(wù)器端的jmeter-server.log顯示服務(wù)器連接客戶端不成功,嘗試ping了一下也確實(shí)ping不通,然后網(wǎng)上搜了一下說是因?yàn)榭蛻舳说姆阑饓ψ柚沽耍P(guān)閉客戶端所有防火墻,再次執(zhí)行,測(cè)試成功。

依賴文件報(bào)錯(cuò)的問題
當(dāng)jmeter腳本中需要依賴csv等數(shù)據(jù)文件時(shí),該文件需上傳至服務(wù)器,并需要設(shè)置正確的路徑。
處理利用jmeter實(shí)施監(jiān)控壓測(cè)時(shí)受壓機(jī)的各項(xiàng)性能
操作步驟:
施壓機(jī)上的jmeter/lib/ext中放入下載的插件包 jmeter-plugins-perfmon-2.1.jar

受壓機(jī)上放入ServerAgent-2.2.1

運(yùn)行受壓機(jī)上的ServerAgent

施壓機(jī)上:添加監(jiān)控:

添加參數(shù):
參數(shù)可自定義:
可設(shè)置:

運(yùn)行case,可查看曲線結(jié)果

非GUI圖像操作:
由于非GUI圖像需要先存儲(chǔ)數(shù)據(jù),然后放到GUI圖形界面中查看或處理,而在非GUI中運(yùn)行jmeter的命令時(shí)未提供如何保存性能數(shù)據(jù)的方法,在此可通過shell腳本修改保存性能數(shù)據(jù)的路徑。腳本如下:其中filename為保存jemter壓測(cè)結(jié)果數(shù)據(jù)的文件名,serverFilename為保存jmeter壓測(cè)時(shí)相應(yīng)服務(wù)器性能數(shù)據(jù)的文件名。

!/bin/basharg1=$1arg2=$2arg3="Click"filename="result_"$arg3"$1$2.jtl"serverFilename="serverInfo_"$arg3"$1$2.jtl"echo $arg1 echo $arg2echo $serverFilenamesed -i -e 's|<stringProp name="ThreadGroup.num_threads">.|<stringProp name="ThreadGroup.num_threads">'"$arg1"'</stringProp>|' captchaClick.jmxsed -i -e 's|<stringProp name="filename">.|<stringProp name="filename">'"$serverFilename"'</stringProp>|' captchaClick.jmx../../bin/jmeter -n -t ./captchaClick.jmx -l ./$filename

問題:
受壓機(jī)上的ServerAgent的執(zhí)行腳本直接關(guān)閉時(shí)無法正常關(guān)閉,需通過kill -9命令殺掉進(jìn)程。
##################################################################
http://www.s-uu.com/index.php/2017/05/23/230/
https://www.iyunv.com/thread-385799-1-1.html

##########################################################
1、求和
cat data|awk '{sum+=$1} END {print "Sum = ", sum}'

2、求平均
cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'

3、求最大值
cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'

4、求最小值(min的初始值設(shè)置一個(gè)超大數(shù)即可)
awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'

5、求訪問次數(shù)的Top 10 Resource,可以根據(jù)此進(jìn)行優(yōu)化
cat output/logs/cookie_logs/date +%u/cookie_log|grep -v '172.16'|grep -v '127.0.0.1' |awk -F' ' '{ if(index($1,"219.141.246")!=0) print $2; else print $1 } '|sort|uniq -c|sort -n |tail -n 10
QPS:每秒查詢率(Query Per Second) ,每秒的響應(yīng)請(qǐng)求數(shù),也即是最大吞吐能力。QPS = req/sec = 請(qǐng)求數(shù)/秒QPS統(tǒng)計(jì)方式 [一般使用 http_load 進(jìn)行統(tǒng)計(jì)]QPS = 總請(qǐng)求數(shù) / ( 進(jìn)程總數(shù) * 請(qǐng)求時(shí)間 )QPS: 單個(gè)進(jìn)程每秒請(qǐng)求服務(wù)器的成功次數(shù)
峰值QPS:原理:每天80%的訪問集中在20%的時(shí)間里,這20%時(shí)間叫做峰值時(shí)間公式:( 總PV數(shù) * 80% ) / ( 每天秒數(shù) * 20% ) = 峰值時(shí)間每秒請(qǐng)求數(shù)(QPS)
PV:訪問量即Page View, 即頁面瀏覽量或點(diǎn)擊量,用戶每次刷新即被計(jì)算一次單臺(tái)服務(wù)器每天PV計(jì)算公式1:每天總PV = QPS * 3600 * 6公式2:每天總PV = QPS * 3600 * 8
UV:獨(dú)立訪客即Unique Visitor,訪問您網(wǎng)站的一臺(tái)電腦客戶端為一個(gè)訪客。00:00-24:00內(nèi)相同的客戶端只被計(jì)算一次服務(wù)器數(shù)量:機(jī)器:峰值時(shí)間每秒QPS / 單臺(tái)機(jī)器的QPS = 需要的機(jī)器機(jī)器:ceil( 每天總PV / 單臺(tái)服務(wù)器每天總PV )
并發(fā)數(shù):并發(fā)用戶數(shù)是指系統(tǒng)可以同時(shí)承載的正常使用系統(tǒng)功能的用戶的數(shù)量
吐吞量:吞吐量是指系統(tǒng)在單位時(shí)間內(nèi)處理請(qǐng)求的數(shù)量
響應(yīng)時(shí)間(RT):響應(yīng)時(shí)間是指系統(tǒng)對(duì)請(qǐng)求作出響應(yīng)的時(shí)間
例子:每天300w PV 的在單臺(tái)機(jī)器上,這臺(tái)機(jī)器需要多少Q(mào)PS?答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)如果一臺(tái)機(jī)器的QPS是58,需要幾臺(tái)機(jī)器來支持?答:139 / 58 = 3


  這篇文章將關(guān)注測(cè)試金字塔里的單元測(cè)試層,并探討如何高效地為分布式系統(tǒng)(如微服務(wù))構(gòu)建單元測(cè)試。
  定義測(cè)試邊界
  定義測(cè)試邊界是實(shí)現(xiàn)高效測(cè)試的第一步。測(cè)試的目的是為了驗(yàn)證邊界里“黑盒”的行為是否符合預(yù)期,我們向黑盒輸入數(shù)據(jù),然后驗(yàn)證輸出的正確性。
  在單元測(cè)試?yán)铮诤兄傅氖呛瘮?shù)或者類的方法,目的是單獨(dú)測(cè)試特定代碼塊的行為。為了更好地理解這個(gè)概念,我們以簡單的注冊(cè)功能為例:

  我們可以看到這個(gè)函數(shù)包含了一些輸入和輸出。這個(gè)函數(shù)接受基本的用戶注冊(cè)信息作為輸入?yún)?shù),并返回新創(chuàng)建的用戶ID。
  不過這里也有一些不是很明顯的輸入數(shù)據(jù)。這個(gè)函數(shù)調(diào)用了另個(gè)外部函數(shù):一個(gè)向數(shù)據(jù)庫插入數(shù)據(jù),一個(gè)對(duì)密碼進(jìn)行散列和持久化。在某些情況下,數(shù)據(jù)庫可能會(huì)返回錯(cuò)誤。比如,因?yàn)橛脩裘ㄒ恍詥栴}導(dǎo)致數(shù)據(jù)庫插入失敗,又或者需要通過調(diào)用外部的微服務(wù)進(jìn)行密碼散列,如果網(wǎng)絡(luò)連接出現(xiàn)問題或密碼散列服務(wù)因發(fā)生過載導(dǎo)致服務(wù)超時(shí),那么密碼散列函數(shù)就會(huì)返回錯(cuò)誤。
  為了全面測(cè)試用戶注冊(cè)功能,單元測(cè)試所要做的不僅僅是簡單地傳進(jìn)去不同的輸入?yún)?shù),它還要能夠讓外部依賴項(xiàng)能夠使用這些輸入來驗(yàn)證函數(shù)的行為是否符合預(yù)期。在測(cè)試函數(shù)的錯(cuò)誤處理邏輯時(shí),這點(diǎn)很重要的。
  Stub和Mock
  為了制造各種輸入數(shù)據(jù),需要使用stub,也叫作mock。這個(gè)可以使用依賴注入或方法攪拌(swizzle)來實(shí)現(xiàn)。測(cè)試框架在運(yùn)行被測(cè)試的函數(shù)時(shí)可以確保對(duì)底層依賴項(xiàng)的調(diào)用會(huì)被重定向到stub上:

  我們可以使用stub來達(dá)到各種目的:
  stub可以什么事也不做。這樣可以加快個(gè)別單元測(cè)試的速度,如果后續(xù)有其他單元測(cè)試可用于測(cè)試邊界情況的話就可以這樣做。
  stub可返回任意的值,用于模擬外部函數(shù)的輸出。這在測(cè)試罕見的邊界情況時(shí)會(huì)非常有用,比如有些錯(cuò)誤場(chǎng)景很少會(huì)發(fā)生或者難以重現(xiàn)。
  stub也可以用于捕捉被測(cè)試函數(shù)欲傳給外部函數(shù)的參數(shù),或者把這些參數(shù)記錄下來。這樣就可以驗(yàn)證被測(cè)試函數(shù)需要調(diào)用哪些外部函數(shù)以及需要傳給外部函數(shù)哪些參數(shù)。
  測(cè)試分布式系統(tǒng)需要有一套很好的stub,有了這些stub,單元測(cè)試才能夠在沒有外部服務(wù)的情況下運(yùn)行。下面列出了一些工具,用于創(chuàng)建各種stub。
  Node.js/JavaScript
  sinon.js (提供了stub和間諜功能)
  testdouble.js (主要用于面向?qū)ο驛PI的stub生成器)
  nock (主要用于模擬HTTP請(qǐng)求行為)
  Python****
  mock
  Go
  gomock
  Java
  mockito
  easymock
  單元測(cè)試流程
  單元測(cè)試的目的是為了給開發(fā)人員提供快速驗(yàn)證他們所寫代碼的行為。因?yàn)閷?duì)外部依賴的調(diào)用使用了stub,所以通??梢栽趲酌腌妰?nèi)就可以執(zhí)行數(shù)千個(gè)單元測(cè)試。所以,開發(fā)人員可以把單元測(cè)試加入到他們的開發(fā)工作流當(dāng)中,要么直接集成到他們的IDE里,要么通過終端命令行來運(yùn)行。開發(fā)人員在編寫代碼的同時(shí)頻繁地運(yùn)行單元測(cè)試可以幫助他們及早地發(fā)現(xiàn)代碼中的問題。
  一旦開發(fā)人員養(yǎng)成了這樣的習(xí)慣,那么就可以進(jìn)行測(cè)試驅(qū)動(dòng)開發(fā)了。開發(fā)人員在開發(fā)新特性之前會(huì)先準(zhǔn)備好單元測(cè)試,在新特性被加進(jìn)來之前,測(cè)試總是失敗。在經(jīng)過不斷的測(cè)試和代碼修改之后,一個(gè)完整的功能被開發(fā)出來了,最后再運(yùn)行測(cè)試就能通過。
  單元測(cè)試的作用不應(yīng)局限于代碼開發(fā),它們也應(yīng)該被集成到代碼合并流程里。GitHub支持一些主流持續(xù)集成服務(wù)器的狀態(tài)檢查。一般的流程是這樣的:保護(hù)好“master”分支,不允許開發(fā)人員向該分支提交代碼,而是讓他們把代碼提交到其他分支上。在將代碼合并到master分支的時(shí)候,GitHub要求先通過狀態(tài)檢查。
  Jenkins、CircleCI和TravisCI都提供了狀態(tài)檢查鉤子(hook),它們會(huì)從分支上獲取代碼并運(yùn)行單元測(cè)試。如果通過了,就允許合并代碼,否則就不允許。

  總結(jié)
  單元測(cè)試是測(cè)試工具箱里的一個(gè)非常重要的工具。為了對(duì)分布式系統(tǒng)代碼進(jìn)行全面的單元測(cè)試,有必要利用一些支持stub的測(cè)試框架,用于模擬各種錯(cuò)誤場(chǎng)景或外部依賴的各種響應(yīng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在使用Jmeter進(jìn)行接口的性能測(cè)試時(shí),由于Jmeter 是JAVA應(yīng)用,對(duì)于CPU和內(nèi)存的消耗比較大,所以,當(dāng)需...
    燕京博士閱讀 4,293評(píng)論 0 16
  • 1 Jmeter安裝配置 使用Jmeter前首先要安裝JDK,配置JDK環(huán)境變量。Jmeter不需要安裝,下載后...
    茶小汐閱讀 3,115評(píng)論 0 8
  • 上一節(jié)中,我們了解了jmeter的一此主要元件,那么這些元件如何使用到性能測(cè)試中呢。這一節(jié)創(chuàng)建一個(gè)簡單的測(cè)試計(jì)劃來...
    邵瓊閱讀 848評(píng)論 0 0
  • 原文地址: JMeter best-practices 保持使用最新版本 JMeter被經(jīng)常推薦用來測(cè)試性能,鼓勵(lì)...
    Yuan_Jie閱讀 5,592評(píng)論 4 28
  • 1. MECE法則:匯報(bào)工作時(shí)借助這個(gè)工具分析問題,確保每一項(xiàng)不重疊,不遺漏,這樣員工才能理解到位,執(zhí)行到位。 2...
    耿婷婷GTT閱讀 207評(píng)論 0 0

友情鏈接更多精彩內(nèi)容