http接口测试—自动化测试框架设计

news2024/10/7 11:21:11

一、测试需求描述

    对服务后台一系列的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 block
			e.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读入,默认情况下是true
				hutc.setDoInput(true);	
//				hutc.setAllowUserInteraction(true);
				
				// 开启流,写入数据data
				OutputStream 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 block
				e.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 stub
		try {
			this.excute(request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try {
			this.excute(request, response);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.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://www.coloradmin.cn/o/1208581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

manim更新

manim升级18.0 # 1 更新pip&#xff0c;推荐轮子下载 python -m pip install --upgrade pip 推荐方式下载轮子安装 首先尝试在中断更新pip&#xff0c;通过命令python -m pip install --upgrade pip 可能遇到以下情况 记录最新的pip轮子名 记录下上面pip的名称&#xff0c;去…

【开源】基于Vue和SpringBoot的校园失物招领管理系统

项目编号&#xff1a; S 006 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S006&#xff0c;文末获取源码。} 项目编号&#xff1a;S006&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系…

nacos集群配置(超完整)

win配置与linux一样&#xff0c;换端口或者换ip&#xff0c;文章采用的 linux不同IP&#xff0c;同一端口 节点ipportnacos1192.168.253.168848nacos2192.168.253.178848nacos3192.168.253.188848 单IP多个端口 1.复制两个&#xff0c;重命名 2.修改 conf目录下的 application…

教务必备:php+Mysql多条件都输对版万用查分系统

查分吧PHP多条件都输对版已有表万用查询系统 V1.8 极简单文件实现一至多条件都输对成绩录取分班等通用查询。 支持隐藏指定列、支持网址列显示为图片或链接、支持验证码开关。 适合学校或教育机构信息中心技术员使用&#xff0c;快速部署并用于已有数据表查询。 无后台管理…

python爬虫 之 JavaScript 简单基础

文章目录 在网页使用JavaScript 代码的方式常用的JavaScript 事件常用的JavaScript 对象 在网页使用JavaScript 代码的方式 在网页中使用 JavaScript 代码的方式主要有三种&#xff1a; 内联方式&#xff08;Inline&#xff09;&#xff1a; 在 HTML 文件中直接嵌入 JavaScrip…

【C++代码】最接近的三数之和,括号生成,合并两个有序链表,合并 K 个升序链表

题目&#xff1a;最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string res"";int index 0; f…

【JUC】五、线程的第三种创建方式 Callable

文章目录 1、Callable概述2、FutureTask Java基础中&#xff0c;了解到的创建线程的两种方式为&#xff1a; 继承Thread类实现Runnable接口 除了以上两种&#xff0c;还可以通过&#xff1a; Callable接口&#xff08;since JDK1.5&#xff09;线程池方式 1、Callable概述 …

你的Edge浏览器难道不需要一个好看的浏览器起始页嘛

这是我登录后&#xff0c;并且上传了个人壁纸的页面 Br标签页 一 . 我们来看看界面和功能1.注册登录2.首页及右键功能3.添加小组件和app网址4.切换壁纸5. 计划页面 二 . Edge浏览器安装和chrome&#xff08;谷歌&#xff09;浏览器安装1. Edge浏览器安装2. chrome&#xff08;谷…

Ubuntu安装mysql(解决ubuntu Access denied for user ‘root‘@‘localhost‘报错)

1、安装mysql sudo apt-get install mysql-server 上述命令会安装以下包&#xff1a; apparmor mysql-client-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码&#xff0c;设…

Linux系统编程——进程的创建

函数名 fork&#xff1a;创建一个子进程 函数原型 pid_t fork(void); 调用该函数时&#xff0c;需包含以下头文件 #include <unistd.h>返回值 fork函数调用成功&#xff0c;返回两次PID &#xff08;1&#xff09;返回值为0&#xff0c;代表当前进程是子进程 &am…

笔记:如何用趋动云GPU线上跑AI项目实践-部署DragGan模型

1.创建项目 1&#xff09;进入趋动云用户工作台&#xff0c;在当前空间处选择注册时系统自动生成的空间&#xff08;其他空间无免费算力&#xff09;&#xff1b; 2&#xff09;点击 快速创建&#xff0c;选择 创建项目&#xff0c;创建新项目&#xff1b; 3&#xff09;填写…

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

RT-Thread系列10——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

【MATLAB源码-第76期】基于matlab的OCDM系统在AWGN信道下理论误码率和实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交线性调频分频复用&#xff08;OCDM&#xff0c;Orthogonal Chirp Division Multiplexing&#xff09;是一种无线通信技术&#xff0c;它基于啁啾信号的原理。啁啾信号是一种频率随时间变化的信号&#xff0c;通常频率是线…

Ant Design Vue Select下拉框内容显示不全问题解决

默认情况下&#xff0c;当下拉框的内容长度过长时&#xff0c;会被折叠&#xff0c;这比较影响用户体验&#xff0c;查了下文档&#xff0c;看到有一个属性可以解决这个问题&#xff1a; 没设置的下拉效果&#xff1a; 设置完之后&#xff1a;dropdownMatchSelectWidth{false}&…

在Qt设计师(Qt Designer )控件面板加入自定义控件

目录 1. 问题的提出 2. 本次开发环境说明 3. 具体实现 4. 注意的问题 5. 参考链接 1. 问题的提出 在Qt开发中&#xff0c;经常利用Qt设计师&#xff08;Qt Designer &#xff09;把界面设计好&#xff0c;将界面放到ui文件中&#xff0c;将逻辑处理放到cpp文件中&#xff…

记录第一次利用CVE-2023-33246漏洞实现RocketMQ宿主机远程代码执行的兴奋

我依然记得自己第一次发现xss漏洞时候的兴奋: 我也记得自己第一次发现sql输入时候的快乐: 直到最近我终于收获了人生的第一个远程代码执行漏洞的利用&#xff08;RCE:remote code execute&#xff09;&#xff0c;虽然这个漏洞的危害远超过了前两个&#xff0c;但是快乐不如前…

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

微信小程序:tabbar、事件绑定、数据绑定、模块化、模板语法、尺寸单位

目录 1. tabbar 1.1 什么是tabbar 1.2 配置tabbar 2. 事件绑定 2.1 准备表单 2.2 事件绑定 2.3 冒泡事件及非冒泡事件 3. 数据绑定 3.1 官方文档 4. 关于模块化 5. 模板语法 6. 尺寸单位 1. tabbar 1.1 什么是tabbar 下图中标记出来的部分即为tabbar&#xff1a…

2023年华为杯数学建模E题——代码复盘(第一问)

2023年华为杯数学建模E题 代码复盘 写在最前面目录问题1a计算时间间隔思路说明代码输出结果 插值求解思路代码输出结果 绘图绘制3D图&#xff08;待修改&#xff09; 问题1b数据预处理思路代码 模型训练思路代码输出结果网格调参代码输出结果 写在最前面 超开心又有点遗憾 结果…