接口自动化:HttpClient + TestNG + Java(三) - 初步封装和testng断言
在上一篇中,我们写了第一个get请求的测试类,这一篇我们来对他进行初步优化和封装
3.1 分离请求发送类
首先想到的问题是,以后我们的接口自动化测试框架会大量用到发送http请求的功能。
那么这一部分的处理,可以将他分离出来,以后的测试类只需要调用请求类的方法实现发送请求和接收反馈的功能。
在我们的项目目录src/main/java下,新建一个包名为com.test.client,在包下新建restfulClient.java。
这个类我们把上一篇写的发送请求和处理反馈的代码迁移过来,并做出一些改动:
package com.test.client; import java.io.IOException;
import java.util.HashMap; import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; public class RestfulClient {
CloseableHttpClient httpclient;
HttpGet httpGet;
CloseableHttpResponse httpResponse;
int responseCode;
JSONObject responseBody;
HashMap<String, String> responseHeads; //通过httpclient获取请求的反馈
public void getResponse(String url) throws ClientProtocolException, IOException{
httpclient = HttpClients.createDefault();
httpGet = new HttpGet(url);
httpResponse = httpclient.execute(httpGet);
} //以JSON格式获取到反馈的主体
public JSONObject getBodyInJSON() throws ParseException, IOException{
HttpEntity entity;
String entityToString;
entity = httpResponse.getEntity();
entityToString = EntityUtils.toString(entity);
responseBody = JSON.parseObject(entityToString); System.out.println("This is your response body" + responseBody); return responseBody;
} //以哈希图的方式获取到反馈头部
public HashMap<String, String> getHeaderInHash(){
Header[] headers;
headers = httpResponse.getAllHeaders(); responseHeads = new HashMap<String, String>(); for(Header header:headers){
responseHeads.put(header.getName(), header.getValue());
} System.out.println("This is your response header" + responseHeads); return responseHeads;
} //获取反馈状态码
public int getCodeInNumber(){
responseCode = httpResponse.getStatusLine().getStatusCode(); System.out.println("This is your response code" + responseCode); return responseCode;
}
}
我们将代码重新构造后,写了四个方法:
- getResponse:发送请求并获取反馈;
- getBodyInJSON:获取JSON格式的反馈主体;
- getCodeInNumber:获取反馈状态码;
- getHeaderInHash:获取哈希图形式的反馈头;
后续我们考虑在测试类里面,直接调用这些方法。
3.2 引入JSON解析工具类
由于我们在获取反馈主体时,是将其存为了JSON对象,在我们后续做验证时,就需要去解读这个JSON对象。
我们考虑创建一个工具类,专门用来做JSON解析。
在项目目录src/main/java下创建一个包名为com.test.utils,新建JSONParser.java,代码如下:
package com.test.utils; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; public class JSONParser {
JSONObject internalJSON; public String getCity(JSONObject jo){
String city = "";
try {
//先获取反馈中的result这个一个内部JSON对象
JSONObject internalJSON = jo.getJSONObject("result");
//再根据键名查找键值
province = internalJSON.getString("city") ;
}catch (Exception e){
e.printStackTrace();
}
return city;
}
}
这里用到了fastjson库,提前在pom中加入依赖即可。
由于我们测试的这个接口主要是用来查找手机归属地,所以考虑暂时我们只需要通过反馈中最关键的手机所属城市来做验证。
于是这个所谓的JSONParser工具类里,我们暂时只实现了查找‘城市’。
后续我们再考虑将这个工具进一步完善。
3.3 引入TestNG
上一篇中我们还没有很好的执行测试和验证结果,这里我们考虑引入testNG来帮助完成这部分功能。
3.3.1 创建TestNG测试
在项目目录src/test/java下新建名为com.test.api的包,包下新建testNG类名为testGet.java。新建时带上BeforeClass()注释。
写入以下测试代码:
package com.test.api; import org.testng.annotations.Test; import com.alibaba.fastjson.JSONObject;
import com.test.client.RestfulClient;
import com.test.utils.JSONParser; import java.io.IOException;
import java.net.URL; import org.apache.http.ParseException;
import org.testng.Assert;
import org.testng.annotations.BeforeClass; public class testGet {
RestfulClient client;
JSONObject responseBody;
JSONParser jParser;
int responseCode;
String city;
String url = "https://api.apishop.net/communication/phone/getLocationByPhoneNum?apiKey=nMke6NK29c40b1d1331690abb50b3eec8aa0808389b16c4&phoneNum=1861195236";
@Test
public void TestGetRequest() {
//断言反馈中城市是否正确
Assert.assertEquals(city, "北京");
//断言反馈中的状态码是否正确
Assert.assertEquals(responseCode, 200);
}
@BeforeClass
public void beforeClass() throws ParseException, IOException {
//发送请求,获取反馈
client = new RestfulClient();
client.getResponse(url);
responseBody = client.getBodyInJSON();
responseCode = client.getCodeInNumber();
//调用JSONParser获取反馈中的城市信息
jParser = new JSONParser();
city = jParser.getCity(responseBody);
} }
其中,我们在beforeclass里去做发送请求接收反馈,然后调用上一节中封装好的方法获取反馈头部、主体和状态码。
然后通过JSONParser去获取反馈中的所属城市信息,做为核心验证点。
在test里我们做两个断言:
1. 判断状态码是否正确。
2. 判断手机所属城市是否正确。
3.3.2 TestNG测试结果
运行testNG测试,测试通过。

