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

  1. package client;

  2. import java.io.FileInputStream;

  3. import java.io.FileNotFoundException;

  4. import java.io.FileOutputStream;

  5. import java.util.ArrayList;

  6. import java.util.List;

  7. import org.apache.poi.hssf.usermodel.HSSFCell;

  8. import org.apache.poi.hssf.usermodel.HSSFRichTextString;

  9. import org.apache.poi.hssf.usermodel.HSSFRow;

  10. import org.apache.poi.hssf.usermodel.HSSFSheet;

  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;

  12. import org.apache.poi.poifs.filesystem.POIFSFileSystem;

  13. public class ExcelUtil {

  14. //读取Excel中数据

  15. public static List<Param> read() throws Exception{

  16.  HSSFWorkbook wb = new HSSFWorkbook();

  17.  HSSFSheet s = wb.createSheet();

  18.  HSSFRow row = s.createRow(0);

  19.  HSSFCell cell = row.createCell((int)0,0);

  20.  //------------从xls读出数据

  21.  wb = new HSSFWorkbook(new FileInputStream("D:\\learn\\test.xls"));

  22.  s = wb.getSheetAt(0);

  23.  

  24.  //获得EXCEL行数

  25.  int rowNums=s.getLastRowNum();

  26.  //获得Excell列数

  27.  //int columnNum=r.getPhysicalNumberOfCells();

  28.  

  29.  List<Param> params=new ArrayList<Param>();

  30.  for(int i=1;i<=rowNums;i++){

  31.  HSSFRow r = s.getRow(i);

  32.  cell=r.getCell(0);

  33.  Param param= new Param();

  34.  param.setNo(r.getCell(0).getStringCellValue());

  35.  param.setName(r.getCell(1).getStringCellValue());

  36.  param.setAge(r.getCell(2).getStringCellValue());

  37.  param.setSex(r.getCell(3).getStringCellValue());

  38.  param.setExpResu(r.getCell(4).getStringCellValue());

  39. //  System.out.println(cell.getRichStringCellValue());

  40.  params.add(param);

  41.  }

  42.  return params;

  43. }

  44. /**

  45.   * 写入Excel,在任意坐标处写入数据。

  46.   * String value:你要输入的内容

  47.   * int x :行坐标,Excel从 0 算起

  48.   * int y   :列坐标,Excel从 0 算起

  49.   */

  50. public static void writeCell(String filePath,int x,int y,String value) {

  51. try {

  52. // 创建Excel的工作书册 Workbook,对应到一个excel文档

  53. HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(filePath));

  54. HSSFSheet sheet=wb.getSheetAt(0);

  55. HSSFRow row=sheet.getRow(x);

  56. HSSFCell cell=row.getCell((short) y);

  57. cell.setCellValue(value);

  58. FileOutputStream os;

  59. os = new FileOutputStream(filePath);

  60. wb.write(os);

  61. os.close();

  62. } catch (Exception e) {

  63. e.printStackTrace();

  64. }

  65. }

  66. }

2、JsonsUtil.java

  1. package client;

  2. import java.text.ParseException;

  3. import java.util.ArrayList;

  4. import java.util.HashMap;

  5. import java.util.List;

  6. import java.util.Map;

  7. import org.json.JSONArray;

  8. import org.json.JSONException;

  9. import org.json.JSONObject;

  10. /**

  11.  * 使用json-lib构造和解析Json数据

  12.  */

  13. public class JsonsUtil {

  14.     /**将Bean转换成Map

  15.      * 将Map转换Json数据

  16.      */public static String BuildJson(Param param) throws JSONException {

  17.         

  18.       Map<String, String> map1 = new HashMap<String, String>();

  19.          map1.put("no", param.getNo());

  20.          map1.put("name", param.getName());

  21.          map1.put("age", param.getAge());

  22.          map1.put("sex", param.getSex());

  23. //         map1.put("expResu", param.getExpResu());

  24.       // JSON格式数据解析对象

  25.         JSONObject jo = new JSONObject();

  26.         // 将Map转换为JSONArray数据

  27.         JSONArray ja = new JSONArray();

  28.         ja.put(map1);

  29. //        System.out.println("JSONArray对象数据格式:"+ja.toString());

  30.         jo.put("map", ja);

  31. //        System.out.println("最终构造的JSON数据格式:"+jo.toString());

  32.         return jo.toString();

  33.     }

  34.     /**

  35.      * 解析Json数据

  36.      *

  37.      */public static JSONArray ParseJson(String jsonString) throws JSONException,

  38.             ParseException {

  39.         JSONObject jo = new JSONObject(jsonString);

  40.         JSONArray ja = jo.getJSONArray("map");

  41. //        System.out.println(ja.getJSONObject(0).getString("name"));

  42.         return ja;

  43.     }

  44. }

