15.接口自动化学习-Mock(挡板/测试桩)

场景:

新需求还未开发时,使用mock提早介入测试,等后边开发后,进行调试

  • 三方接口返回效率低,使用mock技术走通流程

1.mock方式

(1)如果会写django或flask,可以写简单对应的代码
(2)一些接口工具具备这个功能(postman)
(3)一些现成的框架直接使用:Moco框架
构造一个依赖的服务,并给予他预期的服务返回值,适用范围广,更加适合 集成测试
Moco框架
类似一个Mock的工具框架,一个简单搭建模拟服务器的程序库/工具,下载就是一个jar包

特点:

  • 简单的配置request、response等即可满足要求
  • 支持http、https、socket协议,可以说是非常的灵活性
  • 支持在request中设置Headers,Cookies,StatusCode等
  • 对get\post\put\delete等请求方式都支持
  • 无需环境配置,有Java环境即可
  • 修改配置后,立即生效。只需要维护接口,也就是契约即可
  • 支持多种数据格式,如JSON\Text\XML\File等
  • 可与其他工具集成,如Junit\Maven等

2.Mock服务搭建

(1)需要安装jdk
(2)下载moco的jar包
moco下载
提取码:8eem

(3)启动服务,jar包名称根据下载的jar包写
http代表这个模拟的是http请求,
-p 9090是定义端口号
-c test.json是编辑的json文件名
java -jar moco-runner-0.11.0-standalone.jar http -p 9090 -c test.json
如果cmd乱码就用:`
``java -jar -Dfile.encoding=utf-8 moco-runner-0.11.0-standalone.jar http -p 9090 -c demo.json```
(4)验证
/demo1:是json文件中定义的uri
访问:http://localhost:9090/demo1

3.Mock请求构建

start.bat


@echo onjava -jar -Dfile.encoding=utf-8 moco-runner-0.11.0-standalone.jar http -p 9090 -c demo.json
@echo offpause

demo.json

[{"description":"11","request":{"uri":"/shop","method":"Get"},"response":{"text":"Hello,baby"}	}
]

浏览器输入:http://127.0.0.1:9090/shop
在这里插入图片描述

4.配置不同的请求

(1)约定uri

[{"description":"约定uri","request":{"uri":"/shop"},"response":{"text":"Hello,baby"}	}
]

(2)约定请求参数

[{"description":"约定请求参数","request":{"queries":{"key1":"123","key2":"cvf"}},"response":{"text":"Hello,baby"}	}
]

(3)约定请求方法

[{"description":"约定请求方法","request":{"method":"DELETE"},"response":{"text":"Hello,baby"}	}
]

(4)约定请求头

[{"description":"约定请求头","request":{"headers":{"Content-Type":"application/xml"}},"response":{"text":"Hello,baby"}	}
]

(5)约定请求体参数-form

[{"description":"约定请求体参数-form","request":{"forms":{"key1":"anc"}},"response":{"text":"Hello,baby"}	}
]

(6)约定请求体参数-json

[{"description":"约定请求体参数-json","request":{"json":{"key1":"anc","key2":"anc"}},"response":{"text":"Hello,baby"}	}
]

(7)返回响应头和json

[{"description":"返回响应头和json","request":{"json":{"key1":"anc","key2":"anc"}},"response":{"headers":{"Content-Type":"application/json"},"json":{"code":"200"}}	}
]

代码测试

HOST = 'http://127.0.0.1:9090'
import requests
def test():url=f'{HOST}/shop_up'payload={'key':'abc'}# form格式:data=payload json格式:json=payloadresp=requests.post(url,json=payload)print(resp.text)if __name__ == '__main__':test()

要先执行jar包启动服务,在运行上述代码

5.异步接口实战

(1)同步和异步

同步:不利于性能提升,需要等待响应
在这里插入图片描述
异步:发送请求后,响应后续给出,可以先做其他的
eg:体检拿结果,可以A项做完后,直接做B项的同时等A的结果,不用先等A的结果,再去做B。

(2)异步接口实现

  • 业务场景
    店铺向平台申请退单请求
    平台接受请求,核实信息
    平台3个工作日内告知结果
  • 具体实现
    通过提交申请的接口给服务端
    服务器立即返回这个申请id
    后续使用查询的接口,带上id查询结果
    看是否有返回结果
  • mock+异步查询技术
    拿到申请和查询订单结果接口的文档,获取url、参数、响应等信息
    (1)申请退单接口
    在这里插入图片描述
