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 on

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

pause

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=payload
    resp=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 = inData
    resp = 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()  # 单位是s
    endTime = starTime + timeout
    cnt=0#查询的次数--初始值为0
    # 判断查询时间是否超时
    while time.time()<endTime:
        resp = requests.get(url, params=payload)
        cnt+=1
        # 如果有响应数据,直接结束循环,break
        if resp.text:
            print(f"第{cnt}次查询,已有结果,退出查询>>>",resp.text)
            break
        else:
            print(f'第{cnt}次查询,暂无结果,请耐心等待>>>')
        time.sleep(5)#等5s
    print('====该查询函数执行完毕===')
    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 = inData
    resp = 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()  # 单位是s
    endTime = starTime + timeout
    cnt=0#查询的次数--初始值为0
    # 判断查询时间是否超时
    while time.time()<endTime:
        resp = requests.get(url, params=payload)
        cnt+=1
        # 如果有响应数据,直接结束循环,break
        if resp.text:
            print(f"第{cnt}次查询,已有结果,退出查询>>>",resp.text)
            break
        else:
            print(f'第{cnt}次查询,暂无结果,请耐心等待>>>')
        time.sleep(5)#等5s
    print('====该查询函数执行完毕===')
    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}---正在执行其他接口')
    #--------------------------

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小红书的影视剧泥土刷剧5天涨千粉7天接商单轻轻松松月入了万没脑子运送游戏玩法,新手也可以快速上手

大家好&#xff0c;今天我将为大家介绍一个项目&#xff1a;在小红书上通过观看和分享影视剧内容&#xff0c;五天涨千粉&#xff0c;七天接商业订单&#xff0c;轻松月入过万。这个项目的玩法简单易学&#xff0c;即使是新手也能快速上手。 下载 地 址 &#xff1a; laoa1.c…

【网络安全】系统0day分析

前言 起因看见通告&#xff0c;描述是通过/lfw/core/rpc接口访问到PortalSpecServiceImpl类中的createSkinFile方法。 补丁名称&#xff1a;patch_portal65_lfw任意文件上传漏洞 补丁编码&#xff1a;NCM_NC6.5_000_109902_20240301_GP_281362040 【386G《黑客&网络安全入…

基于STM32的蓝牙小车(虚拟串口模拟)的Proteus仿真

文章目录 一、前言二、仿真图1.要求2.思路3.画图3.1 电源部分3.2 超声波测距部分3.3 电机驱动部分3.4 按键部分3.5 蓝牙部分3.6 显示屏部分3.7 整体 4.仿真5.软件 三、总结 一、前言 proteus本身并不支持蓝牙仿真&#xff0c;这里我采用虚拟串口的方式来模拟蓝牙控制。 这里给…

医院敏感文件交互 如何保障安全和效率?

医院会产生大量的敏感文件&#xff0c;这些敏感文件交互时&#xff0c;都需要使用特殊的手段&#xff0c;来保障数据的安全性。 医院的敏感数据主要包括以下几类&#xff1a; 1、患者基本信息&#xff1a;包括患者的姓名、身份证号码、户籍地或现住址、联系方式、文化程度、既…

jar包做成Windows Service 服务,不能访问网络映射磁盘

在Windows操作系统中&#xff0c;系统服务&#xff08;Services&#xff09;、计划任务&#xff08;Scheduled Tasks&#xff09;以及很多系统调用都是以SYSTEM系统账号进行操作的。用 net use 挂载&#xff0c;或者在文件管理器上直接挂载&#xff0c;挂载卷是以 Administrato…

504网关超时可能是哪些原因导致

当前随时互联网的发展普及&#xff0c;我们经常会使用到网站服务&#xff0c;许多网站为了提高打开速度&#xff0c;都会接入使用CDN。当我们在浏览网页或使用网络服务时&#xff0c;有时候可能有遇到网站打不开的情况&#xff0c;出现各式各样的错误代码&#xff0c;其中504网…

书生·浦语 大模型(学习笔记-5)XTuner 微调 LLM:1.8B、多模态、Agent

一&#xff1a;两种微调 增量与训练和指令微调的区别 二、数据的一生 原始数据转换为标准格式数据 添加对话模板&#xff0c;直接调用即可&#xff0c;会拼接 三、微调方案 三种加载对比 四、XTuner 五、8GB 显存玩转 LLM 五、InternLM2 1.8B模型&#xff08;相关知识&#x…

【火柴题】509移动两根火柴变成最大的数字

