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");
    }

}
posted @ 2019-12-22 21:57  ZZZZZZa  阅读(1298)  评论(1编辑  收藏  举报