HOST = 'http://127.0.0.1:9090'
import requests
import time
# ----------------1.创建申诉接口---------------
def create_order(inData):url = f'{HOST}/api/order/create/'payload = inDataresp = requests.post(url, json=payload)return resp.json()
# -------2.查询结果接口--------
"""
查询接口注意事项:
1.使用id去查--id是creat_order创建返回的
2.次数/频率--频率 interval
3.超时机制--timeout
"""
def get_order_result(orderID, interval=5, timeout=30):""":param orderID: 订单id:param interval: 查询频率:param timeout: 超时时间:return: 查询结果"""url = f'{HOST}/api/order/get_result/'payload = {"order_id": orderID}# 获取开始查询的时间和结束时间starTime = time.time()  # 单位是sendTime = starTime + timeoutcnt=0#查询的次数--初始值为0# 判断查询时间是否超时while time.time()<endTime:resp = requests.get(url, params=payload)cnt+=1# 如果有响应数据,直接结束循环,breakif resp.text:print(f"第{cnt}次查询,已有结果,退出查询>>>",resp.text)breakelse:print(f'第{cnt}次查询,暂无结果,请耐心等待>>>')time.sleep(5)#等5sprint('====该查询函数执行完毕===')return resp.text
if __name__ == '__main__':testData = {"user_id": "zz123","goods_id": "20240424","num": 1,"amount": 200.6}res = create_order(testData)print(res)id = res['order_id']# 2.调用查询接口res2 = get_order_result(id)print(res2)

结果:异步接口已经实现,但执行效率低
原因:
(1)查询接口使用sleep–5s,导致自动化测试效率低
优化:
(1)代码层面原因:当执行sleep()时,代码不会处理其他事情
requests.xx方法和sleep()属于io阻塞
深挖细节
cpu:

  • io阻塞模式
  • cpu密集性
    (2)具体解决方案
    改为多线程,等待的时候,做其他接口,等待时间到了之后,再回来继续执行下一步操作
    主线程:main–下面的代码
    子线程:就是get_order_result函数
HOST = 'http://127.0.0.1:9090'
import requests
import time
import threading #多线程--内置库# ----------------1.创建申诉接口---------------
def create_order(inData):url = f'{HOST}/api/order/create/'payload = inDataresp = requests.post(url, json=payload)return resp.json()# -------2.查询结果接口--------
"""
查询接口注意事项:
1.使用id去查--id是creat_order创建返回的
2.次数/频率--频率 interval
3.超时机制--timeout
"""
def get_order_result(orderID, interval=5, timeout=30):""":param orderID: 订单id:param interval: 查询频率:param timeout: 超时时间:return: 查询结果"""url = f'{HOST}/api/order/get_result/'payload = {"order_id": orderID}# 获取开始查询的时间和结束时间starTime = time.time()  # 单位是sendTime = starTime + timeoutcnt=0#查询的次数--初始值为0# 判断查询时间是否超时while time.time()<endTime:resp = requests.get(url, params=payload)cnt+=1# 如果有响应数据,直接结束循环,breakif resp.text:print(f"第{cnt}次查询,已有结果,退出查询>>>",resp.text)breakelse:print(f'第{cnt}次查询,暂无结果,请耐心等待>>>')time.sleep(5)#等5sprint('====该查询函数执行完毕===')return resp.text
if __name__ == '__main__':testData = {"user_id": "zz123","goods_id": "20240424","num": 1,"amount": 200.6}res = create_order(testData)print(res)id = res['order_id']#--------多线程操作---------#创建子线程"""threading.Thread(target,args)target:需要把哪一个函数做为子线程执行的任务,就写该函数名args:该函数需要传入的参数-以元组形式"""t1=threading.Thread(target=get_order_result,args=(id,))# 主线程如果结束或异常退出,子线程就直接退出t1.setDaemon(True)#守护线程t1.start()#---------这些是模拟其他接口的测试操作for one in range(20):time.sleep(1)#模拟其他接口执行的时间print(f'{one}---正在执行其他接口')#--------------------------

在这里插入图片描述

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

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

相关文章

Mysql--基础知识点--0.1--脏读、不可重复读、幻读

1 脏读、不可重复读、幻读 1.1 脏读 如果一个事务读到了另一个事务已修改且未提交的数据&#xff0c;则发生了脏读现象。 1.2 不可重复读 在一个事务里面多次读取同一个数据&#xff0c;若前后两次读到的数据不一致&#xff0c;则发生不可重复读现象。 1.3 幻读 在一个…

redis7 for windows的安装教程

本篇博客主要介绍redis7的windows版本下的安装教程 1.redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的&#xff0c;基于内存的数据结构存储系统&#xff0c;可用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希表、列…

【软考高项】二十六、范围管理基础内容

一、管理基础 产品范围和项目范围 产品范围强调结果&#xff0c;项目范围强调结果 管理的新实践 &#xff1a;需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收…

three.js 学习笔记 | 光线投射技术 - 包围盒(碰撞检测)

