介面自動化:HttpClient + TestNG + Java(二) - 第一個介面測試:get請求
在上一篇中,我們搭建好了HttpClient + TestNG + Java的自動化介面測試環境,這一篇我們就趕緊開始編寫我們的第一個介面測試用例。
本篇會對問題解決的思路進行更詳盡的闡述。
2.1 確定被測介面
首先一個現實的問題,我們要有一個待測介面來驗證我們自動化方案的可行性。
我們可以選擇在自己的本地去部署一套待測介面,當然也可以選擇公網上的介面去進行測試,這裡我們選擇後者。
我選定的是apishop這個站點:https://www.apishop.net/
這個站點提供非常多,種類齊全的對外開放的介面,其實主要是給其他網站提供各種介面服務的,比如我們接下來要用到的手機號歸屬地查詢介面。當然用他來實現我們的測試也完全沒問題。
從上圖可以看到,我們可以對這個介面進行符合標準格式的請求,紅框中給出的就是我們要去用自動化驗證的反饋資訊。
反饋資訊可以劃分為三個部分:
- 狀態返回碼
- 反饋資訊主體
- 反饋頭部資訊
2.2 建立傳送介面的測試類
首先我們來考慮,在我們的專案中寫這麼個類,讓他能夠實現傳送請求,接收反饋,驗證反饋的功能。暫時我們只考慮傳送GET方法的請求。
2.2.1 建立所有變數
在我們的第一個測試類中,我們需要使用httpClient來發送請求,接收反饋,然後對反饋資訊做一個儲存處理和驗證。
在我們的專案src/main/java目錄下新建一個包名為:com.test.client,在包下新建一個testGetAPI.java類,
首先我們考慮需要如下變數:
String url; CloseableHttpClient httpClient; HttpGet httpGet; CloseableHttpResponse httpResponse; String responseBody; int responseCode; Header[] responseHeader;
- url是我們去進行get請求的地址;
- httpClient是用來發送http請求的HttpClient例項;
- httpGet是get請求的一個例項;
- httpResponse用來儲存我們接收到的反饋;
- responseBody用來儲存反饋的主體資訊;
- responseCode用來儲存反饋的狀態碼;
- responseHeader用來儲存反饋的頭部資訊;
將以上變數建立。
2.2.2 實現請求傳送和反饋接收
接下來實現請求的傳送和反饋接收。
首先URL配置如下(部分apikey出於安全原因隱去):
String url = "https://api.apishop.net/communication/phone/getLocationByPhoneNum?apiKey=nMke6NK29c40*********3eec8aa0808389b16c4&phoneNum=1861195236";
接下來用三行程式碼來發送請求,接收反饋:
//建立一個httpClient的例項
httpClient = HttpClients.createDefault();
//建立一個httpGet請求例項 httpGet = new HttpGet(url);
//使用httpClient例項傳送剛建立的get請求,並用httpResponse將反饋接收 httpResponse = httpClient.execute(httpGet);
其實到這一步我們的主體工作已經做完了,接下來要對接收到的反饋進行一個處理、分析和驗證。
我們可以想到,要從httpResponse中提取出上文提到的header,body,code三部分資訊。處理程式碼如下:
//從反饋中提取出狀態碼
responseCode = httpResponse.getStatusLine().getStatusCode();
//從反饋中提取出反饋主體 responseBody = httpResponse.getEntity();
//從反饋中提取出所有頭部資訊 responseHeader = httpResponse.getAllHeaders();
2.2.3 結果驗證和處理
接下來用systemOut的方式,將我們提取到這三部分資訊一一打印出來,得出的結果如下:
This is the response code:200
This is the response body:ResponseEntityProxy{[Content-Type: text/plain; charset=utf-8,Content-Length: 159,Chunked: false]}
This is the response header:[Lorg.apache.http.Header;@4a9789ee
這裡的問題在於,我們發現反饋資訊主體和頭部格式都不是我們想要的,可驗證的格式,所以我們需要以下程式碼做一些處理:
//用EntityUtils工具類將反饋主體處理為字串形式
String resnponseBodyString = EntityUtils.toString(responseBody,"utf-8");
//用雜湊圖將反饋頭資訊以鍵值對形式儲存 HashMap<String,String> hashMap = new HashMap<String,String>(); for(Header header:responseHeader){ hashMap.put(header.getName(), header.getValue()); }
然後再將處理後的變數列印,得到:
This is the response code:200
This is the response body:{"statusCode":"000000","desc":"查詢成功","result":{"province":"北京","city":"北京","areacode":"010","zip":"100000","company":"中國聯通","card":""}}
This is the response header in hash{Access-Control-Allow-Origin=*, Date=Tue, 20 Nov 2018 03:40:43 GMT, Content-Length=159, Connection=keep-alive, Content-Type=text/plain; charset=utf-8}
可以看到,到這個程度,我們已經可以去驗證反饋的正確性了。當然要注意到response body也就是反饋主體還不是以json格式呈現的,我們可以進一步對他做json格式處理,這個放到後續內容。
暫時我們還沒有自動驗證和斷言,但是通過肉眼比對,我們已經能夠驗證整個請求過程的正確性。
最終我們的整體程式碼如下:
import java.io.IOException; import java.util.HashMap; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class TestGet { public static void main(String[] args) throws ClientProtocolException, IOException { String url = "https://api.apishop.net/communication/phone/getLocationByPhoneNum?apiKey=nMke6NK29c40********c8aa0808389b16c4&phoneNum=1861195236"; CloseableHttpClient httpClient; HttpGet httpGet; CloseableHttpResponse httpResponse; HttpEntity responseBody; int responseCode; Header[] responseHeader; httpClient = HttpClients.createDefault(); httpGet = new HttpGet(url); httpResponse = httpClient.execute(httpGet); responseCode = httpResponse.getStatusLine().getStatusCode(); responseBody = httpResponse.getEntity(); responseHeader = httpResponse.getAllHeaders(); String responseBodyString = EntityUtils.toString(responseBody,"utf-8"); HashMap<String,String> hashMap = new HashMap<String,String>(); for(Header header:responseHeader){ hashMap.put(header.getName(), header.getValue()); } System.out.println("This is the response code:" + responseCode); System.out.println("This is the response body:" + responseBodyString); System.out.println("This is the response header in hash" + hashMap); } }
下一篇我們對當前的測試做一個優化調整和基礎封裝。