一篇搞懂Mock测试

news2024/10/2 10:41:12

1. 什么是Mock测试

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象/数据/场景,用一个虚拟的对象来创建以便测试的测试方法。

2. Mock测试常见场景

  • 无法控制第三方系统接口的返回,返回的数据不满足要求
  • 依赖的接口还未开发完成,就需要对被测系统进行测试

3. Mock测试的优缺点

优点:

  • 团队可以并行工作,只要双方定义好接口,及接口数据规范,即可使用Mock构建出虚拟接口然后尽快进行开发和自测,以满足测试前移要求,也有利提早发现缺陷
  • 测试驱动开发TDD,通过利用Mock使测试人员提前接入测试从而达到测试驱动开发的效果
  • 提高测试覆盖率,通过Mock模拟一些业务逻辑复杂或无法通过正常手段进行操作的场景从而提高测试的覆盖率
  • 隔离测试环境与数据库环境,保证数据库的纯净

缺点:

  • 如果在测试过程中大量使用Mock,Mock测试的场景失去真实性,可能会导致在后续的系统性测试时才发现缺陷,使得缺陷发现得比较晚,造成后续修复成本大的严重后果

4. Python中的Mock库

很多语言现在都有Mock库,方便在单元测试时进行Mock测试,下面主要介绍Mock在Python中的使用

4.1 安装Mock库
pip install Mock
4.2 Mock在Python中的使用
# case1
import unittest
from mock import Mock

class SubClass(object):
    def add(self,a,b):
        """实现两个数相加"""
        pass



class TestSub(unittest.TestCase):
    """测试两个数相加用例"""
    def test_sub(self):
        sub = SubClass()        # 初始化被测函数类实例
        sub.add = Mock(return_value=10)        # mock add方法 指定返回10
        result = sub.add(5,5)               # 调用被测函数
        self.assertEqual(result,10)         # 断言实际结果与预期结果是否一致

if __name__ == "__main__":
    unittest.main()
# case2
import unittest
from mock import Mock

class SubClass(object):
    def add(self,a,b):
        """实现两个数相加"""
        return a + b



class TestSub(unittest.TestCase):
    """测试两个数相加用例"""
    def test_sub(self):
        sub = SubClass()        # 初始化被测函数类实例
        sub.add = Mock(return_value=10,side_effect=sub.add)        # 传递side_effect关键参数,覆盖return_value参数值,使用真实的add函数进行测试
        result = sub.add(5,11)               # 调用被测函数
        self.assertEqual(result,16)         # 断言实际结果与预期结果是否一致

if __name__ == "__main__":
    unittest.main()
# case3

import unittest
from mock import Mock

def verifyPhoneNum():
    '''
    验证手机号
    '''
    pass



class TestVerifyPhoneNum(unittest.TestCase):
    def test_verify_phone_num(self):
        data = {"code": "0100","msg": {"result": "Success","Isp": "中国移动"}}
        verifyPhoneNum = Mock(return_value=data)
        self.assertEqual("Success",verifyPhoneNum()["msg"]["result"])
        self.assertEqual("中国移动",verifyPhoneNum()["msg"]["Isp"])

if __name__ == "__main__":
    unittest.main()

case3的验证手机号中,肯定还会有其他的返回情况,我们可以预先定义好返回结果以供测试(一般接口文档已经有设计好)

# 手机号校验通过
{
    "code": "0100",
    "msg": {
        "result": "Success",
        "Isp": "中国移动"
    }
}

{
    "code": "0101",
    "msg": {
        "result": "Success",
        "Isp": "中国联通"
    }
}

{
    "code": "0102",
    "msg": {
        "result": "Success",
        "Isp": "中国电信"
    }
}

# 手机号格式错误
{
    "code": "0200",
    "msg": {
        "result": "Fail",
        "Isp": "",
        "errorinfo": "手机号格式错误"
    }
}

# 手机号已存在
{
    "code": "0300",
    "msg": {
        "result": "Fail",
        "Isp": "",
        "errorinfo": "手机号已存在"
    }
}

5. 使用Postman进行Mock测试

除了在编程语言上集成Mock,Mock测试还可用工具来进行模拟达到测试目的。

5.1 新建一个Mock Server

1、打开Postman,选中Mock Server项,点Create Mock Server
在这里插入图片描述

2、填写Mock Server信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、创建成功
在这里插入图片描述

4、点击View Collection Docs查看信息