文章目录 three.js 学习笔记光线投射技术实现3D场景交互事件 THREE.Raycaster坐标系的转换案例&#xff1a;选中的模型变为红色 包围盒Box3 - 碰撞检测AABB包围盒辅助器Box3Helper案例1&#xff1a;创建AABB包围盒/包围球computeBoundingBox与boundingBox 搭配使用&#xff0c;…

vivado Aurora 8B/10B IP核(1)

Aurora 8B/10B IP 支持 Kintex -7, Virtex -7 FPGA GTP 和 GTH 收发器&#xff0c;Artix -7 FPGA GTP 收发器, Zynq -7000 GTP and GTP 收发器。Aurora 8B/10B IP core 可以工作于单工或者全双工模式。IP CODE的使用也非常简单&#xff0c;支持 AMBA总线的 AXI4-Stream 协议。…

字符串函数及其模拟实现

目录 strlen函数介绍模拟实现 strcpy函数介绍模拟实现 strcat函数介绍模拟实现 strcmp函数介绍模拟实现 strncpy函数介绍模拟实现 strncat函数介绍模拟实现 strncmp函数介绍模拟实现 strtokstrstr函数介绍模拟实现 strerrorperror strlen 函数介绍 函数介绍&#xff1a; 字符串…

Leetcode 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“a…

React真的好难用

我发现React就像个宗教一样&#xff0c;网络上总有一群信徒。信徒&#xff1a;React天下第一&#xff0c;谁也不能说他不好。 网络上大佬对React的评价一般有几类&#xff1a; React跟Vue比就是手动档和自动档的区别&#xff0c;高手都开手动档。—— 就一个破打工的&#xf…

cJSON的使用

文章目录 一、CJSON初识二、CJSON解析器基础三、CJSON解析数据JSON解析基础CJSON解析数组数据CJSON解析嵌套数据 五、创建JSON数据 一、CJSON初识 JSON (JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;常用于在网络之间传输数据。它是一种文本格式&#…

河南新办灌溉排涝乙级资质预算分析

河南新办灌溉排涝乙级资质的预算分析是一个涉及多方面因素的综合考量。以下是对该预算的详细分析&#xff1a; 首先&#xff0c;人员费用是预算中的重要组成部分。这包括聘请符合资质要求的技术人员、工程师和其他相关人员的薪酬、社保等费用。这些费用会根据所需人员的数量、资…

JavaScript云LIS系统源码 前端框架JQuery+EasyUI+后端框架MVC+SQLSuga大型医院云LIS检验系统源码 可直接上项目

JavaScript云LIS系统源码 前端框架JQueryEasyUI后端框架MVCSQLSuga大型医院云LIS检验系统源码 可直接上项目 云LIS系统概述&#xff1a; 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

视频输入c++ 调用 libtorch推理

1、支持GPU情况 libtorch 支持GPU情况比较奇怪&#xff0c;目前2.3 版本需要在链接器里面加上以下命令&#xff0c;否则不会支持gpu -INCLUDE:?ignore_this_library_placeholderYAHXZ 2 探测是否支持 加一个函数看你是否支持torch&#xff0c;不然不清楚&#xff0c;看到…

Hive函数详解

Hive 是一个建立在 Hadoop 上的数据仓库基础架构&#xff0c;它提供了类似于 SQL 的查询语言&#xff0c;称为 HiveQL&#xff0c;用于对存储在 Hadoop 分布式文件系统中的数据进行查询和分析。 1.函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Jav…

Web前端开发 小实训(一) 成绩分类统计

用于学生web前端开发课程实训练习&#xff0c;掌握基本语法和数据类型 实训目的 使用分支语句&#xff0c;完成分数统计与等级对比,通过输入框输入分数&#xff0c;可以根据分数多少划分等级。 参考思路&#xff1a; 分析题目&#xff1a;根据输入分数进行等级划分。 操作过…

springboot如何使用RedisTemplate

第一步&#xff1a;创建一个spring boot项目 第二步&#xff1a;pom导入redis相关依赖 <!--reids依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </depen…

Go语言中的goroutine调度是如何实现的?

文章目录 一、M:N调度模型二、GMP模型三、调度过程四、调度优化五、示例代码 在Go语言中&#xff0c;goroutine是一种轻量级的线程&#xff0c;它使得并发编程变得更加简单和高效。而goroutine的调度则是Go运行时&#xff08;runtime&#xff09;系统负责的一个核心任务&#x…

Postman,一个功能强大的API开发和测试工具

最近有小伙伴说在找 postman 的使用教程&#xff0c;案例等文章。 那么今天我就来写一个。 Postman 是一个功能强大的 API 开发和测试工具&#xff0c;它提供了丰富的功能&#xff0c;帮助开发人员更好地管理、测试和文档化 API。无论是单独开发还是团队协作&#xff0c;Postma…

[1688]jsp工资投放管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 工资投放管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

黑马面试篇

课程地址&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;_哔哩哔哩_bilibili 课程名称&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频…