Jmeter是一個很是好用的壓力測試工具。 Jmeter用來作輕量級的壓力測試,很是合適,只須要十幾分鍾,就能把壓力測試須要的腳本寫好。服務器
顧名思義:壓力測試,就是 被測試的系統,在必定的訪問壓力下,看程序運行是否穩定/服務器運行是否穩定(資源佔用狀況)dom
好比: 2000個用戶同時到一個購物網站購物,這些用戶打開頁面的速度是否會變慢,或者網站是否會奔潰工具
作壓力測試,通常要使用工具, 人工是沒辦法作的。 最經常使用的工具是LoadRunner, 可是LoadRunner畢竟是收費軟件,並且使用上也比較複雜。 如今愈來愈多的人開始使用Jmeter來作壓力測試。 免費, 並且使用上很是簡單。oop
1. 寫腳本 或者錄製腳本測試
2. 使用用戶自定義參數網站
3. 場景設計ui
4. 使用控制器,來控制 模擬多少用戶。url
5. 使用監聽器, 查看測試結果spa
本文舉的實例是: 在一臺電腦用Jmeter模擬200個用戶,同時去使用bing搜索不一樣的關鍵字, 查看頁面返回的時間是否在正常範圍內。線程
首先咱們把測試須要用到的2個參數放在txt文件中,
新建一個data.txt文件,輸入些數據, 一行有兩個數據,用逗號分隔。
啓動Jmeter, 先添加一個Thread Group, 而後添加一個CSV Data Set Config (Add -> Config Element -> CSV Data Set Config)
咱們添加http 請求,發送get 到 http://cn.bing.com/search?q=博客園+小坦克
選擇Thread Group 右鍵 (Add ->Sampler -> HTTP Request), 須要填的數據以下:
選中Thread Group
Number of Threads(users): 一個用戶佔一個線程, 200個線程就是模擬200個用戶
Ramp-Up Period(in seconds): 設置線程須要多長時間所有啓動。若是線程數爲200 ,準備時長爲10 ,那麼須要1秒鐘啓動20個線程。也就是每秒鐘啓動20個線程。
Loop Count: 每一個線程發送請求的次數。若是線程數爲200 ,循環次數爲10 ,那麼每一個線程發送10次請求。總請求數爲200*10=2000 。若是勾選了「永遠」,那麼全部線程會一直髮送請求,直到選擇中止運行腳本。
選中Thread Group 右鍵(Add -> Listener -> Summary Report)
到目前爲止, 腳本就全寫好了, 咱們來運行下, 如何看下測試的結果
附:
1.loadTest.jmx
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.6" jmeter="2.11 r1554548">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">10</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">200</stringProp>
<stringProp name="ThreadGroup.ramp_time">10</stringProp>
<longProp name="ThreadGroup.start_time">1415933614000</longProp>
<longProp name="ThreadGroup.end_time">1415933614000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV Data Set Config" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf-8</stringProp>
<stringProp name="filename">c:\data.txt</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">shareMode.all</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">boke,user</stringProp>
</CSVDataSet>
<hashTree/>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">cn.bing.com</stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol">http</stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">/search?q=${boke}+${user}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSamplerProxy>
<hashTree/>
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>false</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
2.data.txt
博客園,小坦克 博客園,Fish 博客園,Fiddler 博客園,HTTP