3、Param.java

  1. package client;

  2. public class Param {

  3. String no;//编号

  4. String name;//姓名

  5. String age;//年龄

  6. String sex;//性别

  7. String expResu;//期望结果

  8. String actResu;//实际结果

  9. String pass;//是否通过

  10. String desc;//描述

  11. public String getName() {

  12. return name;

  13. }

  14. public void setName(String name) {

  15. this.name = name;

  16. }

  17. public String getNo() {

  18. return no;

  19. }

  20. public void setNo(String no) {

  21. this.no = no;

  22. }

  23. public String getAge() {

  24. return age;

  25. }

  26. public void setAge(String age) {

  27. this.age = age;

  28. }

  29. public String getSex() {

  30. return sex;

  31. }

  32. public void setSex(String sex) {

  33. this.sex = sex;

  34. }

  35. public String getExpResu() {

  36. return expResu;

  37. }

  38. public void setExpResu(String expResu) {

  39. this.expResu = expResu;

  40. }

  41. public String getActResu() {

  42. return actResu;

  43. }

  44. public void setActResu(String actResu) {

  45. this.actResu = actResu;

  46. }

  47. public String getPass() {

  48. return pass;

  49. }

  50. public void setPass(String pass) {

  51. this.pass = pass;

  52. }

  53. public String getDesc() {

  54. return desc;

  55. }

  56. public void setDesc(String desc) {

  57. this.desc = desc;

  58. }

  59. }

4、CompareRes.java

  1. package client;

  2. public class CompareRes {

  3. int actResuNo=5;//测试结果在第五例

  4. int passNo=6;//对比结果在第六列

  5. public  void compare(String filePath,Param param,String actResu){

  6. ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),actResuNo,actResu);

  7. if(param.getExpResu().trim().equals(actResu)){

  8. ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),passNo,"Y");

  9. }else{

  10. ExcelUtil.writeCell(filePath,Integer.parseInt(param.getNo()),passNo,"N");

  11. }

  12. }

  13. }

5、TestClient .java

  1. package client;

  2. import java.io.BufferedReader;

  3. import java.io.InputStream;

  4. import java.io.InputStreamReader;

  5. import java.io.OutputStream;

  6. import java.net.HttpURLConnection;

  7. import java.net.URL;

  8. import java.net.URLConnection;

  9. import java.util.List;

  10. public class TestClient {

  11. public static void main(String[]agrs){

  12. TestClient a=new TestClient();

  13. try {

  14. a.client();

  15. } catch (Exception e) {

  16. // TODO Auto-generated catch block

  17. e.printStackTrace();

  18. }

  19. }

  20. public void client() throws Exception{

  21. List<Param> params = ExcelUtil.read();

  22. for(Param pa:params){

  23. try {

  24. // 接报文的地址

  25. String filePath="D:\\learn\\test.xls";

  26. String param= new JsonsUtil().BuildJson(pa);

  27. URL serverUrl= new URL("http://localhost:8090/lctest/TestServer");

  28. URLConnection uct= serverUrl.openConnection();

  29. HttpURLConnection hutc=(HttpURLConnection)uct;

  30. // 设置报文参数

  31. hutc.setRequestMethod("POST");

  32. // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 http正文内,因此需要设为true, 默认情况下是false; 

  33. hutc.setDoOutput(true);

  34. // 设置是否从httpUrlConnection读入,默认情况下是true

  35. hutc.setDoInput(true);

  36. // hutc.setAllowUserInteraction(true);

  37. // 开启流,写入数据data

  38. OutputStream out=hutc.getOutputStream();

  39. out.write(param.getBytes("UTF-8"));

  40. out.flush();

  41. out.close();

  42. // 获取返回的数据

  43. StringBuffer buffer=new StringBuffer();

  44. BufferedReader reader = null;

  45. InputStream ins=hutc.getInputStream();

  46. reader = new BufferedReader(new InputStreamReader(ins,"UTF-8"));

  47. String sg=reader.readLine();

  48. if (sg!= null){

  49.            buffer.append(sg);

  50.      }

  51.         System.out.println("接收返回值:" + buffer);

  52.         new CompareRes().compare(filePath, pa, buffer.toString());

  53. } catch (Exception e) {

  54. // TODO Auto-generated catch block

  55. e.printStackTrace();

  56. }

  57. }

  58. }

  59. }

