在上一篇中,我们写了第一个get请求的测试类,这一篇我们来对他进行初步优化和封装

3.1 分离请求发送类

首先想到的问题是,以后我们的接口自动化测试框架会大量用到发送http请求的功能。

那么这一部分的处理,可以将他分离出来,以后的测试类只需要调用请求类的方法实现发送请求和接收反馈的功能。

在我们的项目目录src/main/java下,新建一个包名为com.test.client,在包下新建restfulClient.java。

这个类我们把上一篇写的发送请求和处理反馈的代码迁移过来,并做出一些改动:

  1. package com.test.client;
  2.  
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5.  
  6. import org.apache.http.Header;
  7. import org.apache.http.HttpEntity;
  8. import org.apache.http.ParseException;
  9. import org.apache.http.client.ClientProtocolException;
  10. import org.apache.http.client.methods.CloseableHttpResponse;
  11. import org.apache.http.client.methods.HttpGet;
  12. import org.apache.http.impl.client.CloseableHttpClient;
  13. import org.apache.http.impl.client.HttpClients;
  14. import org.apache.http.util.EntityUtils;
  15. import com.alibaba.fastjson.JSON;
  16. import com.alibaba.fastjson.JSONObject;
  17.  
  18. public class RestfulClient {
  19. CloseableHttpClient httpclient;
  20. HttpGet httpGet;
  21. CloseableHttpResponse httpResponse;
  22. int responseCode;
  23. JSONObject responseBody;
  24. HashMap<String, String> responseHeads;
  25.  
  26. //通过httpclient获取请求的反馈
  27. public void getResponse(String url) throws ClientProtocolException, IOException{
  28. httpclient = HttpClients.createDefault();
  29. httpGet = new HttpGet(url);
  30. httpResponse = httpclient.execute(httpGet);
  31. }
  32.  
  33. //以JSON格式获取到反馈的主体
  34. public JSONObject getBodyInJSON() throws ParseException, IOException{
  35. HttpEntity entity;
  36. String entityToString;
  37. entity = httpResponse.getEntity();
  38. entityToString = EntityUtils.toString(entity);
  39. responseBody = JSON.parseObject(entityToString);
  40.  
  41. System.out.println("This is your response body" + responseBody);
  42.  
  43. return responseBody;
  44. }
  45.  
  46. //以哈希图的方式获取到反馈头部
  47. public HashMap<String, String> getHeaderInHash(){
  48. Header[] headers;
  49. headers = httpResponse.getAllHeaders();
  50.  
  51. responseHeads = new HashMap<String, String>();
  52.  
  53. for(Header header:headers){
  54. responseHeads.put(header.getName(), header.getValue());
  55. }
  56.  
  57. System.out.println("This is your response header" + responseHeads);
  58.  
  59. return responseHeads;
  60. }
  61.  
  62. //获取反馈状态码
  63. public int getCodeInNumber(){
  64. responseCode = httpResponse.getStatusLine().getStatusCode();
  65.  
  66. System.out.println("This is your response code" + responseCode);
  67.  
  68. return responseCode;
  69. }
  70. }

我们将代码重新构造后,写了四个方法:

  • getResponse:发送请求并获取反馈;
  • getBodyInJSON:获取JSON格式的反馈主体;
  • getCodeInNumber:获取反馈状态码;
  • getHeaderInHash:获取哈希图形式的反馈头;

后续我们考虑在测试类里面,直接调用这些方法。

3.2 引入JSON解析工具类

由于我们在获取反馈主体时,是将其存为了JSON对象,在我们后续做验证时,就需要去解读这个JSON对象。

我们考虑创建一个工具类,专门用来做JSON解析。

在项目目录src/main/java下创建一个包名为com.test.utils,新建JSONParser.java,代码如下:

  1. package com.test.utils;
  2.  
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5.  
  6. public class JSONParser {
  7. JSONObject internalJSON;
  8.  
  9. public String getCity(JSONObject jo){
         String city = "";
  10. try {
           //先获取反馈中的result这个一个内部JSON对象 
  11. JSONObject internalJSON = jo.getJSONObject("result");
  12. //再根据键名查找键值
  13. province = internalJSON.getString("city") ;
  14. }catch (Exception e){
  15. e.printStackTrace();
  16. }
  17. return city;
  18. }
  19. }

这里用到了fastjson库,提前在pom中加入依赖即可。

由于我们测试的这个接口主要是用来查找手机归属地,所以考虑暂时我们只需要通过反馈中最关键的手机所属城市来做验证。

于是这个所谓的JSONParser工具类里,我们暂时只实现了查找‘城市’。

后续我们再考虑将这个工具进一步完善。

3.3 引入TestNG

上一篇中我们还没有很好的执行测试和验证结果,这里我们考虑引入testNG来帮助完成这部分功能。

3.3.1 创建TestNG测试

在项目目录src/test/java下新建名为com.test.api的包,包下新建testNG类名为testGet.java。新建时带上BeforeClass()注释。

