一.实现框架:

java+maven+testng+reportNG+jenkins框架

二.框架原理:

使用脚本发送HTTP请求返回接口的响应结果,并将代码存放在svn,Git中,jenkins可以设置测试的时间自动获取代码,编辑和运行。

三.环境部署和安装:

1.安装JDK1.8,配置相关的环境变量;

2.安装eclipse;

3.在eclipse中安装maven,svn,testng插件;

四.详细实现:

1.详情:

2.封装http请求方法:

package com.jdapi.util;

/**

* HttpRequest.java Created on

* @author

* @version 1.0

* 封装GET,PUT,POST,Delete请求

*/

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.Map;

import java.util.Objects;

import org.apache.log4j.Logger;

import okhttp3.Headers;

import okhttp3.MediaType;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.RequestBody;

public class HttpRequest {

private Logger logger = Logger.getLogger(this.getClass());

/**

* @param path

* @param query

* @param header

* @param json

* query拼接在请求地址后面,类似url?query1=value1&query2=value2

* header为空则填null,不为空则直接调用getOfflineHeader方法

* json参数从excel表格中获取json格式的字符串

* @return

* @throws IOException

*/

public String sendPost(String path,Map query,Map header,String json) throws IOException{

OkHttpClient client = new OkHttpClient();

StringBuilder url = new StringBuilder(path);

Request request = null;

String result = "";

if (Objects.nonNull(query) && Objects.nonNull(json) && Objects.isNull(header)) {

url.append("?");

query.forEach((k, v)->{

url.append(k).append("=").append(v).append("&");

});

String temporaryUrl = url.substring(0,url.length()-1);

url.setLength(0);

url.append(temporaryUrl);

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

request = new Request.Builder()

.url(url.toString())

.post(body)

.build();

result = client.newCall(request).execute().body().string();

}

if(Objects.nonNull(query) && Objects.isNull(header) && Objects.isNull(json)){

BufferedReader in = null;

OutputStreamWriter out = null;

StringBuilder rs = new StringBuilder();

StringBuilder realUrl = new StringBuilder(path);

try {

url.append("?");

query.forEach((k, v)->{

url.append(k).append("=").append(v).append("&");

});

String temporaryUrl = url.substring(0,url.length()-1);

url.setLength(0);

url.append(temporaryUrl);

URL requestUrl = new URL(realUrl.toString());

HttpURLConnection conn = (HttpURLConnection)requestUrl.openConnection();

conn.setRequestMethod("POST");

conn.setDoOutput(true);

conn.setDoInput(true);

//设置连接超时时间和读取超时时间

conn.setConnectTimeout(10000);

conn.setReadTimeout(10000);

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

out = new OutputStreamWriter(conn.getOutputStream());

out.flush();

out.close();

// 取得输入流,并使用Reader读取

in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

String line;

while ((line = in.readLine()) != null) {

rs.append(line);

}

} catch (Exception e) {

e.printStackTrace();

}

//关闭输出流、输入流

finally{

try{

if(out!=null){

out.close();

}

if(in!=null){

in.close();

}

}

catch(IOException ex){

ex.printStackTrace();

}

}

result = rs.toString();

}

if(Objects.nonNull(query) && Objects.nonNull(json) && Objects.nonNull(header)){

url.append("?");

query.forEach((k, v)->{

url.append(k).append("=").append(v).append("&");

});

String temporaryUrl = url.substring(0,url.length()-1);

url.setLength(0);

url.append(temporaryUrl);

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

request = new Request.Builder()

.url(url.toString())

.headers(Headers.of(header))

.post(body)

.build();

result = client.newCall(request).execute().body().string();

}

if(Objects.isNull(query) && Objects.nonNull(json) && Objects.nonNull(header)){

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

request = new Request.Builder()

.url(url.toString())

.headers(Headers.of(header))

.post(body)

.build();

return client.newCall(request).execute().body().string();

}

if(Objects.isNull(query) && Objects.nonNull(json) && Objects.isNull(header)){

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

request = new Request.Builder()

.url(url.toString())

.post(body)

.build();

result = client.newCall(request).execute().body().string();

}

return result;

}

/**

*

* @param path

* @param query

* @param header

* @param json

* query拼接在请求地址后面,类似url?query1=value1&query2=value2

* header为空则填null,不为空则直接调用getOfflineHeader方法

* @return result 请求结果

* @throws IOException

*/

public String sendGet(String path,Map query,Map header,String json) throws IOException{

OkHttpClient client = new OkHttpClient();

StringBuilder url = new StringBuilder(path);

String requestUrl = null;

Request request = null;

String result = null;

if(Objects.nonNull(query) && Objects.isNull(header) && Objects.isNull(json)){

url.append("?");

query.forEach((k, v)->{

url.append(k).append("=").append(v).append("&");

});

String temporaryUrl = url.substring(0,url.length()-1);

url.setLength(0);

url.append(temporaryUrl);

if(url.toString().contains("\"\"")){

requestUrl = url.toString().replace("\"\"", "");

}else{

requestUrl = url.toString();

}

request = new Request.Builder()

.url(requestUrl)

.build();

result = client.newCall(request).execute().body().string();

}

if(Objects.nonNull(query) && Objects.nonNull(header) && Objects.nonNull(json)){

url.append("?");

query.forEach((k, v)->{

url.append(k).append("=").append(v).append("&");

});

String temporaryUrl = url.substring(0,url.length()-1);

url.setLength(0);

url.append(temporaryUrl);

if(url.toString().contains("\"\"")){

requestUrl = url.toString().replace("\"\"", "");

}else{

requestUrl = url.toString();

}

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

request = new Request.Builder()

.url(requestUrl)

.headers(Headers.of(header))

.post(body)

.build();

result = client.newCall(request).execute().body().string();

}

return result;

}

/**

* @param url

* @param path

* @param json

* 请求地址:url/path1/path2,请求json字符串放在body中

* @return result

* @throws IOException

*/

public String sendPut(String url,String[] path,String json) throws IOException{

OkHttpClient client = new OkHttpClient();

StringBuilder realUrl = new StringBuilder(url);

RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),"");

