Java接口自动化测试实战001----get、post方法实现与封装

一、接口测试

1、接口测试流程

  • 根据接口文档编写测试用例
  • 准备测试数据
  • 准备工具(测试工具or接口测试代码)
  • 填写接口信息(接口地址、请求方式等)
  • 准备请求头数据(如果有必要,比如:cookies,Content-Type等)
  • 发起请求,获取接口的相应信息(状态码、响应报文、或者某些特殊的响应头数据)
  • 根据报文判断实际与预期结果是否一致

2、HTTP请求

   HTTP请求表示的是从客户端发送到服务器端的请求,HttpGet和HttpPost都是HttpRequest的实现类,属于子类对象,其关系如下图所示:

 

3、HTTP响应

   HTTP响应表示的是从服务器到客户端的响应,其使用方法有以下几种:

  • 从响应对象中获取返回的数据:getEntity()
  • 从响应对象中获取响应状态码:getStatusLine().getStatusCode()
  • 从响应对象中获取响应头信息:getAllHeaders()

二、接口自动化测试之Get请求

1、get请求的特点

  • 以get方式提交请求到服务器
  • Get参数不是封装在请求体当中的(由没有setEntity方法可以看出来)
  • 数据长度是有限制的
  • 支持get提交的接口一般都是从服务器上拿下来数据

2、HttpGet请求

     HttpGet是模拟实现Http协议下get请求的java类,它关键的api函数有以下几个:

  • 构造函数:HttpGet httpGet=new HttpGet(url);创建一个get对象,以get方式提交接口请求
  • 组合拼接参数:URLEncodedUtils.format(params,”utf-8”);----UrlEncodeFormEntity以表单的形式提交数据.

     注意:如果以get提交的接口请求有需要传参数,参数通常直接拼接在url后面的。

3、HttpGet请求代码实现

(1)实现思想

  •   准备测试地址和测试数据,并拼接
  •   创建HttpGet对象,指定接口请求方式: HttpGet httpGet=new HttpGet(url);
  •   设置请求头信息:httpGet.setHeader(String,String);
  •   创建一个可关闭的HttpClient对象:HttpClient httpclient=HttpClients.createDefault();
  •   执行请求获取响应信息:HttpResponse httpresponse=httpclient.execute(get);
  •   获取响应的状态码:int code=httpresponse.getStatusLine().getStatusCode();
  •   获取响应的报文:String result=EntityUtils.toString((httpresponse.getEntity()));

(2)实现代码

   根据实现思想,编写测试代码,如下:

 1 package testInterface.test_V1;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.http.HttpResponse;
 6 import org.apache.http.client.HttpClient;
 7 import org.apache.http.client.methods.HttpGet;
 8 import org.apache.http.impl.client.HttpClients;
 9 import org.apache.http.util.EntityUtils;
10 
11 public class doGet {
12 
13     public static void main(String[] args) {
14     //http://127.0.0.1:8080/api/pay/getAllBaseWatercategory?pageNum=1&pageSize=10&name=
15     //1、准备URL和测试数据,并拼接成请求的测试地址
16      String  url="http://127.0.0.1:8080/api/pay/getAllBaseWatercategory";
17      String para="pageNum=1&pageSize=10&name=";     //测试数据
18      url=url+"?"+para;    //拼接请求地址
19      
20      //2、创建HttpGet对象,指定接口提交的方式
21      HttpGet get =new HttpGet(url);
22      
23      //3、设置请求头
24      get.setHeader("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjMsImxvZ2luVG9rZW4iOiI3YTc3MDYwYy1jMDkzLTRhYzMtYTFlMC04MGJiNGZmYjIyZmMiLCJleHAiOjE1OTM3MDUyNTB9.k2WvdxXOE-XVNdl3zk-Ee8oxDR4Licj5lSC8rhFN2xSPC1lxPDqYkoLnBGfPEB56Aic7_2b100QTmmoByUyfmA");
25      
26      //4、创建一个可关闭的HttpClient对象
27      HttpClient httpclient=HttpClients.createDefault();
28      try {
29      //5、执行post请求,获取响应信息(状态码、响应报文、响应头等)。相当于jmeter上点击运行按钮,然后赋值给HttpResponse对象接收
30         HttpResponse httpresponse=httpclient.execute(get);
31         
32      //6、获取响应状态码和响应报文,并输出
33         int code=httpresponse.getStatusLine().getStatusCode();
34         System.out.print(code);
35         String result=EntityUtils.toString((httpresponse.getEntity()));
36         System.out.print(result);
37     } catch (Exception e) {
38         e.printStackTrace();
39     } 
40  }
41 
42 }