在这里插入图片描述
在这里插入图片描述

5、点击Open Request,创建一个请求(会自动创建一个Collection),填写必要信息

在这里插入图片描述

6、请求结果
在这里插入图片描述

6. 用Python访问创建的Mock Server

import unittest
import requests

url = r'https://b129ef27-436a-45f2-8971-9d8674201095.mock.pstmn.io/mock/mockdemo'
data = {
  "memberid": "354802185",
  "phonenum": "13724312459",
  "msg": {
      "Country": "中国",
      "Province": "广东省",
      "City": "深圳市",
      "Isp": "中国移动"
  },
  "type_code": 0
}
header = {
    "Content-Type": "application/json",
    "token": "91932f295a75a5a743974a0e4b308fc6",
    "x-api-key": "PMAK-63d8c41e8b44370ec5b5c595-780df67fc8c748328add9aec0286b89898"
}


class TestMockServer(unittest.TestCase):
    respone = requests.get(url=url,headers=header)
    result = respone.json()
    print(result)
    def test_code(self):
        self.assertEqual("200",self.result['code'])

    def test_result(self):
        self.assertEqual('Success',self.result['msg']['result'])


    def test_memberinfo(self):
        self.assertEqual('白金瀚至臻会员',self.result['msg']['memberinfo'])

    def test_membertype(self):
        self.assertEqual('666',self.result['msg']['membertype'])



if __name__ == "__main__":
    unittest.main()

运行结果:

{'code': '200', 'msg': {'result': 'Success', 'memberinfo': '白金瀚至臻会员', 'membertype': '666'}}
....
----------------------------------------------------------------------
Ran 4 tests in 0.002s

OK
接口路径	/mock/testdemo

请求头
Content-Type	application/json
token	91932f295a75a5a743974a0e4b308fc6

请求体
{
  "memberid": "354802185",
  "phonenum": "13724312459",
  "msg": {
      "Country": "中国",
      "Province": "广东省",
      "City": "深圳市",
      "Isp": "中国移动"
  },
  "type_code": 0
}

响应体
{
    "code": "200",
    "msg": {
        "result": "Success",
        "memberinfo": "白金瀚至臻会员",
        "membertype": "666"
    }
}

mock地址:
https://b129ef27-436a-45f2-8971-9d8674201095.mock.pstmn.io
API keys:
PMAK-63d8c41e8b44370ec5b5c595-780df67fc8c748328add9aec0286b89898

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

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

相关文章

DEM数据下载——以地理空间数据云为例

数字高程模型(Digital Elevation Model)是进行地形分析的重要基础,诸如坡度、坡向及水文分析等都在此基础上进行。今天,我们一起来聊一聊一种DEM数据常见下载方式。按照惯例,先将网址列出:https://www.gscloud.cn/home…

2023年美赛 MCM B题 重新构想马赛马拉岛

背景肯尼亚的野生动物保护区最初主要是为了保护野生动物和其他自然资源。肯尼亚议会于2013 年通过了《野生动物保护和管理法》,以提供更公平的资源共享,并允许进行替代的、以社 区为基础的管理工作[1].此后,肯尼亚增加了修正案,以…

有特别有创意的网站设计案例

有人说 UI 设计师集艺术性与科学性于一身,不仅需要对工具的使用熟练,更需要对美术艺术有一定的基础了解。如果想要成为优秀的 UI 设计师是一个需要磨砺的过程,需要不断的学习和积累,多看多练多感受,其中对于优质的设计…

力扣53.最大子数组和

文章目录力扣53.最大子数组和题目描述贪心动态规划力扣53.最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例…

4、HAL库SPI数据收发

1、通过SPI轮询的方式实现数据收发 1.1、通过CubeMx配置SPI轮询的方式实现数据收发 SPI模式 CPOL CPHA 空闲时 SCK 时钟 采样时刻 0 0 0 低电平 奇数边沿(W25Qxx支持) 1 0 1 低电平 偶数边沿 2 1 0 高电平 奇数边沿 3 1 1 高电平 偶数边沿(W25Qxx支持)当前使用 生成代码工程 …

[计算机操作系统(慕课版)]第一章 操作系统引论(学习笔记)

操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。操作系统的主要作用: 管理硬件设备,提高他们的利用率和系统吞吐量 利用率:使硬件充分忙碌系统吞吐量…

