1. 程式人生 > >接口自動化:HttpClient + TestNG + Java(二) - 第一個接口測試:get請求

接口自動化:HttpClient + TestNG + Java(二) - 第一個接口測試:get請求

proto cep 發送 protocol pac head exception 種類 exceptio

在上一篇中,我們搭建好了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請求