6、TestServer

  1. public class TestServer extends HttpServlet {

  2. private static final long serialVersionUID = 1L;

  3.  private static JSONArray ja;

  4.        

  5.     /**

  6.      * @see HttpServlet#HttpServlet()

  7.      */

  8.     public TestServer() {

  9.         super();

  10.         // TODO Auto-generated constructor stub

  11.     }

  12. /**

  13.  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

  14.  */

  15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  16. // TODO Auto-generated method stub

  17. try {

  18. this.excute(request, response);

  19. } catch (Exception e) {

  20. // TODO Auto-generated catch block

  21. e.printStackTrace();

  22. }

  23. }

  24. /**

  25.  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

  26.  */

  27. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  28. // TODO Auto-generated method stub

  29. try {

  30. this.excute(request, response);

  31. } catch (Exception e) {

  32. // TODO Auto-generated catch block

  33. e.printStackTrace();

  34. }

  35. }

  36. public void excute(HttpServletRequest request,HttpServletResponse response) throws Exception{

  37. request.setCharacterEncoding("utf-8");

  38. response.setCharacterEncoding("UTF-8");

  39. response.setContentType("text/xml");

  40. String method=request.getMethod();

  41. String url=request.getRequestURI();

  42. String param;

  43.        // 获取收到的报文

  44.         BufferedReader reader = request.getReader();

  45.         String line = "";

  46.         line = reader.readLine();

  47.         ja=new JsonsUtil().ParseJson(line);

  48. StringBuffer resultBuffer=new StringBuffer();

  49. resultBuffer.append("访问方式"+method+"访问成功");

  50. resultBuffer.append("接收到的数据:"+line);

  51. PrintWriter out =response.getWriter();

  52. out.println(resultBuffer.toString());

  53. out.flush();

  54. out.close();

  55. }

  56. }

7、web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <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">

  3.   <servlet>

  4.     <servlet-name>TestServer</servlet-name>

  5.     <servlet-class>com.servlet.TestServer</servlet-class>

  6.   </servlet>

  7.   <servlet-mapping>

  8.     <servlet-name>TestServer</servlet-name>

  9.     <url-pattern>/lctest/TestServer</url-pattern>

  10.   </servlet-mapping>

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

      视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/245151.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C4.5决策树的基本建模流程

C4.5决策树的基本建模流程 作为ID3算法的升级版&#xff0c;C4.5在三个方面对ID3进行了优化&#xff1a; &#xff08;1&#xff09;它引入了信息值&#xff08;information value&#xff09;的概念来修正信息熵的计算结果&#xff0c;以抑制ID3更偏向于选择具有更多分类水平…

SpringCloud Aliba-Seata【下】-从入门到学废【8】

目录 1.数据库创建 1.seata_account库下建表 2.seata_order库下建表 3.seata_storage库下建表 4.在每个库下创建回滚日志 2.创建订单模块 2.1建工程 2.2加pom 2.3改yml 2.4file.conf 2.5registry.conf 2.6domain 2.7Dao 2.8Service 2.9controller 2.10confi…

BGP路由反射-数据中心IDC项目经验

一、背景描述 R1,R2,R3在AS200区域内&#xff0c;R1和R2,R1和R3建立OSPF&#xff0c;宣告接口互联. AS200区域内&#xff0c;R1和R2建立IBGP, R1和R3建立IBGP R2和R4建立EBGP, R3和R5建立EBGP。 网络拓扑&#xff1a; 二、故障现象 R1和R2可以收到来自AS100区域R4的E…

pytorch实战-6手写数字加法机-迁移学习

1 概述 迁移学习概念&#xff1a;将已经训练好的识别某些信息的网络拿去经过训练识别另外不同类别的信息 优越性&#xff1a;提高了训练模型利用率&#xff0c;解决了数据缺失的问题&#xff08;对于新的预测场景&#xff0c;不需要大量的数据&#xff0c;只需要少量数据即可…

Unity通用渲染管线升级URP、HDRP

Unity通用渲染管线升级URP、HDRP 一、Build-in Pipline升级到 URP 一、Build-in Pipline升级到 URP 安装URP包 升级所有材质&#xff08;升级完成后材质会变成紫红色&#xff0c;Shader丢失&#xff0c;此为正常现象&#xff09; 创建 UniversalRenderPipelineAsset 配置文…

Nacos 在云原生架构下的演进

作者&#xff1a;之卫 背景 Nacos 提供的最核心能力是动态服务发现与动态配置管理能力&#xff0c;在云原生环境下&#xff0c;借助云产品&#xff0c;如 EDAS&#xff08;企业级分布式应用服务&#xff09;平台中&#xff0c;我们可以很轻松地使用 K8s 来托管 Nacos 体系的微…

蓝桥杯(Python)每日练Day5

