一、接口地址
首先介紹了一個接口測試的網址,大家可以該網址測試一些簡單的接口https://reqres.in
通過這個圖,我們能夠獲取這些信息
1)網站host地址:https://reqres.in/
2)用戶展示請求方式是: Get
3)接口的url 是: /api/users
4)接口的響應狀態碼是200,還可以看到響應body的JSON內容。
二、設計配置文件
在resources下新建一個config.properties文件,文件內容如下。
然后在src/main/java下新建一個包:com.qa.base,新建一個TestBase.java,這個類作為所有接口請求測試的父類,都需要繼承這個父類,目前我們就寫一個構造方法,實現加載讀取properties文件。
TestBase.java 代碼如下:
package com.qa.base; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; /* *用於讀取文件並定於狀態碼 */ public class TestBase { public Properties prop;//對象 public int RESPNSE_STATUS_CODE_200 = 200; public int RESPNSE_STATUS_CODE_201 = 201; public int RESPNSE_STATUS_CODE_404 = 404; public int RESPNSE_STATUS_CODE_500 = 500; public TestBase(){ prop=new Properties(); try { //System.out.println(System.getProperty("user.dir"));//獲取當前項目路徑 FileInputStream fis=new FileInputStream(System.getProperty("user.dir")+ "/src/main/resources/config.properties"); try { prop.load(fis); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } }
三、Get請求方法代碼實現
新建一個包:com.qa.util,存放我們的工具類,然后新建一個RestClient.java文件,下面是具體代碼,實現了get請求,和得到相應狀態碼和響應頭信息,以及響應主體的json內容。
package com.qa.util; 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.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class RestClient { //1.Get請求方法 public CloseableHttpResponse get(String url) throws IOException { //創建一個可以關閉的HttpClient對象 CloseableHttpClient httpClient = HttpClients.createDefault(); //創建一個HttpGet的請求對象 HttpGet httpget = new HttpGet(url); //執行請求,相當於postman上的發送按鈕,然后賦值給HttpResponse對象接收 CloseableHttpResponse httpResponse = httpClient.execute(httpget); return httpResponse; } //2.Get方法(帶請求頭信息) public CloseableHttpResponse get(String url, HashMap<String, String> headermap) throws IOException { //創建一個可關閉的HttpClient對象 CloseableHttpClient httpclient=HttpClients.createDefault(); //創建一個HttpGet的請求對象 HttpGet httpget=new HttpGet(url); //加載請求頭到httpget對象 for(Map.Entry<String,String> entry:headermap.entrySet()){ httpget.addHeader(entry.getKey(),entry.getValue()); } //執行請求,相當於postman上點擊發送按鈕,然后賦值給HttpResonse對象接收 CloseableHttpResponse httpResponse=httpclient.execute(httpget); return httpResponse; }
四、Josn解析工具
上面是一個標准的json的響應內容截圖,第一個紅圈”per_page”是一個json對象,我們可以根據”per_page”來找到對應值是3,而第二個紅圈“data”是一個JSON數組,而不是對象,不能直接去拿到里面值,需要遍歷數組。 下面,我們寫一個JSON解析的工具方法類,如果是像第一個紅圈的JSON對象,我們直接返回對應的值,如果是需要解析類似data數組里面的json對象的值,這里我們構造方法默認解析數組第一個元素的內容。在src/main/java下新建一個包:com.qa.util,然后在新包下創建一個TestUtil.java類。
package com.qa.util; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class JsonUtil { /** * @param responseJson ,這個變量是拿到響應字符串通過json轉換成json對象 * @param jpath,這個jpath指的是用戶想要查詢json對象的值的路徑寫法 * jpath寫法舉例:1) per_page 2)data[1]/first_name ,data是一個json數組,[1]表示索引 * /first_name 表示data數組下某一個元素下的json對象的名稱為first_name * @return,返回first_name這個json對象名稱對應的值 */ //json解析方法 public static String getValueByJPath(JSONObject responseJson,String jpath){ Object obj=responseJson; for(String s:jpath.split("/")){ if(!s.isEmpty()){ if(!(s.contains("[")||s.contains("]"))){ obj=((JSONObject)obj).get(s); }else if(s.contains("[")||s.contains("]")){ obj=((JSONArray)((JSONObject)obj).get(s.split("\\[")[0])) .get(Integer.parseInt(s.split("\\[")[1].replaceAll("]", ""))); } } } return obj.toString(); } }
簡單解釋下上面的代碼,主要是查詢兩種json對象的的值,第一種最簡單的,這個json對象在整個json串的第一層,例如上面截圖中的per_page,這個per_page就是通過jpath這個參數傳入,返回的結果就是3. 第二種jpath的查詢,例如我想查詢data下第一個用戶信息里面的first_name的值,這個時候jpath的寫法就是data[0]/first_name,查詢結果應該是Eve。
五、TestNG用例測試Get方法
下面,我們TestNG測試用例代碼如下
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.qa.base.TestBase; import com.qa.util.RestClient; import com.qa.util.JsonUtil; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.util.EntityUtils; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; import java.util.*; public class GetDemo extends TestBase { TestBase testBase; String host; String url; RestClient restClient; CloseableHttpResponse closeableHttpResponse; @BeforeClass public void setup() { testBase = new TestBase(); host = prop.getProperty("GETPOST"); url = host + "api/users"; } //get方法帶請求頭 @Test(description = "get請求成功") public void getAPITest() throws IOException { restClient = new RestClient(); restClient.get(url); HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("Content-Type", "application/json"); closeableHttpResponse = restClient.get(url, hashMap); //斷言狀態碼 int statusCode = closeableHttpResponse.getStatusLine().getStatusCode(); System.out.println(statusCode); Assert.assertEquals(statusCode, RESPNSE_STATUS_CODE_200, "狀態碼不是200"); //把響應內容存儲在字符串對象 String responseString = EntityUtils.toString(closeableHttpResponse.getEntity(), "UTF-8"); //System.out.println(responseString); JSONObject responseJson = JSON.parseObject(responseString); //json內容解析 String s = JsonUtil.getValueByJPath(responseJson, "data[0]/first_name"); //斷言第一個名字是否是"George" Assert.assertEquals(s, "George", "fiset_name is not George"); } }