Python|每日一练|树|深度优先搜索|数组|二分查找|链表|双指针|单选记录:填充每个节点的下一个右侧节点指针|搜索插入位置|旋转链表

1、填充每个节点的下一个右侧节点指针(树,深度优先搜索) 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node { int val; Node *left; Node *rig…

同一个整型常量怎样在不同进制间之间转换?

整型常量可以分别用二进制、八进制、十进制和十六进制表示,不同的进制并不影响数据本身的大小,同一个整型常量可以在不同进制之间转换,具体转换方式如下。1.十进制和二进制之间的转换(1)十进制转二进制。十进制转换成二进制就是一个除以2取余…

INDEMIND:2023,服务机器人能否“狂飙”?

过去一年,服务机器人的发展并不顺利。头部厂商的变动,市场增长率的持续下降不由得让人质疑,2023年,服务机器人还能“狂飙”吗?短期的市场波动,并不能代表行业的未来走向,而行业的两面矛盾现象&a…

珞珈1号-数据预处理流程

珞珈1号-数据预处理流程 1、重投影Albers 2、重采样 3、辐射校正–将INT32转化为浮点型真实数据 4、统一量纲(eg:和NPP同一量纲) 5、去噪 1、重投影Albers 参考这篇文章 2、重采样 输入想要重采样的数据,其中X和Y是你想要的大小,125即是重采样至125m …

kaggle竞赛-宠物受欢迎程度(赛题讲解与数据分析)

比赛官网地址 赛题介绍 petfinder是马来西亚领先的动物福利平台宠物网站地址 该网站使用可爱指数来排名宠物照片。它分析了图片组成和其他因素,并与数千个宠物档案的表现进行了比较。 在这场比赛中,你将分析原始图像和元数据来预测宠物照片的“Pawp…

Word控件Spire.Doc 【Table】教程(16):C#/VB.NET:在 Word 表格中插入或提取图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

JMM(Java内存模型)及volatile关键字

JMM(Java内存模型 Java Memory Model,简称JMM)JMM(Java内存模型 Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或者规范,通过这组规范定义了程序中各个变量(包括实例字段&#xff0…

干货分享|数据可视化报表制作技巧

脑中想得再好,也要看最终的效果呈现。但偏偏有些用户分析思维不差,就是数据分析报表的制作拖了后腿,导致始终无法完美呈现数据可视化分析效果。本文将总结奥威BI软件上的常用的数据可视化报表制作技巧,供大家随时查阅。 BI数据可…

搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法

搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 Coding GitHub Hexo Markdown 搭建博客 大家好,这是我第一次写博客。使用 GitHub Hexo 创建最基本的博客很容易,网上有很多现成的教程。…

SCI论文写作神器集合 —— 超级实用

特此声明: 本文拷贝多处别人的内容,并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具,旨在帮助小伙伴们更快更有效率的完成文章发表,如果其他好用的工具,欢迎各位交流~~ 一、文献搜索神…

XCP实战系列介绍14-基于Vector_Davinci工具的XCP配置介绍(三)

本文框架 1.概述2. 其他模块配置2.1 XCP初始化3. 手工代码部分3.1 周期函数添加3.2 DAQ Event调用3.3 XCP模块本身代码3.4 标定量的添加1.概述 在对XCP的配置部分介绍中我们计划分别对通讯部分配置、XCP模块本身配置及其他相关模块配置三篇进行介绍,在前两篇我们介绍了XCP配置…

SAP PP工单确认完成(CNF)状态取消方法

这SAP PP工单确认完成(CNF)状态取消方法SAP PP工单确认完成(CNF)状态取消方法SAP PP工单确认完成(CNF)状态取消方法 工单完工后取消了其中的一个报工,然后无法再报工 此时再报工,系…

使用 Docker 镜像

author: aming email: jikcheng163.com title: Docker 使用镜像 creation_date: 2023-01-05 22:58 Last modified date: 2023-01-30 23:01 tags: Docker 使用镜像 File Folder with relative path: reading notes/doc/Dokcer 实践 remark: other: 本章背景知识 1、镜像是三大…

Allegro走线时如何自动关闭其它网络飞线显示操作指导

Allegro走线时如何自动关闭其它网络飞线显示操作指导 在做PCB设计的时候,尤其是在评估布线的时候,走某一个网络的时候,希望其它网络的飞线会被自动关闭,方便评估。 Allegro支持这个功能,如下图 走线前 走线后 具体操作如下 点击Route