一、接口地址
首先介绍了一个接口测试的网址,大家可以该网址测试一些简单的接口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"); } }