Java+TestNG+Maven+Excel+IDEA接口自動化入門(二)Get方法


一、接口地址

首先介紹了一個接口測試的網址,大家可以該網址測試一些簡單的接口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");
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM