【Python版】手把手带你如何进行Mock测试

什么是mock?
mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为

为什么要使用Mock?
之所以使用mock测试,是因为真实场景很难实现或者短期实现起来很困难。主要场景有:

真实对象可能还不存在(接口还没有完成开发)

真实对象很难搭建起来(第三方支付联调)

真实对象的行为很难触发(例如网络错误)

真实对象速度很慢(例如一个完整的数据库,在测试之前可能需要初始化)

真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法

真实的对象是用户界面,或包括用户页面在内

真实的对象使用了回调机制

真实对象的行为是不确定的(例如当前的时间或当前的温度)

如何使用Mock?
通过代码制造假的输出(结果)

接口自动化测试客户端Mock
通过代码去模拟假的接口返回数据(访问真实接口的过程就可以省略)

举个栗子:要测试请求接口visit接口,实际上开发还没完成开发工作,我们先编写测试用例,数据都先准备空的,然后可以运行通过,等开发好接口以后,再把相应内容如info中的数据,实际结果等修改后运行

visit方法是在base.py模块中APICase类下

import unittest
from common.base import APICaseclass TestRequest(unittest.TestCase, APICase):
def test_request(self):
"""
1.准备接口接口访问的数据
2.调用接口访问visit方法
3.断言
"""
info = {"headers": "", "json": "", "expected": ""}
# actual = self.visit(info)
actual = ""
self.assertEqual(info['expected'], actual)

 mock是python的第三方库,所以使用mock前,需要先进行安装pip install mock

修改代码如下:

import unittest
from common.base import APICase
from mock import Mockclass TestRequest(unittest.TestCase, APICase):
def test_request(self):
"""
1.准备接口接口访问的数据
2.调用接口访问visit方法
3.断言
"""
info = {"headers": "", "json": "", "expected": ""}
self.visit = Mock(return_value="")
actual = self.visit(info)
# actual = ""
self.assertEqual(info['expected'], actual)

运行结果:

当接口没开发出来时,直接编写这行代码,因为调用的是mock返回的内容

actual = self.visit(info)当接口开发完成时,把这行代码注释掉即可

self.visit = Mock(return_value="")如果想设置返回的数据,也是可以的,如下

 拿之前测试注册接口为例,修改代码如下:

import unittest
import requests
from mock import Mockclass TestRegister(unittest.TestCase):
def test_register_01(self):
'''步骤:
1.准备测试数据
2.发送接口请求,得到实际结果
3.预期结果和实际结果的断言
'''
# 1.准备测试数据
url = 'http://api.lemonban.com:8766/futureloan/member/register'
method = 'post'
headers = {'X-Lemonban-Media-Type': 'lemonban.v2'}
json_data = {"mobile_phone": "", "pwd": "12345678"}
expected = {
"code": 1,
"msg": "手机号为空",
"data": None,
"copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
}
# 2.发送接口请求,得到实际结果
# 因为执行了Mock,所以就不会执行请求真实的接口了
requests.request = Mock(return_value=expected)
response = requests.request(method=method, url=url, headers=headers, json=json_data)
# mock返回的是expected的内容,因此是dict,所以实际结果要把之前代码上的.json去掉
actual = response
# 3.预期结果和实际结果的断言
self.assertEqual(expected, actual)

 只需要修改两处代码,即可访问假的接口

加上下面这行代码

requests.request = Mock(return_value=expected)修改下面这行代码

actual = response.json() 修改为 actual = response

服务Mock(Mock Server)
方法一:
开发的接口是在server,真实的服务器

我就自己冒充开发人员,写一个假的服务器,写一个假的接口,可以通过mockoon工具实现

直接去官网下载安装即可

打开mockoon,设置请求方法、URL、返回内容,点击开启服务按钮

这时候就可以请求服务接口了

 

方法二:

测试开发技术,自己做一个真实的服务出来,确实可以支持更多的响应,会省略很多步骤

用代码编写一个服务接口

from flask import Flaskapp = Flask("py44")@app.route('/member/register', methods=['post'])
def register():
return {"code": 11, "msg": "success"}app.run(debug=True)

