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

什么是mock?

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

为什么要使用Mock?

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

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

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

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

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

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

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

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

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

如何使用Mock?

通过代码制造假的输出(结果)

接口自动化测试客户端Mock

通过代码去模拟假的接口返回数据(访问真实接口的过程就可以省略)

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

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

import unittest
from common.base import APICase
 
 
class 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 Mock
 
 
class 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 Mock
 
 
class 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 Flask
 
app = Flask("py44")
 
 
@app.route('/member/register', methods=['post'])
def register():
return {"code": 11, "msg": "success"}
 
 
app.run(debug=True)

运行结果:

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

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

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

from flask import Flask, request
 
app = 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请求

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

matplotlib查询当前系统所有字体

电脑里有这个字体但是不代表matplotlib里也有这个字体,所以解决matplotlib中的中文显示问题主要就是要找到它所内置支持的字体,那么我们首先查看一下它的内置字体,运行以下代码查看所支持的字体 # 查询当前系统所有字体 from matplotlib.fon…

老程序员帮公司面试java程序员,工资都在1万5左右

案例1(电商项目经验) 培训机构的最爱电商项目,有木有 项目具体模块都讲不清楚,面试直接下课 项目核心业务表都记不住,很难让面试官相信你真的开发过 面试3年电商经验java开发,坚持看完最后有我公司招聘要…

kettle--资源库

1、数据库资源库(使用的会比较频繁) 作用:数据库资源库就是将转换和作业相关的信息保存到数据库中,当团队中需要使用到的时候都可以去使用该数据。 创建数据库资源库的一般流程: 建立数据的连接后查看数据库中对应的…

【超全详解一文搞懂】Scala基础

目录 Scala 01 —— Scala基础一、搭建Scala开发环境安装Scala编译器在IDEA中进行scala编码 二、Scala简介与概述Scala简介Scala概述Scala代码规范 三、理解Scala变量与数据类型Scala的变量与常量Scala和Java变量的区别 Scala的数据类型 四、Scala的程序逻辑1.表达式2.运算符3.…

C++命名空间详解

背景 大型程序往往会使用多个独立开发的库,这些库又会定义大量的全局名字,如类、函数和模板等。当应用程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突的情况。 多个库将名字放置在全局命名空间中将引发命名空间污染。 传…

中御海参已确定参加2024第七届燕窝天然滋补品博览会

参展企业介绍 烟台中御海参有限公司成立于2018年09月19日,公司坐落在山东省,详细地址为:山东省烟台市蓬莱区大辛店镇三甲村36号;经国家企业信用信息公示系统查询得知,烟台中御海参有限公司企业的经营范围为:食品生产&a…

C语言例4-7:格式字符f的使用例子

%f&#xff0c;实型&#xff0c;小数部分为6位 代码如下&#xff1a; //格式字符f的使用例子 #include<stdio.h> int main(void) {float f 123.456;double d1, d2;d11111111111111.111111111;d22222222222222.222222222;printf("%f,%12f,%12.2f,%-12.2f,%.2f\n&qu…

紫鸾5.0:紫光云新一代敏捷应用开发平台全家桶

曾几何时&#xff0c;“瀑布式”占据了二十世纪软件开发的主流&#xff0c;开发时间往往以年计&#xff0c;一款软件应用动辄几年才能交付。而随着社会生产力的跃升&#xff0c;“瀑布式”已严重跟不上时代的节奏&#xff0c;2001年&#xff0c;“敏捷宣言”的发布&#xff0c;…

2024年云渲染农场预测和趋势:服务质量再突破,渲染效率大飙升

随着人工智能的不断发展和云计算技术的逐渐成熟&#xff0c;2024年&#xff0c;云渲染农场或将迎来前所未有的发展机遇与创新趋势。让我们一起来看看云渲染对数字内容行业可能带来的新变化吧&#xff01; 1.更快的渲染速度与效果 人工智能和机器学习等新技术的应用&#xff0c…

哈工深提出基于联邦学习的大模型指令微调

在当今大语言模型&#xff08;LLMs&#xff09;发展中&#xff0c;指令调整被证明对于生成与人类对齐的响应至关重要。然而&#xff0c;收集用于调整的多样化、高质量的指令数据面临挑战&#xff0c;尤其是在隐私敏感领域。联邦指令调整&#xff08;FEDIT&#xff09;作为一种解…

【王道训练营】第6题 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no

文章目录 我的代码改正代码其他代码 我的代码 没有完成 #include<stdio.h> int main(){int a;int b;int c0;//位数int d0;//比较几次scanf("%d",&a);while(b!0){bb/10;c;}dc/2;//比较几次int ffor(int i0 ;i<d;i){int ec;//位数fa - a / (((e-i-1)*10…

【Docker】Docker安全与最佳实践:保护你的容器化应用程序

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

力扣_206_反转链表(c语言)

struct ListNode* reverseList(struct ListNode* head) {if(headNULL)return head;struct ListNode*n1NULL,*n2head,*n3head->next;while(n2){n2->nextn1;n1n2;n2n3;if(n3) n3n3->next;}return n1; }

Linux 理解文件系统、磁盘结构、软硬链接

目录 一、理解磁盘结构 1、磁盘的物理结构 2、硬件层面理解 3、磁盘的具体物理存储结构 4、进行逻辑抽象 5、磁盘文件的管理 6、创建新文件的过程 二、理解文件系统 1、文件的构成 2、为何选择4KB而非512字节作为基本单位? 3、文件系统的组成 数据块&#xff08;Data Blocks&a…

elasticsearch+kibana安装部分问题:

1.elasticsearch启动问题&#xff1a; 如果elasticsearch开启https登录则第一次启动的时候需要前台启动&#xff0c;前台启动的时候会自己创建相应的token等登录信息,如果是后台启动则没有这些登录信息&#xff1a; ./elasticsearch ━━━━━━━━━━━━━━━━━━━…

基于java+springboot+vue实现的大学生二手物品交易商城(文末源码+Lw+ppt)23-329

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这…

数据湖与湖仓一体是如何演变而来的?详谈大数据存储架构的变迁

在大数据存储架构的发展历程中&#xff0c;可以划分为三个显著的演进阶段。首先&#xff0c;随着Hadoop和Hive等初期项目的出现&#xff0c;数据仓库&#xff08;Data Warehouse&#xff09;的概念得以确立&#xff1b;随着数据仓库的不断演化&#xff0c;同时有了云与对象存储…

解決flask-restful提示Did not attempt to load JSON data 问题

在使用flask-restfull进行API开发的时候。一旦我使用类似下面的代码从url或者form中获得参数就会出现报错&#xff1a;Did not attempt to load JSON data because the request Content-Type was not ‘application/json’。 代码如下&#xff1a; # Flask_RESTFUl数据解析 f…

Python之Scrapy爬虫框架安装及使用详解

声明 文章所涉及的内容仅为学习交流所用。 前言&#xff1a; Scrapy 是用 Python 实现的一个为了采集网站数据、提取结构性数据而编写的应用框架。常应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬…

风丘EV能量流测试解决方案 提高电动汽车续航能力

电动汽车&#xff08;EV&#xff09;近些年发展迅猛&#xff0c;已被汽车业内普遍认为是未来汽车发展的新方向&#xff0c;但现如今电动汽车仍然存在一些短板&#xff0c;导致其还无法替代传统燃油车。对此&#xff0c;首先想到的肯定就是电动车的续航问题。其实解决电动车续航…