//如果请求中带有query参数,则拼接在path后面

if(Objects.nonNull(path)){

for(int i=0;i

realUrl.append("/").append(path[i]);

}

}

logger.debug("实际请求地址是:"+realUrl.toString());

Request request = new Request.Builder()

.url(realUrl.toString())

.put(body)

.build();

return client.newCall(request).execute().body().string();

}

/**

* @param url

* @param path

* 请求地址:url/path1/path2

* @return result

* @throws IOException

*/

public String sendDelete(String url,String[]path) throws IOException{

OkHttpClient client = new OkHttpClient();

StringBuilder realUrl = new StringBuilder(url);

if(Objects.nonNull(path)){

for(int i=0;i

realUrl.append("/").append(path[i]);

}

}

Request request = new Request.Builder()

.url(realUrl.toString())

.build();

return client.newCall(request).execute().body().string();

}

public interface OnResponseCallback {

void onResponse(String str);

}

public String sendPostWithUrlAndQuery(String path,Map query){

BufferedReader in = null;

OutputStreamWriter out = null;

StringBuilder result = new StringBuilder();

StringBuilder url = new StringBuilder(path);

try {

url.append("?");

query.forEach((k, v)->{

url.append(k).append("=").append(v).append("&");

});

String temporaryUrl = url.substring(0,url.length()-1);

url.setLength(0);

url.append(temporaryUrl);

URL realUrl = new URL(url.toString());

HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

conn.setRequestMethod("POST");

conn.setDoOutput(true);

conn.setDoInput(true);

//设置连接超时时间和读取超时时间

conn.setConnectTimeout(10000);

conn.setReadTimeout(10000);

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

out = new OutputStreamWriter(conn.getOutputStream());

out.flush();

out.close();

// 取得输入流,并使用Reader读取

in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

String line;

while ((line = in.readLine()) != null) {

result.append(line);

}

} catch (Exception e) {

e.printStackTrace();

}

//关闭输出流、输入流

finally{

try{

if(out!=null){

out.close();

}

if(in!=null){

in.close();

}

}

catch(IOException ex){

ex.printStackTrace();

}

}

return result.toString();

}

}

3.json解析:

package com.jdapi.util;

import java.util.Map;

import org.apache.log4j.Logger;

import com.google.gson.GsonBuilder;