下一篇我们实现POST方法请求的测试,并进一步优化代码。
接口自动化:HttpClient + TestNG + Java(三) - 初步封装和testng断言的更多相关文章
- java 接口自动化测试之数据请求的简单封装
我们自己用java写接口自动化测试框架或者做个接口自动化测试平台的话,是需要自己进行相关的请求的,因此我们需要简单的封装下httpclient,我新建了一个http工具类,将get方法和post方法进 ...
- 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...
- Java + maven + httpclient + testng + poi实现接口自动化
一.maven中引入httpclient.testng.poi依赖包 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建
1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...
- 接口自动化框架(java)--5.通过testng.xml生成extentreport测试报告
这套框架的报告是自己封装的 由于之前已经通过Extentreport插件实现了Testng的IReport接口,所以在testng.xml中使用listener标签并指向实现IReport接口的那个类 ...
- java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮
1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...
- Java接口自动化测试之HTTPClient学习(四)
pom.xml 文件中dependency <dependencies> <dependency> <groupId>org.testng</groupId ...
- Java接口自动化测试之TestNG学习(二)
在maven项目的pom.xml文件中导入TestNG <?xml version="1.0" encoding="UTF-8"?> <pro ...
- java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)
简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...
随机推荐
- Java - Instrumentation
使用JRebel启动工程时加上VM参数时有一个参数是"-javaagent:D:\jrebel_5.6.0\jrebel.jar". javaagent是什么? java -hel ...
- vector作为函数返回类型
在实际的操作中,我们经常会碰到需要返回一序列字符串或者一列数字的时候,以前会用到数组来保存这列的字符串或者数字,现在我们可以用vector来保存这些数据.但是当数据量很大的时候使用vector效率就比 ...
- bzoj4904 [Ctsc2017]最长上升子序列
我们发现他让求的东西很奇怪,于是通过某D开头定理,我们转化为前m位的序列用k个不上升子序列最多能覆盖多少.数据范围小的时候可以网络流做,但是这道题显然不支持网络流的复杂度.然后有一个奇怪的东西叫杨氏矩 ...
- BZOJ_2124_等差子序列_线段树+Hash
BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...
- React 中阻止事件冒泡的问题
在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达 ...
- .NET Core微服务系列基础文章索引(目录导航Final版)
一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...
- user 不在 sudoers 文件中。此事将被报告。
在使用sudo -i或su root命令时,被提示出“user不在 sudoers 文件中.此事将被报告”的错误信息.这是因为当前登录的账号不在sudo权限里面.sudo命令可以让你以root身份执行 ...
- Shell编程(week4_day5)--技术流ken
本节内容 1. 三剑客简介 2. sed命令详解 3. awk命令详解 文本处理三剑客 在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具: 命令 描述 ...
- Java基础练习1(数据类型转换)
1.下列代码的输出结果是:()(单选) public static void main(String[] args){ double money = 3.0; money -= 2.9; System ...
- 关于页面传参,decodeURI和decodeURIComponent
之前写过一个关于页面传参的,但是是前端相对于自己的页面做的跳转,也就是页面1,跳转到页面2,里面带的参数.这里可以参考我上一篇文章,包括里面参数中如果有数组和json格式的情况.但是需要注意的是,我前 ...