要實現Web介面測試的自動化有許多方式,比如利用Jmeter、Loadrunner等測試工具都能夠實現介面的自動化測試,我們也可以利用一些開源的框架來實現介面的自動化測試,比如我們現在要說的這個HttpClient,
HttpClient是一個功能豐富支援HTTP協議的客戶端程式設計工具包,具備以下主要功能:
1)封裝實現了所有HTTP的方法,如GET,POST,PUT,HEAD
2)支援redirect,會話保持
3)支援檔案上傳
它是Apache下面開發的,更多資訊大家可以上官網瞅瞅。
既然談到了介面測試,首先我們得明白何為介面測試,簡單一句話啊就是測試外部系統與內部系統或一個系統中不同的功能模組之間的互動點,我們測試的重點是檢查資料的交換、傳遞、控制管理的過程,以及系統間的相互的邏輯依賴關係。
利用HttpClient我們做的介面測試主要是伺服器端與客戶端互動的方式,即瀏覽器或其它客戶端與Web伺服器之間的互動協議,這裡講的主要是HTTP協議,Http協議常用的請求方法有Post和Get,
一般情況下從客戶端傳向伺服器端的用Post,從伺服器端傳出的用Get方法,這些都是一般情況下,測試的過程中還得具體情況具體分析。
順便插一嘴,我們看看採用Get和Post方法來提交表單時的區別,明白了Get和Post的區別以後,接下來我們看HttpClient通過get和post傳引數的時候就不會糊塗了。
隨便寫了一個表單,然後將輸入的資料顯示在一個頁面上,
表單程式碼:
<body> <!-- 根據method是post還是get決定提交表單個協議 --> <form action="LogIn" method="get"> 使用者名稱: <input name="UserName" type="text"><br><br> 密 碼: <input name="PassWord" type="password"><br><br> <input type="submit" value="SubmitBtn"> <input type="reset" value="ResetBtn"> </form> </body>下面的截圖是Get提交的表單,我們可以看到URL中,傳入的資料直接是以鍵值對的形式被寫在URL中傳入到Servlet中的
再看看Post提交的表單URL的格式,傳入的值並沒有直接在URL中展示出來,通過FireBug,我們可以看到傳入的值的儲存地方。
下面我們就來看看通過HttpClient具體實現Get和Post方法,然後通過上面就能理解HttpClient中的Post方法為什麼需要傳入一個NameValuePair
package com.util.httpclient; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.jdom2.Document; import org.jdom2.input.SAXBuilder; import org.json.JSONObject; /** * 1. 通過HttpClient實現Get方法響應 * 2. 通過HttpClient實現Post方法帶引數傳入的響應 */ public class HttpClientTest2 { private CloseableHttpClient httpClient = HttpClients.createDefault(); //定義一個HttpClient private CloseableHttpResponse response = null; //定義response物件 public void getMethod(String url){ HttpGet httpGet = new HttpGet(url); //例項化一個HttpGet物件 RequestConfig config = RequestConfig.custom().setConnectTimeout(2000).setSocketTimeout(2000).build(); //定義一個配置響應時間 httpGet.setConfig(config); //設定配置 try { response = httpClient.execute(httpGet); //獲取到response物件 System.out.println("輸出當前的URI地址: " + httpGet.getURI()); //如果返回值為200,則請求成功,可以通過TestNG做判斷 HttpStatus.SC_OK int status = response.getStatusLine().getStatusCode(); System.out.println("當前請求URL狀態: " + status); //獲取Http Headers資訊,關於header資訊:http://honglu.me/2015/07/13/開發中常用的HTTP-header/ Header[] headers = response.getAllHeaders(); int headerLength = headers.length; for(int i=0; i<headerLength;i++){ System.out.println("Header 內容為: " + headers[i]); } //獲取到請求的內容 HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity,"utf-8"); System.out.println("獲取請求響應的內容為: "+content); } catch (Exception e) { e.printStackTrace(); }finally{ try { httpGet.releaseConnection(); //每次都得關閉響應 response.close(); } catch (IOException e) { e.printStackTrace(); } } } //根據返回的string是XML格式還是json格式的檔案,然後對該檔案進行選擇不同的處理方式 public String postMethod(String url, Map<String, String>params) throws Exception{ CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = null; RequestConfig config = RequestConfig.custom().setConnectTimeout(20000).setSocketTimeout(20000).build(); HttpPost httpPost = new HttpPost(url); httpPost.setConfig(config); List<NameValuePair> list = new ArrayList<NameValuePair>(); Set<String> keySets = params.keySet(); for(String key: keySets){ String value = params.get(key); list.add(new BasicNameValuePair(key, value)); } try { httpPost.setEntity(new UrlEncodedFormEntity(list)); response = client.execute(httpPost); HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity); return content; } catch (Exception e) { throw e; }finally{ httpPost.releaseConnection(); response.close(); } } }