写入以下测试代码:

  1. package com.test.api;
  2.  
  3. import org.testng.annotations.Test;
  4.  
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.test.client.RestfulClient;
  7. import com.test.utils.JSONParser;
  8.  
  9. import java.io.IOException;
  10. import java.net.URL;
  11.  
  12. import org.apache.http.ParseException;
  13. import org.testng.Assert;
  14. import org.testng.annotations.BeforeClass;
  15.  
  16. public class testGet {
  17. RestfulClient client;
  18. JSONObject responseBody;
  19. JSONParser jParser;
  20. int responseCode;
  21. String city;
  22. String url = "https://api.apishop.net/communication/phone/getLocationByPhoneNum?apiKey=nMke6NK29c40b1d1331690abb50b3eec8aa0808389b16c4&phoneNum=1861195236";
  23. @Test
  24. public void TestGetRequest() {
          //断言反馈中城市是否正确
  25. Assert.assertEquals(city, "北京");
          //断言反馈中的状态码是否正确
  26. Assert.assertEquals(responseCode, 200);
  27. }
  28. @BeforeClass
  29. public void beforeClass() throws ParseException, IOException {
          //发送请求,获取反馈
  30. client = new RestfulClient();
  31. client.getResponse(url);
  32. responseBody = client.getBodyInJSON();
  33. responseCode = client.getCodeInNumber();

  34.       //调用JSONParser获取反馈中的城市信息
  35. jParser = new JSONParser();
  36. city = jParser.getCity(responseBody);
  37. }
  38.  
  39. }

其中,我们在beforeclass里去做发送请求接收反馈,然后调用上一节中封装好的方法获取反馈头部、主体和状态码。

然后通过JSONParser去获取反馈中的所属城市信息,做为核心验证点。

在test里我们做两个断言:

1.  判断状态码是否正确。

2.  判断手机所属城市是否正确。

3.3.2 TestNG测试结果

运行testNG测试,测试通过。

下一篇我们实现POST方法请求的测试,并进一步优化代码。

接口自动化:HttpClient + TestNG + Java(三) - 初步封装和testng断言的更多相关文章

  1. java 接口自动化测试之数据请求的简单封装

    我们自己用java写接口自动化测试框架或者做个接口自动化测试平台的话,是需要自己进行相关的请求的,因此我们需要简单的封装下httpclient,我新建了一个http工具类,将get方法和post方法进 ...

  2. 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求

    在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...

  3. Java + maven + httpclient + testng + poi实现接口自动化

    一.maven中引入httpclient.testng.poi依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  4. 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建

    1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...

  5. 接口自动化框架(java)--5.通过testng.xml生成extentreport测试报告

    这套框架的报告是自己封装的 由于之前已经通过Extentreport插件实现了Testng的IReport接口,所以在testng.xml中使用listener标签并指向实现IReport接口的那个类 ...

  6. java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮

    1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...

  7. Java接口自动化测试之HTTPClient学习(四)

    pom.xml  文件中dependency <dependencies> <dependency> <groupId>org.testng</groupId ...

  8. Java接口自动化测试之TestNG学习(二)

    在maven项目的pom.xml文件中导入TestNG <?xml version="1.0" encoding="UTF-8"?> <pro ...

  9. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

随机推荐

  1. bzoj 2120 数颜色 带修改莫队

    带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...

  2. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法

    BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...

  3. Android性能优化-内存泄漏的8个Case

    1为什么要做性能优化? 手机性能越来越好,不用纠结这些细微的性能? Android每一个应用都是运行的独立的Dalivk虚拟机,根据不同的手机分配的可用内存可能只有(32M.64M等),所谓的4GB. ...

  4. jquery简易版xwPop.js弹出消息对话框插件

    xwPop.js弹出消息对话框插件是一款含有多种情景模式的原生模态消息对话框代码,可用于替代浏览器默认的alert弹出对话框,它提供各种参数和方法,功能非常强大.目前已经在项目中有应用到xwpop开发 ...

  5. APP版本更新通知流程测试要点

    一.APP版本更新通知流程图如下: 二.测试注意点: 1.Android更新直接下载APK,IOS引导至APP Store更新页面: 强制更新------只有"立即更新" 1.一般 ...

  6. MYSQL—— 基础入门,增、删、改、查(基础篇)

    首先呢,先解释一下基本的概念,心里最起码知道就ok啦!其余更多的了解,得另查看喽! (1)什么是sql? sql:指结构化查询语言,有能力访问数据库,是一种ANSI(美国国家标准话组织)的标准计算机语 ...

  7. Hive 查询元数据库获取某个分区的count数

    =========查询分区的大小========= select d.NAME,t.TBL_NAME,p.PART_NAME,prm.PARAM_KEY,prm.PARAM_VALUE from TB ...

  8. 使用MediatR重构单体应用中的事件发布/订阅

    标题:使用MediatR重构单体应用中的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10640280.html 源代码:https ...

  9. SpringBoot从零单排 ------ 拦截器的使用

    在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...

  10. 真win10官方原版ISO下载方法

    最近装新机器,计划装个双系统,但是新硬件用不了Win7,只好改装Win10.经过数遍尝试,发现网上很多打着官方原版旗号的ISO以及各种装机软件,或多或少都捆绑了一些"流氓"软件,这 ...