当前位置: 首页 > news >正文

自动化测试Mock神器:轻松模拟HTTP请求!

1、背景

在日常测试过程中或者研发开发过程中,目前接口暂时没有开发完成,测试人员又要提前介入接口测试中,测试人员不仅仅只是简单的编写测试用例,也可以通过一些mock的方法进行来提前根据接口测试的情况进行模拟返回接口的信息,进行模拟接口各种场景的异常。

mock是指模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。

一般有两种场景:

前端对后端接口的 mock,

后端服务之间的测试中涉及的mock,常常发生在单元测试的时候。

前端mock可以通过一些工具来完成:

使用抓包工具Fiddler,Charles 来实现,通过修改代理返回的数据,实现多种场景的测试。

使用一些API管理工具来模拟,比如yapi,Easy Mock 等

当然有编码能力的,也可以使用node.js,python的fastAPI来模拟

后端的 Mock 则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到 Mock。

对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用 Mock 来模拟。

今天给大家介绍一款Python Mock工具:requests-mock

2、工具介绍

requests-mock是一个用于模拟HTTP请求的Python库,它可以帮助开发人员在测试和开发过程中模拟各种HTTP请求和响应。使用requests-mock,可以用来模拟接口的各种场景,就像真正的服务器一样。

特点:

灵活性:requests-mock允许开发人员根据需要灵活地定义虚拟的HTTP响应,包括状态码、头部信息、响应体等。

易用性:requests-mock的API设计简单易用,开发人员可以很容易地集成到他们的测试和开发工作流程中。

可扩展性:requests-mock支持自定义的响应生成器和请求匹配器,可以满足各种复杂的测试需求。

适用场景:

单元测试:

开发人员可以使用requests-mock模拟HTTP请求和响应,以便在单元测试中测试他们的代码。

集成测试:

在进行集成测试时,requests-mock可以帮助开发人员模拟外部服务的行为,以验证系统的整体功能。

开发过程中的快速原型验证:

在开发过程中,开发人员可以使用requests-mock快速验证他们的代码对于不同的HTTP响应的处理情况。

通过Mock能够帮助我们模拟系统各种行为,包括网络请求、文件读写、数据库操作、系统时间等等。这能够在测试代码时降低对外部依赖的需求,从而提高代码的可测试性。

3、安装

安装必要的模块:requests, requests_mock。

  1. pip install requests

  2. pip install requests_mock

4、使用示例

示例一:使用Mock模拟GET、Post请求

以下是一个使用requests-mock模拟GET请求和POST请求的示例:

  1. import requests

  2. import requests_mock

  3. # 模拟GET请求

  4. with requests_mock.Mocker() as m:

  5. # 模拟post请求内容,返回的json格式,返回码为200

  6. m.get('http://example.com/api/data', json={"name":"测试开发技术"}, status_code=200)

  7. response = requests.get('http://example.com/api/data')

  8. print(response.json())

  9. # 模拟POST请求

  10. with requests_mock.Mocker() as m:

  11. # 模拟post请求内容,返回的json格式,返回码为200

  12. m.post('http://example.com/api/submit',json={"name":"测试开发技术"}, status_code=201)

  13. response = requests.post('http://example.com/api/submit', data={'key': 'value'})

  14. print(response.json())

在上面的示例中,我们使用requests-mock模拟了一个GET请求和一个POST请求。在每个模拟的上下文中,我们使用requests_mock.Mocker()创建了一个模拟器,并使用m.get()和m.post()分别定义了GET请求和POST请求的模拟响应。然后,我们使用requests库发送了实际的GET和POST请求,并打印了模拟的响应内容。

示例二:requests-mock在测试脚本中的用法

  1. import requests

  2. import requests_mock

  3. def get_data():

  4. response = requests.get('http://example.com/api')

  5. return response.json()

  6. def test_get_data():

  7. adapter = requests_mock.Adapter()

  8. mock_response = {"status": "ok", "datas": [{"name": "狂师", "description": "公众号:咖啡加剁椒"}]}

  9. adapter.register_uri('GET', 'http://example.com/api', json=mock_response)

  10. with requests.Session() as session:

  11. session.mount('http://', adapter)

  12. data = get_data()

  13. assert data["status"] == "ok"

  14. assert len(news_data["datas"]) == 1

  15. assert news_data["datas"][0]["name"] == "辣条"

示例三:requests-mock模拟请求错误异常

正常请求接口的时候,都会出现接口异常情况,比如超时哈,或者请求服务器异常等操作,接下来小编通过requests-mock进行模拟服务器异常的情况。

  1. import requests

  2. import requests_mock

  3. from requests.exceptions import ConnectionError, Timeout

  4. def test_exception():

  5. with requests_mock.Mocker() as m:

  6. # 模拟请求超时处理

  7. m.get('http://example.com/api',exc=Timeout)

  8. # 通过pytest.raises进行捕捉异常,如果存在异常,则判断为pass

  9. with pytest.raises(Timeout):

  10. requests.get('http://example.com/api',timeout=3)

  11. # 模拟服务器错误

  12. m.get('http://example.com/api', exc=ConnectionError)

  13. # 发送请求并断言是否抛出了预期的异常

  14. with pytest.raises(ConnectionError):

  15. requests.get('http://example.com/api')

总结:

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

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

软件测试面试文档

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

 

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【深度学习】(2)--PyTorch框架认识
  • 简单题66-加一(Python)20240918
  • GUI编程16:图片按钮、单选框、多选框
  • Ubuntu 22.04上安装Java JDK 8
  • 自定义Spring Security认证处理的完整解决方案
  • OpenCV 1
  • Vue Router 编程式导航全攻略:深入掌握 push, replace, go, back, forward,beforeEach 方法
  • 术语“in law”(在分布上)
  • Gitee丝滑版本:成功在新电脑添加新文件
  • stm32 PWR电源控制(修改主频睡眠模式停机模式待机模式)
  • 无限边界:现代整合安全如何保护云
  • Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
  • RTMP协议在无人机巡检中的应用场景
  • Haproxy搭建Web集群
  • 一个基于Java SSM框架(Spring、SpringMVC、MyBatis)的沙县小吃点餐系统
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【css3】浏览器内核及其兼容性
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • DOM的那些事
  • IndexedDB
  • Invalidate和postInvalidate的区别
  • Java多线程(4):使用线程池执行定时任务
  • ubuntu 下nginx安装 并支持https协议
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 猴子数据域名防封接口降低小说被封的风险
  • 机器学习中为什么要做归一化normalization
  • 老板让我十分钟上手nx-admin
  • 微信小程序--------语音识别(前端自己也能玩)
  • 在Unity中实现一个简单的消息管理器
  • 栈实现走出迷宫(C++)
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # Redis 入门到精通(一)数据类型(4)
  • (2.2w字)前端单元测试之Jest详解篇
  • (AngularJS)Angular 控制器之间通信初探
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (定时器/计数器)中断系统(详解与使用)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (九)c52学习之旅-定时器
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (一)认识微服务
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .net core docker部署教程和细节问题
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET命名规范和开发约定
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [ linux ] linux 命令英文全称及解释
  • [2018-01-08] Python强化周的第一天
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