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…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...