如下內容是馬老師培訓的,也本身玩了一下,弄了一下午啊,中間都要放棄了,多點了個workplace,致使怎樣都跑不通,最後,終於跑通了。java
建立Java API請求apache
目的:以百度天氣預報查詢API服務爲例,建立Java API請求範例。json
- API服務信息
參考文檔:https://blog.csdn.net/younghaiqing/article/details/54799303api
接口示例:http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=amMXVSEUGt6yU95x4DQOC2Um瀏覽器
/telematics/v3/weather?output=json&ak=amMXVSEUGt6yU95x4DQOC2Ummaven
百度ak申請地址:http://lbsyun.baidu.com/apiconsole/key工具
接口參數說明:性能
返回結果:開發工具
2.建立Java工程測試
2.1 分析API服務接口
接口示例以下:
http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=yourkey
輸出的數據格式,默認爲xml格式;當output設置爲'json'時,輸出的爲json格式的數據。
經過觀察接口示例,能夠判斷HTTP請求方式爲GET。
——GET方法向URL添加數據。
2.2 寫出API服務請求
(展現BaiduWeather_originalV1.java)
簡述由V1到V2的變化。
3.轉化Jmeter JavaSampler
3.1 建立Maven工程
在Eclipse左側的Package Explore點擊右鍵,依次選擇New -> Other -> Maven -> Maven Project:
這裏要注意,以前建立的API請求類,不是必定要基於Maven工程,普通的Java Project就能夠;建立Maven Project是爲了開發和調試Jmeter JavaSampler。
爲了方便演示,將全部的Java類都建立在同一個Maven Project下。
3.2 添加依賴包
打開Maven工程的POM.xml文件,添加依賴包。咱們須要的依賴包以下:
- Junit:工程建立時已存在;
- Jmeter:核心,做爲JavaSampler請求;有三個組件須要添加:ApacheJMeter_core、ApacheJMeter_java、ApacheJMeter_components;
- log4j-over-slf4j:爲了解決調試階段log4j紅字報錯,非必選,也能夠用其餘依賴包替代。
完成後的POM.xml文件以下:
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.ane56.tester</groupId> - <artifactId>Jmeter_JavaSampler</artifactId> - <version>0.0.1-SNAPSHOT</version> - <packaging>jar</packaging> - - <name>Jmeter_JavaSampler</name> - <url>http://maven.apache.org</url> - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>3.8.1</version> - <scope>test</scope> - </dependency> - - <!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>log4j-over-slf4j</artifactId> - <version>1.7.25</version> - </dependency> - - <dependency> - <groupId>org.apache.jmeter</groupId> - <artifactId>ApacheJMeter_core</artifactId> - <version>3.3</version> - </dependency> - - <dependency> - <groupId>org.apache.jmeter</groupId> - <artifactId>ApacheJMeter_java</artifactId> - <version>3.3</version> - </dependency> - - <dependency> - <groupId>org.apache.jmeter</groupId> - <artifactId>ApacheJMeter_components</artifactId> - <version>3.3</version> - </dependency> - - </dependencies> - </project> |
3.3 理解Java Sampler套路
首先:要實現AbstractJavaSamplerClient類,才能被Jmeter加載;建立名爲「BaiduWeather_JavaSamplerV1」的Java類,添加對AbstractJavaSamplerClient類的實現;完成後以下:
public class BaiduWeather_JavaSamplerV1 extends AbstractJavaSamplerClient {
……
}
其次:(對比LoadRunner腳本的結構:)
- 設置參數:getDefaultParameters,用於設置傳入的參數;
- 初始化(init):setupTest,用於初始化性能測試時的每一個線程;
- 執行迭代(action):runTest,爲性能測試時的線程運行體;
- 完成退出(end):teardownTest,爲測試結束方法,用於結束性能測試中的每一個線程。
補充:調試腳本的main()方法。
3.4 詳解getDefaultParameters()
在getDefaultParameters()代碼段中,添加請求的參數;
做用:當Jmeter讀取此JavaSampler後,可以讀出請求的參數到列表:
注意:
在getDefaultParameters()代碼段中,只須要添加參數項的名字,而沒必要要賦值。一般咱們會在Jmeter腳本中,對請求參數進行參數化。
讀取參數的代碼:
3.5 詳解runTest()格式
- 建立sampleResult:private SampleResult sampleResult;
- 給請求貼標籤:sampleresult.setSampleLabel("Java請求");
- 把請求的信息,寫到Jmeter的【察看結果樹 – 請求】頁面:
sampleresult.setSamplerData(httpUrl);
sampleresult.setDataType(SampleResult.TEXT);
- 發送請求時,開始計時:sampleresult.sampleStart();
- 收到應答後,結束統計響應時間:sampleresult.sampleEnd();
- 標記得到成功的應答,對應http 200:sampleresult.setResponseCodeOK();
- 把收到的應答內容,寫到Jmeter的【察看結果樹 – 響應數據】頁面:
sampleresult.setResponseData("結果是:"+ result, "utf-8");
sampleresult.setDataType(SampleResult.TEXT);
3.6 調試腳本的main()
1)首先要進行參數賦值,不然將直接使用getDefaultParameters()代碼段中設置的參數默認值。建議賦值,與Jmeter的實際工做方式保持一致。
2)調用BaiduWeather_JavaSamplerV1,建立一次測試執行。
4.導出Maven工程
4.1 導出依賴包
選中工程,點擊右鍵,在菜單中選擇Run As -> Run Configuration:
1) 首先在左側的列表中,選擇Maven Build,而後點擊左上方的新建圖標;
2) 輸入操做的名字,在本例中是:Jmeter_JavaSampler_exportDependency;
3) 定位當前操做的工程路徑;能夠點擊Workspace…的按鈕來定位;
4) 輸入操做的具體命令:在本例中是爲了導出依賴:dependency:copy-dependencies;
5) 檢查Maven Runtime的信息是否正確;
6) 點擊Apply按鈕完成保存;
7) 點擊Run按鈕、進行依賴包的導出。
等待完成後,到工程所在的路徑\target\dependency目錄,查看的依賴jar包:
4.2 導出測試類
導出測試類有兩種方式:
1)Maven install命令:該命令會在工程所在的路徑\target文件夾下,生成與工程同名的jar文件,如Jmeter_JavaSampler-0.0.1-SNAPSHOT.jar。不推薦這樣的方式,由於這將導出工程中全部的類,不夠精確。
2)直接導出單個接口測試類,注意是符合Jmeter JavaSampler的那個類。具體方法是:在Eclipse左側的Package Explore選中該類,點擊右鍵,選擇Export:
輸入要導出JAR file的路徑和名稱,點擊Finish按鈕,完成導出操做。
- 在Jmeter建立測試計劃
5.1 準備工做
首先,要將導出的依賴包,拷貝到jmeter\lib目錄下。推薦將整個dependency文件夾拷過來,而後再引入到測試計劃。這樣的好處在於大量的依賴包中存在與原有jmeter\lib目錄下的同名或不一樣版本的干擾。以下圖:
而後,將單獨導出的接口測試類的jar文件複製到jmeter\lib\ext目錄下,以下圖:
這裏的jar文件有個問題,先賣個關子,在後面分析解決思路。
完成後,進入下一環節。
5.2 建立測試計劃
啓動Jmeter,在測試計劃的主窗口的靠下位置,添加依賴到classpath中;經過點擊瀏覽按鈕,定位到依賴包的文件夾,全選全部的jar文件,點擊打開按鈕:
第一步完成後,添加線程組,並添加Java請求;
在類名稱的下拉菜單中,找到咱們開發的測試類BaiduWeather_JavaSamplerV1:
5.3 調試腳本
填寫請求參數,填充本來爲空的參數、缺省值能夠替換也可保留:
添加一個監聽器 – 察看結果樹,以便查看腳本調試的結果:
點擊剛剛添加的察看結果樹,將主畫面切換到結果樹:
在調試前,須要保存腳本成.jmx文件。點擊保存按鈕,將腳本存放到合適的位置。
點擊上方工具條內的啓動按鈕,查看測試結果:
Text區域,每執行一次請求,就自動增長一條記錄到尾部。
右側的區域,有三個Tab頁,方便查看測試請求和響應。咱們分別查看一下,注意判斷響應數據是否爲正確的。
請求頁面:
沒問題,確實與預期的同樣。
再看響應數據頁面:
顯示error -3, No result available,出錯了。
5.4 解決問題
解決步驟:
先將請求內容,放到瀏覽器中,查看是否能得到正確的天氣預報信息:
成功了,說明API 服務沒問題,請求內容也沒問題。是哪裏不對呢?
首先想到的,是否由於百度天氣預報API對不是瀏覽器訪問的Request作了屏蔽?相似與反爬蟲策略。那就須要在請求時,補全HTTP Header信息。
那麼HTTP Header信息哪裏能查看?
這裏能夠利用Chrome瀏覽器的開發工具,按F12後,刷新一下,瀏覽器會自動錄製整個請求和應答。
這樣就能捕獲到HTTP Header信息,將它們逐條複製下來。在Jmeter的線程組下面添加一個配置元件 - HTTP頭信息管理,再逐條添加進去。
再次執行腳本,錯誤依舊如此。
思路錯了嗎?其實沒有,方法是正確的,再想一想。
正確的方法以下:
仔細查看一下Request RUL,以下圖:
和瀏覽器的地址欄中的內容比較一下,「location=上海」在Request中,被替換成了「location=%E4%B8%8A%E6%B5%B7」。
這是漢字沒有轉碼所致使的:
咱們從Jmeter發出的漢字不是URL編碼的格式。
再想一想,咱們在Eclipse調試接口腳本的時候,應答信息和瀏覽器中顯示的內容是同樣的;這意味着從Eclipse發出的Request,已經被自動轉碼了,有點坑啊!
所以,咱們須要對城市名稱的漢字進行轉碼,並且要在接口請求的代碼裏完成。
爲完成轉碼功能,須要再增長一個依賴:
import java.io.UnsupportedEncodingException;
修改後,爲以下圖所示:
這裏增長了一個轉碼的步驟,將接收到的城市名稱從漢字轉碼爲URL格式的。執行一下看看效果:
成功了!
從新將接口測試類導出成jar文件,刪除先前存在於jmeter\lib\ext下的同名文件;再拷貝一遍。Jmeter也要重啓纔會刷新Java請求中的類列表。
重啓後,打開以前保存的腳本,再次運行調試;執行成功。