三、接口自动化测试之Post请求

1、Post提交的特点

  • 以post方式提交请求到服务器
  • 参数一般是封装到请求体中提交的
  • 参数长度没有长度限制
  • 支持post方式提交的接口往往是把数据提交到服务器上去

2、HttpPost请求

  • HttpGet是模拟实现Http协议下post请求的java类,它关键的api函数有以下几个:
  • 构造函数:HttpPost httpPost=new HttpPost(url);创建一个post对象,以post方式提交接口请求
  • 设置参数到请求体:post.setEntity(entity,charset);通过此方法将接口参数设置到请求体中。 

3、HttpPost请求具体实现

(1)实现思想

  •   准备测试地址和测试数据
  •   使用BasicNameValuePair封装post请求中的参数名称和值: 
  • List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();
  • parameters.add(new BasicNameValuePair("mobile",mobile));
  •   把请求参数放到请求体中--------定义请求的实体,并把参数传进来,定义编码格式为utf-8:post.setEntity(new UrlEncodedFormEntity(parameters,"utf-8"));     
  •   创建HttpPost对象,指定接口请求方式: HttpPost httpPost=new HttpPost(url);
  •   设置请求头信息:httpGet.setHeader(String,String);
  •   创建一个可关闭的HttpClient对象:HttpClient httpclient=HttpClients.createDefault();
  •   执行请求获取响应信息:HttpResponse httpresponse=httpclient.execute(post);
  •   获取响应的状态码:int code=httpresponse.getStatusLine().getStatusCode();
  •   获取响应的报文:String result=EntityUtils.toString((httpresponse.getEntity()));

(2)实现代码

根据实现思想,编写测试代码,如下:

 1 package testInterface.test_V1;
 2 
 3 
 4 import java.io.IOException;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import org.apache.http.HttpResponse;
 9 import org.apache.http.client.ClientProtocolException;
10 import org.apache.http.client.HttpClient;
11 import org.apache.http.client.entity.UrlEncodedFormEntity;
12 import org.apache.http.client.methods.HttpPost;
13 import org.apache.http.impl.client.HttpClients;
14 import org.apache.http.message.BasicNameValuePair;
15 import org.apache.http.util.EntityUtils;
16 
17 public class doPost {
18     public static void  main(String[] args) throws ClientProtocolException, IOException {
19         //1、准备测试请求的地址和参数(测试数据)
20         String url="http://127.0.0.1:8080/api/user/smsCodeLogin";
21         String mobile="13265537610";
22         String smsCode="9999";
23         
24         //2、使用BasicNameValuePair封装post请求中的参数名称和值
25         List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();
26         parameters.add(new BasicNameValuePair("mobile",mobile));
27         parameters.add(new BasicNameValuePair("smsCode",smsCode));
28         
29         //3、创建HttpPost对象,指定接口提交的方式
30         HttpPost post=new HttpPost(url);
31         
32         //4、把请求参数放到请求体中--------定义请求的实体,并把参数传进来,定义编码格式为utf-8
33         post.setEntity(new UrlEncodedFormEntity(parameters,"utf-8"));
34         
35          //5、创建一个可关闭的HttpClient对象
36         HttpClient httpclient=HttpClients.createDefault();
37         
38          //6、执行post请求,获取响应信息(状态码、响应报文、响应头等)。相当于jmeter上点击运行按钮,然后赋值给HttpResponse对象接收
39         HttpResponse httpresponse=httpclient.execute(post);
40         
41         //7、获取响应状态码和响应报文,并输出
42         int code=httpresponse.getStatusLine().getStatusCode();
43         System.out.print(code);
44         String result=EntityUtils.toString((httpresponse.getEntity()));
45         System.out.print(result);
48     }
49 }

四、封装之拆分get、 post请求

1、拆分getDemo类

(1)实现步骤

  • 主函数中处理url和参数,将参数封装到map集合中,调用doGet方法传入url和参数;
  • 新建doGet方法,处理map中的参数拼接到地址中,之后执行请求,步骤与之前一样。

(2)实现代码如下:

