zoukankan      html  css  js  c++  java
  • 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");
        }
    
    }
  • 相关阅读:
    Tree(未解决。。。)
    Fractal(递归,好题)
    Scrambled Polygon(凸多边形,斜率)
    ZYB's Game(博弈)
    Dancing Stars on Me(判断正多边形)
    Hidden String(深搜)
    1043
    TEX Quotes(字符串,水)
    Candy Sharing Game(模拟搜索)
    hpu校赛--雪人的高度(离散化线段树)
  • 原文地址:https://www.cnblogs.com/zzcsza/p/12081285.html
Copyright © 2011-2022 走看看