题目 509移动两根火柴变成最大的数字 <font face"DS-Digital" size"6">5&thinsp;0&thinsp;9</font>答案 <font face"DS-Digital" size"6">9&thinsp;1&thinsp;1&thinsp;8&thinsp;</font…

【JavaScript】Mockjs

基础语法 <script src"https://cdn.bootcdn.net/ajax/libs/Mock.js/1.0.0/mock-min.js"></script> <script>let mockData Mock.mock({age|10-50: 1, // 此时生成对象的 age 属性会是 10-50 之间的数 1 此时只是用来确定类型arr|5-10: [{id|1: 1,…

物联网五层架构:每一层都扮演着不可或缺的角色——青创智通

物联网五层架构涵盖了感知层、网络层、数据层、应用层和业务层&#xff0c;每一层都扮演着不可或缺的角色&#xff0c;共同构成了物联网的完整生态系统。下面我们将详细探讨这五层架构的功能和特点。 首先&#xff0c;感知层是物联网的起点&#xff0c;负责获取和识别各种物理世…

3DTiles特性与内容解析

一篇19年整理的比较老的笔记了。更多精彩内容尽在数字孪生平台。 瓦片种类 3DTiles瓦片有多种类型&#xff1a; b3dm(Batched 3D Model&#xff0c;批量3D模型) b3dm瓦片存储了多个个体&#xff0c;b3dm中的glb代表的实际对象应该具有相同的种类但是可能数据内容不同。b3dm…

ROS摄像机标定

文章目录 一、环境准备二、摄像头标定2.1 为什么要标定2.2 标定前准备2.2.1 标定板2.2.2 摄像头调焦 2.3 开始标定2.4 测试标定结果 总结参考资料 一、环境准备 安装usb_cam相机驱动 sudo apt-get install ros-noetic-usb-cam 安装标定功能包 sudo apt-get install ros-noet…

力扣HOT100 - 108. 将有序数组转换为二叉搜索树

解题思路&#xff1a; 二叉搜索树一般使用中序遍历 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums,0,nums.length-1);}public TreeNode helper(int[] nums,int left,int right){if(left>right) return null;//确定根节点//总是选择中…

微软发布Phi-3,手机上就能跑,是时候聊聊小型语言模型了|TodayAI

微软公司最近宣布推出了其最新开发的最新AI语言模型&#xff0c;名为Phi-3。这款小型语言模型&#xff08;SLMs&#xff09;在市场上以其卓越的性能和成本效率获得关注&#xff0c;尤其在语言处理、推理、编程及数学基准测试方面表现出色&#xff0c;超越了同等规模甚至更大规模…

2024年教你学会如何把学浪视频下载到本地

今年是2024年&#xff0c;依然有很多小伙伴想下载学浪却不知道怎么下载&#xff0c;本文就教大家如何使用小浪助手工具下载学浪视频 小浪助手工具我已经打包好了&#xff0c;有需要的自己取一下 学浪下载工具链接&#xff1a;https://pan.baidu.com/s/1-axc7xDtwU_KtupCe52sV…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

你如何看待AIGC技术?

你如何看待AIGC技术&#xff1f; AIGC技术&#xff08;Artificial Intelligence Generated Content&#xff09;是指由人工智能生成的内容。它在许多领域都有应用&#xff0c;包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力&#xff0c;但也需要注…

IP6505T最大输出24W,集成11种快充输出协议的SOC IC 为车载充电器、快充适配器、智能排插提供完整的解决方案

IP6505T产品概述&#xff1a; IP6505T是一款集成同步开关的降压转换器、 支持 11 种输出快充协议&#xff0c;为车载充电器、快充适配 器、智能排插提供完整的解决方案。内置功率 MOS&#xff0c;输入电压范围是 4.5V 到 32V&#xff0c;输出电压范围是 3V 到 12V&#xff0c;…

C语言编程题_3D接雨水

接雨水的题目描述如下。 (1) 2D接雨水&#xff1a; 字节员工是不是个个都会接雨水 &#xff1b; (2) 3D接雨水&#xff1a; 407. 接雨水 II &#xff1b; (3) 3D接雨水&#xff1a; 字节人都会的 3D接雨水 。 问题描述 难度&#xff1a;困难 给你一个 m x n 的矩阵&#xff…

企业有哪些常见网络需求场景?

企业的网络场景需求多种多样&#xff0c;主要取决于其业务规模、运营模式、技术应用等因素。 常见的企业网络场景需求 办公网络需求&#xff1a; 高速稳定的内部网络连接&#xff0c;以支持员工日常办公、数据传输和资源共享。 无线办公网络覆盖&#xff0c;以便员工在会议室…