拆分getDemo类为主函数调用doGet方法的形式,如下所示:

 1 public class getDemo {
 2 
 3     public static void main(String[] args) {
 4           //http://114.135.61.188:58088/api/pay/getAllBaseWatercategory?pageNum=1&pageSize=10&name=
 5         //1、准备URL和测试数据,并拼接成请求的测试地址
 6          String  url="http://114.135.61.188:58088/api/pay/getAllBaseWatercategory";
 7          String para="pageNum=1&pageSize=10&name=";     //测试数据
 8          String pageNum="1";
 9          String pageSize="10";
10          String name="";
11          Map<String,String> parameter=new HashMap<String,String>();
12          parameter.put("pageNum",pageNum);
13          parameter.put("pageSize",pageSize);
14          parameter.put("name",name);
15 
16          doGet(url,parameter);
17     }
18         
19     public static void doGet(String url,Map<String,String> parameter) {
20         //拼接URL
21         Set<String>  keys=parameter.keySet();
22         int mark=1;  //定义一个标志位
23         for (String para : keys) {
24             if(mark==1) {
25                 url=url+"?"+para+"="+parameter.get(para);
26             }else {
27                 url=url+"&"+para+"="+parameter.get(para);
28             }
29             mark++;
30         }
31         System.out.print(url);
32      //2、创建HttpGet对象,指定接口提交的方式
33      HttpGet get =new HttpGet(url);
34      
35      //3、设置请求头
36      get.setHeader("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjMsImxvZ2luVG9rZW4iOiI3YTc3MDYwYy1jMDkzLTRhYzMtYTFlMC04MGJiNGZmYjIyZmMiLCJleHAiOjE1OTM3MDUyNTB9.k2WvdxXOE-XVNdl3zk-Ee8oxDR4Licj5lSC8rhFN2xSPC1lxPDqYkoLnBGfPEB56Aic7_2b100QTmmoByUyfmA");
37      
38      //4、创建一个可关闭的HttpClient对象
39      HttpClient httpclient=HttpClients.createDefault();
40      try {
41      //5、执行post请求,获取响应信息(状态码、响应报文、响应头等)。相当于jmeter上点击运行按钮,然后赋值给HttpResponse对象接收
42         HttpResponse httpresponse=httpclient.execute(get);
43         
44      //6、获取响应状态码和响应报文,并输出
45         int code=httpresponse.getStatusLine().getStatusCode();
46         System.out.print(code);
47         String result=EntityUtils.toString((httpresponse.getEntity()));
48         System.out.print(result);
49     } catch (Exception e) {
50         e.printStackTrace();
51     } 
52  }
53 
54 }

2、拆分postDemo类

(1)实现步骤

  • 主函数中处理url和参数,将参数封装到map集合中,调用doGet方法传入url和参数;
  • 新建doPost方法,处理map中的参数并封装到请求中,之后执行请求,步骤与之前一样

(2)实现代码如下

拆分postDemo类为主函数调用doPost方法的形式,如下所示:

 1 public class postDemo {
 2     public static void  main(String[] args) throws ClientProtocolException, IOException {
 3         //1、准备测试请求的地址和参数(测试数据)
 4         String url="http://114.135.61.188:58088/api/user/smsCodeLogin";
 5         String mobile="18800000000";
 6         String smsCode="9999";
 7          Map<String,String> parameter=new HashMap<String,String>();
 8          parameter.put("mobile",mobile);
 9          parameter.put("smsCode",smsCode);
10          doPost(url,parameter);
11 
12      }    
13     public static void doPost(String url, Map<String,String> parameter) throws ClientProtocolException, IOException {
14        
15         //2、使用BasicNameValuePair封装post请求中的参数名称和值
16         List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();
17         Set<String> keys=parameter.keySet();
18         for (String para : keys) {
19             parameters.add(new BasicNameValuePair(para,parameter.get(para)));
20         }
21         
22         //3、创建HttpPost对象,指定接口提交的方式
23         HttpPost post=new HttpPost(url);
24         
25         //4、把请求参数放到请求体中--------定义请求的实体,并把参数传进来,定义编码格式为utf-8
26         post.setEntity(new UrlEncodedFormEntity(parameters,"utf-8"));
27         
28          //5、创建一个可关闭的HttpClient对象
29         HttpClient httpclient=HttpClients.createDefault();
30         
31          //6、执行post请求,获取响应信息(状态码、响应报文、响应头等)。相当于jmeter上点击运行按钮,然后赋值给HttpResponse对象接收
32         HttpResponse httpresponse=httpclient.execute(post);
33         
34         //7、获取响应状态码和响应报文,并输出
35         int code=httpresponse.getStatusLine().getStatusCode();
36         System.out.print(code);
37         String result=EntityUtils.toString((httpresponse.getEntity()));
38         System.out.print(result);      
41     }
42 }