运行结果:

只有运行代码,才算开启服务

这时候就可以请求服务接口了

 方法2的灵活之处就是可以支持更多响应,如设置请求体

from flask import Flask, requestapp = Flask("py44")@app.route('/member/register', methods=['post'])
def register():
username = request.form.get('username')
password = request.form.get('password')
if username == 'momo' and password == '123456':
return {"code": 11, "msg": "success"}
return {"code": 22, "msg": "failed"}app.run(debug=True)

启动服务后,使用postman请求

总结:

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

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

 

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

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

相关文章

Modbus 通信协议

Modbus 简介 Modbus 通信协议是一种主从式 串行 异步 半双工通信协议。 可以一个主站对多个从站进行双向通信。 主站可单独和从站通信,也可以广播式和所有从站通信。 Modbus 数据格式 c 功能码 常用功能码 H03 常用功能码 H06 常用功能码 H10 错误应答 1&#xff…

机器学习、人工智能、深度学习的关系

人工智能(Artificial Intelligence,AI) 人工智能范围很广,它是一门新的科学与工程,是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的技术科学,研究内容涵盖语音识别、图像识别、自然语言处理、智能搜索和…

第11章 GUI Page436 步骤十 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”,是指将所有图元都先划到一个人眼看不到的“设备上下文”之上,最后再一次性复制到真正的屏幕DC之上,这样我们就看不到中间画的过程了,也就不会感到闪烁了。 注意,这时不能解除ScrolledWindow1的背景擦除…

OAuth2.0 的四种授权方式

目录 前言 一、OAuth2.0 为何物 二、OAuth2.0 授权方式 1、授权码 2、隐藏式 3、密码式 4、凭证式 三、令牌的使用与更新 1、令牌怎么用? ​编辑2、令牌过期怎么办? 总结 前言 当今互联网应用程序中,保护用户数据的安全性是至关重要…

网红营销卧底式竞调!高效洞悉竞对网红营销增长逻辑!

知己知彼,百战不殆。 一次好的竞品调研不仅可以了解目标市场看清市场发展趋势、找准市场切入点,还可以有效帮助品牌做出正确的营销决策,少走许多弯路。 那么海外网红营销如何进行竞品调研呢?一次好的竞调又对网红营销有什么帮助…

智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蜣螂算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜣螂算法4.实验参数设定5.算法结果6.参考文献7.MA…

司铭宇老师:如何让企业销售培训效果落地

如何让企业销售培训效果落地 在企业销售培训中,我们经常听到一个词,那就是“落地”。所谓的“落地”,简单来说就是将培训中所学到的知识和技能转化为实际的工作行动,从而提高销售业绩。但是,如何才能让销售培训效果真…

YOLOv5 目标计数 | 图片上绘制计数结果

修改方法: 只需要改 detect.py for path, im, im0s, vid_cap, s in dataset: 下新增一行 class_counts = {} class_counts[int(c)] = class_counts.get(int(c

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中,玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏,它不仅提供了一个有趣的辨色挑战,还能帮助玩…

C# 类型和成员

C# 教程 - 类型及其成员 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/types 目录 类和对象 类型参数 基类 结构 接口 枚举 可为 null 的类型 元组 作为面向对象的语言,C# 支持封装、继承和多态性这些概念。 类可…

使用uniclould开发支付宝小程序提示:Uncaught URIError: URI malformed

一般这种情况是你云数据库里的内容出现了%号,像我这种格式,我之前在content内容里出现了百分号,在小程序端那里一直报错Uncaught URIError: URI malformed 。后来把content内容里的百分号全去掉就行了。跟空格之类的没关系

PicGo+GitHub搭建免费图床

PicGoGitHub搭建免费图床 步骤 1: 安装 PicGo步骤 2:创建图床仓库步骤 3: 配置 GitHub Token步骤 4: 配置 PicGo步骤 5: 上传图片步骤 6: 访问图片 使用 GitHub 作为图床的优势在于免费、稳定且具有版本控制功能,特别适合个人博客、小型项目等。PicGo作为一个开源的…