题目 OJ1229 题目分析 题目完全符合栈的特征&#xff0c;后进先出。如果能够熟练使用列表的9种方法那么这道题很容易解出。 题解 a[]#存衣服 nint(input()) for i in range(n):llist(input().split())#判断每一步的操作if len(l[0])2:a.append(l[1])else:while a.pop()!l…

大数据平台红蓝对抗 - 磨利刃,淬精兵!

背景 目前大促备战常见备战工作&#xff1a;专项压测&#xff08;全链路压测、内部压测&#xff09;、灾备演练、降级演练、限流、巡检&#xff08;监控、应用健康度&#xff09;、混沌演练&#xff08;红蓝对抗&#xff09;&#xff0c;如下图所示。随着平台业务越来越复杂&a…

LabVIEW探测器CAN总线系统

介绍了一个基于FPGA和LabVIEW的CAN总线通信系统&#xff0c;该系统专为与各单机进行系统联调测试而设计。通过设计FPGA的CAN总线功能模块和USB功能模块&#xff0c;以及利用LabVIEW开发的上位机程序&#xff0c;系统成功实现了CAN总线信息的收发、存储、解析及显示功能。测试结…

Obsidian笔记软件结合cpolar实现安卓移动端远程本地群晖WebDAV数据同步

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

使用Robot Framework实现多平台自动化测试

基于Robot Framework、Jenkins、Appium、Selenium、Requests、AutoIt等开源框架和技术&#xff0c;成功打造了通用自动化测试持续集成管理平台&#xff08;以下简称“平台”&#xff09;&#xff0c;显著提高了测试质量和测试用例的执行效率。 01、设计目标 平台通用且支持不…

Hadoop基本概论

目录 一、大数据概论 1.大数据的概念 2.大数据的特点 3.大数据应用场景 二、Hadoop概述 1.Hadoop定义 2.Hadoop发展历史 3.Hadoop发行版本 4.Hadoop优势 5.Hadoop1.x/2.x/3.x 6.HDFS架构 7.Yarn架构 8.MapReduce架构 9.大数据技术生态体系 一、大数据概论 1.大数…

docker 基础手册

文章目录 docker 基础手册docker 容器技术镜像与容器容器与虚拟机docker 引擎docker 架构docker 底层技术docker 二进制安装docker 镜像加速docker 相关链接docker 生态 docker 基础手册 docker 容器技术 开源的容器项目&#xff0c;使用 Go 语言开发原意“码头工人”&#x…

[极客大挑战 2019]LoveSQL1

万能密码测试&#xff0c;发现注入点 注意这里#要使用url编码才能正常注入 测试列数&#xff0c;得三列 查看table&#xff0c;一个是geekuser另一个是l0ve1ysq1 查看column&#xff0c;有id&#xff0c;username&#xff0c;password&#xff0c;全部打印出来&#xff0c;…

【数据结构】 顺序表的基本操作 (C语言版)

一、顺序表 1、顺序表的定义&#xff1a; 线性表的顺序存储结构&#xff0c;即将表中的结点按逻辑顺序依次存放在一组地址连续的存储单元里。这种存储方式使得在逻辑结构上相邻的数据元素在物理存储上也是相邻的&#xff0c;可以通过数据元素的物理存储位置来反映其逻辑关系。…

SSL证书DV和OV的区别

SSL证书是数字证书的一种&#xff0c;配置在服务器上&#xff0c;起到文件信息传输加密的作用。由受信任的数字证书颁发机构CA在验证服务器身份后颁发&#xff0c;防止第三方窃取或篡改信息。 在选择SSL证书的过程中&#xff0c;一般要注意选择的SSL证书的等级。常见有DV和OV证…

单片机面向对象思维的架构:时间轮片法

今天分享一篇单片机程序框架的文章。 程序架构重要性 很多人尤其是初学者在写代码的时候往往都是想一点写一点&#xff0c;最开始没有一个整体的规划&#xff0c;导致后面代码越写越乱&#xff0c;bug不断。 最终代码跑起来看似没有问题(有可能也真的没有问题)&#xff0c;但…

清越 peropure·AI 国内版ChatGP新功能介绍

当OpenAI发布ChatGPT的时候,没有人会意识到,新一代人工智能浪潮将给人类社会带来一场眩晕式变革。其中以ChatGPT为代表的AIGC技术加速成为AI领域的热门发展方向,推动着AI时代的前行发展。面对技术浪潮,清越科技(PeroPure)立足多样化生活场景、精准把握用户实际需求,持续精确Fin…

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …

255:vue+openlayers 加载tomtom地图(多种形式)

第255个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…