五、封装get、 post请求到HttpUtil类

1、封装思想 

      提取GetDemo和PostDemo类中的doGet和doPost方法,封装到HttpUtil类中,方便之后调用,降低耦合性。

2、封装实现

(1)项目环境搭建:创建maven项目----在pom.xml中配置httpclient,配置如下:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>com.interface.test</groupId>
 4   <artifactId>testInterface</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <dependencies>
 7   <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
 8       <dependency>
 9           <groupId>org.apache.httpcomponents</groupId>
10           <artifactId>httpclient</artifactId>
11           <version>4.5.2</version>
12        </dependency>
13   </dependencies>
14 </project>

(2)封装HttpUtil类,并将GetDemo和PostDemo类中的doGet和doPost方法复制粘贴至HttpUtil类中,并将方法修改为静态方法,方便之后调用,如下所示:

 1 public class HttpUtil {
 2     public static void doGet(String url,Map<String,String> parameter) {
 3         //拼接URL
 4         Set<String>  keys=parameter.keySet();
 5         int mark=1;  //定义一个标志位
 6         for (String para : keys) {
 7             if(mark==1) {
 8                 url=url+"?"+para+"="+parameter.get(para);
 9             }else {
10                 url=url+"&"+para+"="+parameter.get(para);
11             }
12             mark++;
13         }
14         System.out.print(url+"
");
15      //2、创建HttpGet对象,指定接口提交的方式
16      HttpGet get =new HttpGet(url);
17      
18      //3、设置请求头
19      get.setHeader("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjMsImxvZ2luVG9rZW4iOiI3YTc3MDYwYy1jMDkzLTRhYzMtYTFlMC04MGJiNGZmYjIyZmMiLCJleHAiOjE1OTM3MDUyNTB9.k2WvdxXOE-XVNdl3zk-Ee8oxDR4Licj5lSC8rhFN2xSPC1lxPDqYkoLnBGfPEB56Aic7_2b100QTmmoByUyfmA");
20      
21      //4、创建一个可关闭的HttpClient对象
22      HttpClient httpclient=HttpClients.createDefault();
23      try {
24      //5、执行post请求,获取响应信息(状态码、响应报文、响应头等)。相当于jmeter上点击运行按钮,然后赋值给HttpResponse对象接收
25         HttpResponse httpresponse=httpclient.execute(get);
26         
27      //6、获取响应状态码和响应报文,并输出
28         int code=httpresponse.getStatusLine().getStatusCode();
29         System.out.print(code);
30         String result=EntityUtils.toString((httpresponse.getEntity()));
31         System.out.print(result);
32     } catch (Exception e) {
33         e.printStackTrace();
34     } 
35  }
36     public static void doPost(String url, Map<String,String> parameter) throws ClientProtocolException, IOException {
37            
38         //2、使用BasicNameValuePair封装post请求中的参数名称和值
39         List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();
40         Set<String> keys=parameter.keySet();
41         for (String para : keys) {
42             parameters.add(new BasicNameValuePair(para,parameter.get(para)));
43         }
44         
45         //3、创建HttpPost对象,指定接口提交的方式
46         HttpPost post=new HttpPost(url);
47         
48         //4、把请求参数放到请求体中--------定义请求的实体,并把参数传进来,定义编码格式为utf-8
49         post.setEntity(new UrlEncodedFormEntity(parameters,"utf-8"));
50         
51          //5、创建一个可关闭的HttpClient对象
52         HttpClient httpclient=HttpClients.createDefault();
53         
54          //6、执行post请求,获取响应信息(状态码、响应报文、响应头等)。相当于jmeter上点击运行按钮,然后赋值给HttpResponse对象接收
55         HttpResponse httpresponse=httpclient.execute(post);
56         
57         //7、获取响应状态码和响应报文,并输出
58         int code=httpresponse.getStatusLine().getStatusCode();
59         System.out.print(code);
60         String result=EntityUtils.toString((httpresponse.getEntity()));
61         System.out.print(result);
62     
63         
64     }
65 }

六、总结

1、概述

2、实现post、get请求

3、拆分post、get请求

4、将doGet和doPost方法封装到HttpUtil类

原文地址:https://www.cnblogs.com/geqiandeqingmu/p/13253223.html