public class AnalyzeJson {

private static Logger logger = Logger.getLogger(AnalyzeJson.class);

/**

* 封装了响应结果中带有list数组和data不同情况下

* 取出return_msg字段值的方法

* responseResult 是请求响应结果

* dataType 表示return_data返回字段中是否包括数组,如果有数组则此参数传list,不包括数组则此参数传data,缺失data字段则传emptyData

*/

public static String getresultmsg(String responseResult,String responseType){

try{

if(responseType.equals("list")){

ListResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ListResponseResult.class);

return resultObj.resultmsg();

}else if(responseType.equals("data")){

ResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ResponseResult.class);

return resultObj.resultmsg();

}

}catch(Exception e){

e.printStackTrace();

logger.debug("响应结果类型传参有误,请输入list,data,emptyData中的一种类型");

}

return null;

}

/**

* 根据接口请求返回数组分类,解析返回字段

* @param responseResult

* @param dataType

* @param field

* @return

* @throws Exception

*/

public static String getValue(String responseResult,String dataType,String field) throws Exception{

try{

if(responseResult.length() != 0){

if(dataType.equals("list")){

ListResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ListResponseResult.class);

for(Map o : resultObj.getData()){

return (String)o.get(field);

}

}else if(dataType.equals("data")){

ResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult,ResponseResult.class);

return resultObj.getData().get(field).toString();

}

}

}catch(Exception e){

e.printStackTrace();

logger.debug("json字段类型传参有误,请输入list,data,或者null!");

}

return null;

}

/**

* 判断return_data是否返回空数组,如果为空数组则返回true,不为空数组则返回false

* @param responseResult

* @param dataType

* @return

*/

public static boolean isReturnDataEmpty(String responseResult,String dataType){

if(responseResult.length() != 0){

if(dataType.equals("list")){

ListResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult, ListResponseResult.class);

if(resultObj.getData().toString().equals("[]")){

return true;

}

return false;

}else if(dataType.equals("data")){

ResponseResult resultObj = new GsonBuilder().create().fromJson(responseResult, ResponseResult.class);

if(resultObj.getData().toString().equals("[]")){

return true;

}

return false;

}

}

return true;

}

}

4.excel数据读取:

package com.jdapi.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.DataFormatter;

