接口自動化: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); } }
下一篇我們對當前的測試做一個優化調整和基礎封裝。
接口自動化:HttpClient + TestNG + Java(二) - 第一個接口測試:get請求