原文:
https://blog.csdn.net/chenleixing/article/details/43418185
1.Jmeter 概要描敘
jmeter 是一款專門用于功能測(cè)試和壓力測(cè)試的輕量級(jí)測(cè)試開(kāi)發(fā)平臺(tái)。多數(shù)情況下是用作壓力測(cè)試,該測(cè)試工具在阿里巴巴有著廣泛的使用,估計(jì)是不要錢吧,哈哈,功能上來(lái)說(shuō),整個(gè)平臺(tái)實(shí)現(xiàn)了許多和互聯(lián)網(wǎng)相關(guān)的網(wǎng)絡(luò)測(cè)試組件,同時(shí)還保留著很強(qiáng)的擴(kuò)展性方便用于一些非標(biāo)準(zhǔn)的測(cè)試場(chǎng)景,讓偉大的程序猿同學(xué)來(lái)告訴它該如何工作。下面我們開(kāi)始。
2.Jmeter 基本界面和組件的概念
現(xiàn)在看到了Jmeter的主界面。下面介紹Jmeter中主要組件的功能和作用, 首先我們看看Jmeter在概念上的組件分類如圖
1.Threads:
這個(gè)組件主要用來(lái)控制Jmeter并發(fā)時(shí)產(chǎn)生線程的數(shù)量,在它的下一級(jí)菜單下只有一個(gè)組件(線程組),可以這么理解每個(gè)線程就是一個(gè)虛擬的用戶。所有的其他類型組件必須是(線程組)節(jié)點(diǎn)的子節(jié)點(diǎn)。
2.配置單元:
和Sample組件一起工作,主要用來(lái)配置Sample如何來(lái)發(fā)起請(qǐng)求訪問(wèn)服務(wù)器,這個(gè)東西的主要特點(diǎn)是可以把一些Sample的共同配置放在一個(gè)元素里面方便管理,配置單元是有作用域的。作用域和樹(shù)的那個(gè)關(guān)系一樣越是上級(jí)節(jié)點(diǎn)的作用域越大,越是接近葉子節(jié)點(diǎn)的
作用域就越小,可以復(fù)寫(xiě)上級(jí)作用域的配置。
3.定時(shí)器 :
這個(gè)主要是用來(lái)調(diào)節(jié)(線程組),控制線程每次運(yùn)行測(cè)試邏輯(比如說(shuō):發(fā)出請(qǐng)求)的時(shí)間間隔。當(dāng)然這個(gè)下面還有很多類型的定時(shí)器,他們主要功能就是調(diào)節(jié)時(shí)間間隔,但個(gè)個(gè)組件之間的策略有很大不同。
4.處理器
前置處理器 和 后置處理器類似一個(gè)HOOK,在測(cè)試執(zhí)行之前和執(zhí)行之后執(zhí)行一些腳本的邏輯。該組件我還沒(méi)有具體使用過(guò),但大致功能就是這樣,非重點(diǎn)組件。
5.Sample :
可能上圖中沒(méi)有出現(xiàn)Sample,需要在(ThreadGroup)上添加才可以,見(jiàn)圖
Sample表示客戶端發(fā)送某種格式或者規(guī)范的請(qǐng)求到服務(wù)端,所以大家看到了各種各樣的Sample,其中有兩個(gè)Http 相關(guān)的。一般用HttpClient功能和效率將更強(qiáng)。
6.斷言:
意思是指對(duì)于Sample完成了請(qǐng)求發(fā)送之后,判斷一下返回的結(jié)果是否滿足期望。
7.監(jiān)聽(tīng)器 :
這個(gè)組件不同于平時(shí)在Web編程的那種監(jiān)聽(tīng)器,他是伴隨著Jemeter測(cè)試的運(yùn)行而從中抓取運(yùn)行期間的數(shù)據(jù)的一個(gè)組件,經(jīng)常使用的是聚合報(bào)告組件,從里面可以統(tǒng)計(jì)到測(cè)試的TPS,響應(yīng)時(shí)間等關(guān)鍵測(cè)試數(shù)據(jù)。
3.實(shí)例操作
首先在TestPlan下面添加一個(gè)ThreadGroup組件,設(shè)置線程組組件各項(xiàng)參數(shù)
關(guān)鍵參數(shù)解釋 :
線程數(shù):最大測(cè)試時(shí)使用的線程數(shù)。
Ramp-Up Period : Jmeter達(dá)到指定最大線程數(shù)的時(shí)間。
循環(huán)次數(shù) : 如果是Forever,線程組中的線程將不間斷的連續(xù)測(cè)試系統(tǒng),當(dāng)然也可以設(shè)置每個(gè)線程測(cè)試的次數(shù),當(dāng)完成了規(guī)定次數(shù)后,該線程將自動(dòng)退出線程組。
調(diào)度器 : 主要用來(lái)指定該測(cè)試的一些時(shí)間信息,比如從幾點(diǎn)到幾點(diǎn)運(yùn)行測(cè)試,如果到了指定時(shí)間測(cè)試沒(méi)有進(jìn)行完成,測(cè)試也會(huì)被停止。
接著在線程組下面添加Sample組件,我們添加一個(gè)HTTP Request HTTPClient組件,設(shè)置屬性如下圖:
最后添加監(jiān)聽(tīng)器組件 :Aggregate Report, 大功告成!
運(yùn)行:
好了,一個(gè)簡(jiǎn)單的壓力測(cè)試?yán)油瓿闪恕4蠹铱梢詮膔eport中間看到一些性能結(jié)果的參數(shù)了。下面我們完成一個(gè)更復(fù)雜的例子。
4.自定義Sample或者協(xié)議完成測(cè)試
問(wèn)題:在某些場(chǎng)景下我們會(huì)發(fā)現(xiàn)Jmeter里面提供的各種Sample不能滿足自己的需求,應(yīng)為這個(gè)世界上的壓力測(cè)試的邏輯本來(lái)就是千變?nèi)f化的,所以這個(gè)時(shí)候我們?nèi)绻约簩?shí)現(xiàn)一套測(cè)試邏輯,這個(gè)時(shí)候需要使用jmeter 的擴(kuò)展性。下面我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)看看如何開(kāi)發(fā)這樣的一個(gè)自定義Sample? 自定Sample的生命周期是怎樣的?
package com.alibaba.stress.load;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class LifecycleJMeterSampleextends AbstractJavaSamplerClient
{
@Override
public Arguments getDefaultParameters() {
System.out.println("Get Parameter name! [getDefaultParameters]");
return super.getDefaultParameters();
}
@Override
public void setupTest(JavaSamplerContext context) {
System.out.println("[setupTest]");
super.setupTest(context);
}
@Override
public void teardownTest(JavaSamplerContext context) {
System.out.println("[teardownTest]");
super.teardownTest(context);
}
@Override
public SampleResult runTest(JavaSamplerContext ctx) {
SampleResult result = new SampleResult();
result.sampleStart();
System.out.println("[runTest]");
result.setSuccessful(true);
result.sampleEnd();
return result;
}
}
package com.alibaba.stress.load;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class LifecycleJMeterSample extends AbstractJavaSamplerClient {
@Override
public Arguments getDefaultParameters() {
System.out.println("Get Parameter name! [getDefaultParameters]");
return super.getDefaultParameters();
}
@Override
public void setupTest(JavaSamplerContext context) {
System.out.println("[setupTest]");
super.setupTest(context);
}
@Override
public void teardownTest(JavaSamplerContext context) {
System.out.println("[teardownTest]");
super.teardownTest(context);
}
@Override
public SampleResult runTest(JavaSamplerContext ctx) {
SampleResult result = new SampleResult();
result.sampleStart();
System.out.println("[runTest]");
result.setSuccessful(true);
result.sampleEnd();
return result;
}
}
其中AbstractJavaSamplerClient是從ApacheJmeter_Java.jar 中獲得。編寫(xiě)的類文件打包xxx.jar, 把這個(gè)Jar放到Jmeter的解壓目錄下的lib/ext下。重新啟動(dòng)jmeter.
一次先加入線程組,和聚合報(bào)告兩個(gè)組件,在聚合報(bào)告組件之前加入一個(gè)新的Sample(Java Sample ), 如圖:
運(yùn)行測(cè)試。可以看到控制臺(tái)的輸出。調(diào)整幾次線程組的線程數(shù)目的控制,我們會(huì)發(fā)現(xiàn)我們的這個(gè)自定義類中的teardowntest 和 setupuptest方法都是正對(duì)線程組中的某一個(gè)線程來(lái)執(zhí)行的,線程組中線程的調(diào)用數(shù)目其實(shí)就是指runtest方法的運(yùn)行次數(shù)。
5.Jmeter的分布式測(cè)試(優(yōu)缺點(diǎn))
下面是分布式測(cè)試的使用方法,即使用一臺(tái)機(jī)器控制多臺(tái)機(jī)器給目標(biāo)機(jī)器產(chǎn)生壓力。由于Linux和Windows上的方法有些不一樣,這里說(shuō)下Linux下是怎么來(lái)配置的。
首先總控的機(jī)器我們叫master,產(chǎn)生壓力的肉雞我們叫JmeterServer,待我們測(cè)試的系統(tǒng)我們叫Target.
第一步:
啟動(dòng)JmeterServer。我們可以找到Jmeter/bin 目錄下的jmeter-server這個(gè)腳本,運(yùn)行即可,當(dāng)然如果你需要調(diào)整這個(gè)測(cè)試負(fù)載產(chǎn)生服務(wù)器的內(nèi)存等性能參數(shù)的話,我們修改這個(gè)腳本jmeter中的內(nèi)存參數(shù)。
第二步 :
修改Master機(jī)器上jmeter/bin目錄下的jmeter.properties文件,修改remote_hosts=localhost:1099,localhost:2010這個(gè)為你自己的JmeterServer的實(shí)際IP,如果有多臺(tái)可以用逗號(hào)分開(kāi)。
第三步 :
啟動(dòng)master jmeter,運(yùn)行測(cè)試腳本的時(shí)候選:運(yùn)行 --> 遠(yuǎn)程運(yùn)行 --> 選擇IP 或者 運(yùn)行所有遠(yuǎn)程。JmeterServer就會(huì)運(yùn)行Master機(jī)器上設(shè)定的運(yùn)行腳本了。
問(wèn)題 : 我在實(shí)際使用中發(fā)現(xiàn)使用這種模式下的Jmeter在Master觀測(cè)實(shí)際測(cè)試結(jié)果,發(fā)現(xiàn)TPS遠(yuǎn)遠(yuǎn)低于使用傳統(tǒng)的一臺(tái)Jmeter來(lái)測(cè)試所能達(dá)到的TPS,我感覺(jué)可能是由于Jmeter這種多機(jī)器協(xié)作中傳遞信息是使用RMI技術(shù),可能這種技術(shù)本身還對(duì)Jmeter的性能產(chǎn)生了影響導(dǎo)致壓力上去的很慢。該問(wèn)題還沒(méi)有得到完全認(rèn)證,所以我現(xiàn)在如果在一臺(tái)機(jī)器測(cè)試產(chǎn)生的壓力不夠的情況下我直接使用多臺(tái)機(jī)器測(cè)把TPS加起來(lái)就是結(jié)果,比較傻,期待大俠指點(diǎn)迷津。