import org.apache.poi.ss.usermodel.DateUtil;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelReader {

private String filePath;

private String sheetName;

private Workbook workBook;

private Sheet sheet;

private List columnHeaderList;

private List> listData;

private List> mapData;

private boolean flag;

public ExcelReader(String filePath, String sheetName) {

this.filePath = filePath;

this.sheetName = sheetName;

this.flag = false;

this.load();

}

private void load() {

FileInputStream inStream = null;

try {

inStream = new FileInputStream(new File(filePath));

workBook = WorkbookFactory.create(inStream);

sheet = workBook.getSheet(sheetName);

} catch (Exception e) {

e.printStackTrace();

}finally{

try {

if(inStream!=null){

inStream.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

private String getCellValue(Cell cell) {

String cellValue = "";

DataFormatter formatter = new DataFormatter();

if (cell != null) {

switch (cell.getCellType()) {

case Cell.CELL_TYPE_NUMERIC:

if (DateUtil.isCellDateFormatted(cell)) {

cellValue = formatter.formatCellValue(cell);

} else {

double value = cell.getNumericCellValue();

int intValue = (int) value;

cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);

}

break;

case Cell.CELL_TYPE_STRING:

cellValue = cell.getStringCellValue();

break;

case Cell.CELL_TYPE_BOOLEAN:

cellValue = String.valueOf(cell.getBooleanCellValue());

break;

case Cell.CELL_TYPE_FORMULA:

cellValue = String.valueOf(cell.getCellFormula());

break;

case Cell.CELL_TYPE_BLANK:

cellValue = "";

break;

case Cell.CELL_TYPE_ERROR:

cellValue = "";

break;

default:

cellValue = cell.toString().trim();

break;

}

}

return cellValue.trim();

}

private void getSheetData() {

listData = new ArrayList>();

mapData = new ArrayList>();

columnHeaderList = new ArrayList();

int numOfRows = sheet.getLastRowNum() + 1;

for (int i = 0; i < numOfRows; i++) {

Row row = sheet.getRow(i);

Map map = new HashMap();

List list = new ArrayList();

if (row != null) {

for (int j = 0; j < row.getLastCellNum(); j++) {

Cell cell = row.getCell(j);

if (i == 0){

columnHeaderList.add(getCellValue(cell));

}

else{

map.put(columnHeaderList.get(j), this.getCellValue(cell));

}

list.add(this.getCellValue(cell));

}

}

if (i > 0){

mapData.add(map);

}

listData.add(list);

}

flag = true;

}

public String getCellData(int row, int col){

if(row<=0 || col<=0){

return null;

}

if(!flag){

this.getSheetData();

}

if(listData.size()>=row && listData.get(row-1).size()>=col){

return listData.get(row-1).get(col-1);

}else{

return null;

}

}

public String getCellData(int row, String headerName){

if(row<=0){

return null;

}

if(!flag){

this.getSheetData();

}

if(mapData.size()>=row && mapData.get(row-1).containsKey(headerName)){

return mapData.get(row-1).get(headerName);

}else{

return null;

}

}

public Map getQueryToMap(int row,String headerName){

String result;

String[] sourceStrArray;

Map mp = new HashMap();

if(row<=0){

return null;

}

if(!flag){

this.getSheetData();

}

if(mapData.size()>=row && mapData.get(row-1).containsKey(headerName)){

result = mapData.get(row-1).get(headerName);

sourceStrArray = result.split("&");

if(sourceStrArray.length>=2){

for(int i=0;i

String[] ary = sourceStrArray[i].split("=");

for(int j=1;j

mp.put(ary[j-1],ary[ary.length-1]);

}

}

}else{

String[] ary = result.split("=");

mp.put(ary[0], ary[ary.length-1]);

}

return mp;

}else{

return null;

}

}

}

5.excel数据:

6.测试代码:

package com.jdapi.testcase;

import org.testng.annotations.Test;

import com.jdapi.util.ExcelReader;

import com.jdapi.util.AnalyzeJson;

import com.jdapi.util.HttpRequest;

import com.jdapi.util.Assertion;

import org.apache.log4j.Logger;

public class NewTest {

private Logger logger = Logger.getLogger(this.getClass());

private String excelPath = "D:\\testdata\\test.xlsx";

private String sheet = "京东天气预报接口";

ExcelReader excelReader = new ExcelReader(excelPath, sheet);

HttpRequest httpRequest = new HttpRequest();

AnalyzeJson analyzeJson = new AnalyzeJson();

private String result = "";

@Test

public void test_NewTest() throws Exception

{

result = httpRequest.sendGet(excelReader.getCellData(1, "url"), excelReader.getQueryToMap(1, "query"),null, null);

logger.info("接口响应结果:"+result);

Assertion.verifyEquals(AnalyzeJson.getresultmsg(result, "data"),excelReader.getCellData(1, "expectedResult"));

logger.info("实际结果是:"+AnalyzeJson.getresultmsg(result, "data"));

logger.info("预期结果是:"+excelReader.getCellData(1, "expectedResult"));

}

}

7.运行结果:

总结:需要学习的知识点为java相关网络编程,例如http请求不同方法的封装,json的解析以及分层解析,连接数据库操作数据库,文件读取;基本功日志相关;

其中个人认为在实现的过程中难点:

1.json的解析尤其是遇到不同返回结果,多层实现的时候就比较困难;

2.断言现在只是基本的实现和文件预期结果进行对比判断;

3.请求头的封装;

4.签名的封装;

5.接口格式一定要完全统一;

后期优化实现方向:

1.json多层解析;

2.断言数据库进行判断;

3.报告优化;

java接口自动化_接口自动化实现相关推荐

  1. Web自动化_APP自动化_接口自动化_测试框架汇总

    1 luckyframe 码云地址 https://gitee.com/seagull1985/LuckyFrameWeb https://gitee.com/seagull1985/LuckyFra ...

  2. java 接口继承_接口是否可继承接口(java)

    展开全部 Java语法中,接口32313133353236313431303231363533e59b9ee7ad9431333366303839可以继承接口,抽象类可以实现接口,抽象类可以继承实体类 ...

  3. api接口加密_接口加密如何测试?

    摘要算法: 对明文编码生成信息摘要,以防止被篡改.比如MD5使用的是Hash算法,无论多长的输入,MD5都会输出长度为128bits的一个串. 摘要算法不要秘钥,客户端和服务端采用相同的摘要算法即可针 ...

  4. 后端接口重定向_接口自动化面试题,建议收藏!

    1.get和post的区别? l http是上层请求协议,主要定义了服务端和客户端的交互规格,底层都是tcp/ip协议 l Get会把参数附在url之后,用?分割,&连接不同参数,Get获取资 ...

  5. java脚本接口自动化测试_接口自动化测试实践的记录

    接口测试实践的记录 在敏捷开发交付的流程中,自动化测试实际上被放在一个看起来挺重要的位置,而自动化测试中,接口测试是一个投入产出比比较高的 一种自动化测试的形式,而我自己也做了一个这样的脚手架一样的东 ...

  6. java空接口_接口篇(五):空接口及其使用场景

    接口篇(五):空接口及其使用场景 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 4403 views 11 likes 0 collects 熟悉 Java 的同学应该都知道,在这个号 ...

  7. java 接口重写_接口与继承系列教材 (三)- Java 重写方法

    8 个答案 valecalida 答案时间:2021-01-12 package LOL.property; public class property { } class Item{ String ...

  8. java 透传_接口透传

    接口测试就是将配置文件改成对应真实的外部业务系统 就可以实际调我们接口请求 看最后业务对不对,一个成功一个失败 需要真实联调的  正常要走一遍,但有时候有些接口不可能跑完,一些测试用例只需要保持blo ...

  9. 接口说明_接口说明_实时语音识别_智能语音交互-阿里云

    使用须知支持的输入格式:PCM编码.16bit采样位数.单声道(mono). 支持的音频采样率:8000Hz/16000Hz. 支持设置返回结果:是否返回中间识别结果,在后处理中添加标点,将中文数字转 ...

最新文章

  1. 2020,国产AI开源框架“亮剑”TensorFlow、PyTorch
  2. DATEIF实例说明3
  3. 【Windows 逆向】OD 调试器工具 ( OD 附加进程 | OD 调试器面板简介 | 反汇编窗口 | 寄存器窗口 | 数据窗口 | 堆栈窗口 )
  4. 六种方法,做一名更好的开发者
  5. Python: pip升级报错了:You are using pip version 10.0.1, however version 20.3.3 is available.
  6. 2019阿里天猫团队Java高级工程师面试题之三轮面试
  7. 太阳系八大行星碰撞的视频_火星的身世:从太阳系的起源说起
  8. Android-即时通训
  9. 编译原理第三版王生原pdf_CS143:编译原理 | 环境搭建HelloWorld
  10. linux不同主机通信,Linux实现多台主机之间相互通信
  11. 一个初学者的辛酸路程-常用模块-6
  12. foxmail信纸设置html,教你如何设置Foxmail信纸花样?
  13. win10动态壁纸怎么设置_教程丨WIN10系统下设置固定IP或动态IP
  14. Bootstrap轮播插件
  15. DirectX中的粒子系统
  16. 支付宝服务窗 开发 验证
  17. 漏洞复现- - -IIS解析漏洞在fckEditor上传攻击中的利用
  18. 深入 AXI4 总线(一)握手机制
  19. 【游戏开发】角色选择功能实现
  20. 同步挤压s变换matlab,同步挤压广义S变换信号时频分解与重构方法与流程

热门文章

  1. ASP.NET MVC ---MVC中验证码
  2. 爬一个人的所有微博 python_pyhton爬虫爬取微博某个用户所有微博配图
  3. JavaScript深拷贝函数
  4. MiniCentOS7的安装与网络配置
  5. win10系统将网页URL固定到任务栏的方法 - Chrome浏览器创建快捷方式到桌面
  6. Spring与Struts2的PK
  7. 非计算机专业进入IT行业的三个方法,你是哪一个?
  8. 不小心删除/etc/passwd文件怎么办
  9. 【职场必备知识】关于税收、纳税的若干问题记录
  10. 计算机学院工作总结报告,计算机教师个人工作总结报告