http接口测试—自动化测试框架设计
一、测试需求描述
对服务后台一系列的http接口功能测试。
输入:根据接口描述构造不同的参数输入值(Json格式)
输出:字符串(传入的方式+传入的字符串)
http://localhost:8090/lctest/TestServer
二、程序设计
1、Client程序设计
读取Excel配置的测试用例数据
发送参数Json格式给Server,接收Server的返回数据
进行数据比对校验,返回测试结果,将数据插入到Excel中
2、Server端程序设计
接受Client的参数,进行解析
发送返回数据给client
三、实现方法
1、选用Java脚本来驱动测试
2、采用Excel表格管理测试数据,包括用例的管理、测试数据录入、测试结果显示等等,这个需要封装一个Excel的类。
3、调用http接口采用java自带的的API
4、测试需要的将参数转化成字符串
5、通过预期结果和实际结果的对比,将实际结果和对比结果写入Excel用例中,这里封装了一个类
6、首次执行测试采用人工检查输出的是否正确,一旦正确写入Excel的期望结果中,如果发现错误手工修正为预期文件。
四、Excel表格设计
五、代码结构
六、实现代码
1、ExcelUtil.java
package client;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class ExcelUtil {//读取Excel中数据public static List<Param> read() throws Exception{HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet s = wb.createSheet();HSSFRow row = s.createRow(0);HSSFCell cell = row.createCell((int)0,0);//------------从xls读出数据wb = new HSSFWorkbook(new FileInputStream("D:\\learn\\test.xls"));s = wb.getSheetAt(0);//获得EXCEL行数int rowNums=s.getLastRowNum();//获得Excell列数//int columnNum=r.getPhysicalNumberOfCells();List<Param> params=new ArrayList<Param>();for(int i=1;i<=rowNums;i++){HSSFRow r = s.getRow(i);cell=r.getCell(0);Param param= new Param();param.setNo(r.getCell(0).getStringCellValue());param.setName(r.getCell(1).getStringCellValue());param.setAge(r.getCell(2).getStringCellValue());param.setSex(r.getCell(3).getStringCellValue());param.setExpResu(r.getCell(4).getStringCellValue());
// System.out.println(cell.getRichStringCellValue());params.add(param);}return params;}/*** 写入Excel,在任意坐标处写入数据。* String value:你要输入的内容* int x :行坐标,Excel从 0 算起* int y :列坐标,Excel从 0 算起*/public static void writeCell(String filePath,int x,int y,String value) {try {// 创建Excel的工作书册 Workbook,对应到一个excel文档HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(filePath));HSSFSheet sheet=wb.getSheetAt(0);HSSFRow row=sheet.getRow(x);HSSFCell cell=row.getCell((short) y);cell.setCellValue(value);FileOutputStream os;os = new FileOutputStream(filePath);wb.write(os);os.close();} catch (Exception e) {e.printStackTrace();}}
}
2、JsonsUtil.java
package client;import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;/*** 使用json-lib构造和解析Json数据*/
public class JsonsUtil {/**将Bean转换成Map* 将Map转换Json数据*/public static String BuildJson(Param param) throws JSONException {Map<String, String> map1 = new HashMap<String, String>();map1.put("no", param.getNo());map1.put("name", param.getName());map1.put("age", param.getAge());map1.put("sex", param.getSex());
// map1.put("expResu", param.getExpResu());// JSON格式数据解析对象JSONObject jo = new JSONObject();// 将Map转换为JSONArray数据JSONArray ja = new JSONArray();ja.put(map1);
// System.out.println("JSONArray对象数据格式:"+ja.toString());jo.put("map", ja);
// System.out.println("最终构造的JSON数据格式:"+jo.toString());return jo.toString();}/*** 解析Json数据**/public static JSONArray ParseJson(String jsonString) throws JSONException,ParseException {JSONObject jo = new JSONObject(jsonString);JSONArray ja = jo.getJSONArray("map");
// System.out.println(ja.getJSONObject(0).getString("name"));return ja;}
}
3、Param.java
package client;public class Param {String no;//编号String name;//姓名String age;//年龄String sex;//性别String expResu;//期望结果String actResu;//实际结果String pass;//是否通过String desc;//描述public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNo() {return no;}public void setNo(String no) {this.no = no;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getExpResu() {return expResu;}public void setExpResu(String expResu) {this.expResu = expResu;}public String getActResu() {return actResu;}public void setActResu(String actResu) {this.actResu = actResu;}public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}
4、CompareRes.java
package client;public class CompareRes {int actResuNo=5;//测试结果在第五例int passNo=6;//对比结果在第六列public void compare(String filePath,Param param,String actResu){ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),actResuNo,actResu);if(param.getExpResu().trim().equals(actResu)){ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),passNo,"Y");}else{ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),passNo,"N");}}
}
5、TestClient .java
package client;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;public class TestClient {public static void main(String[]agrs){TestClient a=new TestClient();try {a.client();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void client() throws Exception{List<Param> params = ExcelUtil.read();for(Param pa:params){try {// 接报文的地址String filePath="D:\\learn\\test.xls";String param= new JsonsUtil().BuildJson(pa);URL serverUrl= new URL("http://localhost:8090/lctest/TestServer");URLConnection uct= serverUrl.openConnection();HttpURLConnection hutc=(HttpURLConnection)uct; // 设置报文参数hutc.setRequestMethod("POST");// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 http正文内,因此需要设为true, 默认情况下是false; hutc.setDoOutput(true);// 设置是否从httpUrlConnection读入,默认情况下是truehutc.setDoInput(true);
// hutc.setAllowUserInteraction(true);// 开启流,写入数据dataOutputStream out=hutc.getOutputStream();out.write(param.getBytes("UTF-8"));out.flush();out.close();// 获取返回的数据 StringBuffer buffer=new StringBuffer();BufferedReader reader = null;InputStream ins=hutc.getInputStream();reader = new BufferedReader(new InputStreamReader(ins,"UTF-8"));String sg=reader.readLine();if (sg!= null){buffer.append(sg);}System.out.println("接收返回值:" + buffer);new CompareRes().compare(filePath, pa, buffer.toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}
6、TestServer
public class TestServer extends HttpServlet {private static final long serialVersionUID = 1L;private static JSONArray ja;/*** @see HttpServlet#HttpServlet()*/public TestServer() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubtry {this.excute(request, response);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubtry {this.excute(request, response);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void excute(HttpServletRequest request,HttpServletResponse response) throws Exception{request.setCharacterEncoding("utf-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/xml");String method=request.getMethod();String url=request.getRequestURI();String param;// 获取收到的报文BufferedReader reader = request.getReader();String line = "";line = reader.readLine();ja=new JsonsUtil().ParseJson(line); StringBuffer resultBuffer=new StringBuffer();resultBuffer.append("访问方式"+method+"访问成功");resultBuffer.append("接收到的数据:"+line);PrintWriter out =response.getWriter();out.println(resultBuffer.toString());out.flush();out.close();}
}
7、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><servlet><servlet-name>TestServer</servlet-name><servlet-class>com.servlet.TestServer</servlet-class></servlet><servlet-mapping><servlet-name>TestServer</servlet-name><url-pattern>/lctest/TestServer</url-pattern></servlet-mapping>
</web-app>
Python接口自动化测试零基础入门到精通(2023最新版)
相关文章:

http接口测试—自动化测试框架设计
一、测试需求描述 对服务后台一系列的http接口功能测试。 输入:根据接口描述构造不同的参数输入值(Json格式) 输出:字符串(传入的方式传入的字符串) http://localhost:8090/lctest/TestServer 二、程序设计…...

HTML 之常用标签的介绍
文章目录 h标签p标签a标签img 标签table、tr、td标签ul、ol、li 标签div 标签 h标签 <h> 标签用于定义 HTML 文档中的标题,其中 h 后面跟着一个数字,表示标题的级别。HTML 提供了 <h1> 到 <h6> 六个不同级别的标题,其中 &…...

数据恢复入门分享-启动扇区
启动扇区位于存储区的前端,一般显示如下 如果扇区数据丢失或者错误 存储器也就不能识别和数据存储了 关注我们,不定期分享互联网数字化的干货 #数据恢复##储存卡##启动扇区#...

解决Chrome无法自动同步书签
前提:(要求能正常访问google) 准备一个谷歌账号 安装Chrome浏览器 开启集装箱插件(或者其他能访问谷歌的工具) 步骤:(使用集装箱插件/能正常访问谷歌的其他工具) 下载安装使用“集…...

Java绘图-第19章
Java绘图-第19章 1.Java绘图类 1.1Graphics类 Graphics类是用于绘制图形的抽象类,它是java.awt包中的一部分。Graphics类提供了各种方法,可以在图形上绘制各种形状、文本和图像。这些方法包括画线、画矩形、画椭圆、画弧、绘制图像等。 1.2Graphics2…...

SpringBoot文件在线预览实现
kkFileView - 在线文件预览,一款成熟且开源的文件文档在线预览项目解决方案。 详细wiki文档:https://gitee.com/kekingcn/file-online-preview/wikis/pages 中文文档:https://gitee.com/kekingcn/file-online-preview/blob/master/README.md…...

cudnn安装
安装地址 cudnn安装地址:https://developer.nvidia.com/rdp/cudnn-download 安装 选择windows版本的下载,我这里选择的这个: 下载之后解压即可。 后续 后续:第一步 把cudnn的bin,include,lib三个文件…...

uni-app发布后iOS端页面背景图片上下滑动问题
问题分析 uni-app发布后iOS端页面背景图片会跟着上下滑动。 解决方案 在pages.json文件中添加配置"bounce": "none" {"pages": [{"path": "pages/login/login","style": {"navigationStyle": "…...

ctfshow 文件上传 151-161
文件上传也好久没做了。。 手很生了 151 前端绕过 只能上传png文件 使用bp抓包,修改文件名后缀为php 上传成功,发现文件上传路径 使用蚁剑连接 找到flag 152 152 后端校验 跟上一关一样 表示后面即使执行错误,也不报错 抓包修改文件…...

Selenium浏览器自动化测试框架简单介绍
selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google …...

bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds
创建池 [rootceph-0 ~]# ceph osd pool create cephfs_data 64 pool cephfs_data created [rootceph-0 ~]# ceph osd pool create cephfs_metadata 32 pool cephfs_metadata created cephfs_metadata 64 报错 官方说明: 元数据池通常最多可容纳几 GB 的数据。为…...

【微前端】micro-app搭建项目实战
主应用 1、安装依赖 npm i micro-zoe/micro-app --save 2、初始化micro-app import microApp from ‘micro-zoe/micro-app’ microApp.start() 项目环境 vue3 ts 主应用实例 // main.ts 1.引入插件 import microApp from ‘micro-zoe/micro-app’ 2.初始化插件 microApp.star…...

C语言——分割单向链表
本文的内容是使用C语言分割单向链表,给出一个链表和一个值,要求链表中小于给定值的节点全都位于大于或等于给定值的节点之前,打印原始链表的所有元素和经此操作之后链表的所有元素。 分析:本题只是单向链表的分割,不涉…...

台式电脑的IP地址在哪里?解密台式电脑网络连接的秘密!
如今智能手机和便携式笔记本电脑盛行的时代,台式电脑似乎逐渐被人们所忽视。然而,对于需要高性能和大容量存储的用户来说,台式电脑依然是最好的选择。而作为一款能够连接网络的设备,台式电脑也有自己独特的IP地址。下面虎观代理…...

设计模式案例 (三)
文章目录 系列文章目录前言一、单例模式懒汉模式case 包饿汉模式case 包懒汉模式枷锁case 包 系列文章目录 第一章 设计模式案例 (一) 第二章 设计模式案例 (二) 第三章 设计模式案例 (二) 文章目录 系列文章目录前言一、单例模式懒汉模式case 包饿汉模…...

JZ22:链表中倒数第k个结点
JZ22:链表中倒数第k个结点 题目描述: 输入一个链表,输出该链表中倒数第k个结点。 示例1 输入: 1,{1,2,3,4,5} 返回值: {5} 分析: 快慢指针思想: 需要两个指针,快指针fast&…...

python的高性能web应用的开发与测试实验
引言 python语言一直以开发效率高著称,被广泛地应用于自动化领域: 测试自动化运维自动化构建发布自动化 但是因为其也具有如下两个特征: 解释型语言GIL全局解释器锁 前者导致其性能天然就被编译型语言在性能上落后了许多。而后者则在多核…...

除了http还有哪些通信协议?
除了HTTP协议外,还存在许多其他通信协议。以下是一些常见的通信协议: 1:HTTPS:HTTPS(HTTP Secure)是HTTP的安全版本,通过使用SSL(Secure Sockets Layer)或TLS࿰…...

基于遗传算法的图像重建
图像重建涉及从图像的有限信息中恢复出可能丢失或受损的信息。使用遗传算法进行图像重建的一般思路是调整某些参数或者操作,以使得图像的质量或者特定的性能指标最优化。 以下是一个简单的图像重建的遗传算法示例,以模拟重建一个被模糊的图像。 图像重…...

【Redis】Redis-Key的使用
上一篇: redis-server和redis-cli https://blog.csdn.net/m0_67930426/article/details/134361885?spm1001.2014.3001.5501 官网 命令 |雷迪斯 (redis.io) 设置key set name xxxxx 查看key keys * 再设置一个key并且查看 这里查看了两个key(name a…...

为忙碌的软件工程师精心准备的编码面试准备材料,超过 100,000 人受益!
这是一个针对技术面试准备的手册。它收集了大量的面试问题和答案,涵盖了算法、系统设计、前端等主题,并且还在不断更新和完善中。 这个项目是“Tech Interview Handbook”,解决了求职者在技术面试中遇到的各种难题,帮助他们更好地…...

SpringCloud Alibaba(上):注册中心-nacos、负载均衡-ribbon、远程调用-feign
Nacos 概念:Nacos是阿里巴巴推出的一款新开源项目,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助用户发现、配置和管理微服务,它提供了一组简单易用的特性集,包括动态服务发现、服务配置…...

基于乌鸦算法优化概率神经网络PNN的分类预测 - 附代码
基于乌鸦算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于乌鸦算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于乌鸦优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…...

Jenkins中强制停止停不下来的job
# Script console 执行脚本 Jenkins 的提供了 script console 的功能,允许你写一些脚本,来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面: script console 路…...

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(1)实现带同步复位功能、采用上升沿触发的D触发器
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.顶层模块的书写 二.两种验证方法 2.1使用…...

go中的rune类型
go语言中 ,rune其实是一种int32的数据类型的别名。 // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values. type rune int32rune通常用于处理字符串中的单…...

C51--PC通过串口(中断)点亮LED
B4中的:REN允许 / 禁止串行接收控制位 REN 1为允许串行接收状态。 接收数据必须开启。所以SCON:0101 0000 ;即0x50 如何知道数据已经接收 RI位:当收到数据后 RI 1(由硬件置一) 硬件置一后必须用软件…...

使用pixy计算群体遗传学统计量
1 数据过滤 过滤参数:过滤掉次等位基因频率(minor allele frequency,MAF)低于0.05、哈达-温伯格平衡(Hardy– Weinberg equilibrium,HWE)对应的P值低于1e-10或杂合率(heterozygosit…...

第十九章总结:Java绘图
19.1:Java绘图类 19.2:绘制图形 package nineteentn; import java.awt.*; import javax.swing.*; public class DrawCircle extends JFrame { private final int OVAL_WIDTH 80; // 圆形的宽 private final int OVAL_HEIGHT 80; // 圆形的高…...

Mybatis-Plus条件构造器QueryWrapper
Mybatis-Plus条件构造器QueryWrapper 1、条件构造器关系介绍 介绍 : 上图绿色框为抽象类 蓝色框为正常类,可创建对象 黄色箭头指向为父子类关系,箭头指向为父类 wapper介绍 : Wrapper : 条件构造抽象类࿰…...