全网最牛,接口自动化测试mock框架模块实战,入门到高阶...

news2024/11/19 10:44:12

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

mock的介绍

py3已将mock集成到unittest库中;
为的就是更好的进行单元测试;
简单理解,模拟接口返回参数;
通俗易懂,直接修改接口返回参数的值;

mock的作用

1、解决依赖问题,达到解耦作用
当我们测试某个目标接口(模块)时,该接口依赖其他接口,当被依赖的接口未开发完成时,可以用mock模拟被依赖接口,完成目标接口的测试;

2、模拟复杂业务的接口
当我们测试某个目标接口(模块),该接口依赖一个非常复杂的接口时,可以用mock来模拟这个复杂的业务接口;也解决接口依赖一样的原理

3、单元测试
如果某个接口(模块)未开发完成时,又需要编写测试用例,则可以通过mock模拟该接口(模块)进行测试

4、前后端联调
前端开发的页面需要根据后端返回的不同状态码展示不同的页面,当后端接口未开发完成时,也可通过mock来模拟后端接口返回自己想要的数据

mock类解读

class Mock(spec=None,side_effect=None,return_value=DEFFAULT,name=None) 

secp:定义mock对象的属性值,可以是列表,字符串,甚至一个对象或者实例
side_effect:可以用来抛出异常或者动态改变返回值,它必须是一个iterator(列表),它会覆盖return_value
return_value:定义mock方法的返回值,它可以是一个值,可以是一个对象(如果存在side_effect参数那这个就没有用,也就是不能同时用)
name:作为mock对象的一个标识,在print时可以看到

mock实际使用

一个未开发完成的功能如何测试?

def add(self, a, b):
    """两个数相加"""
    pass


class TestSub(unittest.TestCase):
    """测试两个数相加用例"""

    def test_sub(self):
        # 创建一个mock对象 return_value代表mock一个数据
        mock_add = mock.Mock(return_value=15)
        # 将mock对象赋予给被测函数
        add = mock_add
        # 调用被测函数
        result = add(5, 5)
        # 断言实际结果和预期结果
        self.assertEqual(result, 15)

一个完成开发的功能如何测试?

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


class TestSub(unittest.TestCase):
    """测试两个数相加用例"""


    def test_add2(self):
        # 初始化被测函数类实例
        sub = SubClass()
        # 创建一个mock对象 return_value代表mock一个数据
        # 传递side_effect关键字参数, 会覆盖return_value参数值, 使用真实的add方法测试
        sub.add = Mock(return_value=15, side_effect=sub.add)
        # 调用被测函数
        result = sub.add(5, 5)
        # 断言实际结果和预期结果
        self.assertEqual(result, 10)

side_effect:这里给的参数值是sub.add相当于add方法的地址,当我们调用add方法时就会调用真实的add方法

简单理解成:传递了side_effect参数且值为被测函数地址时,mock不会起作用;两者不可共存

另外,side_effect接受的是一个可迭代序列,当传递多个值时,每次调用mock时会返回不同的值;

mock_obj = mock.Mock(side_effect= [1,2,3])
print(mock_obj())
print(mock_obj())
print(mock_obj())
print(mock_obj())

# 输出
Traceback (most recent call last):
File "D:/MyThreading/mymock.py", line 37, in <module>
print(mock_obj())
File "C:\Python36\lib\unittest\mock.py", line 939, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "C:\Python36\lib\unittest\mock.py", line 998, in _mock_call
result = next(effect)
StopIteration

存在依赖关系的功能如何测试?

# 支付类
class Payment:

    def requestOutofSystem(self, card_num, amount):
        '''
        请求第三方外部支付接口,并返回响应码
        :param card_num: 卡号
        :param amount: 支付金额
        :return: 返回状态码,200 代表支付成功,500 代表支付异常失败
        '''
        # 第三方支付接口请求地址(故意写错)
        url = "http://third.payment.pay/"
        # 请求参数
        data = {"card_num": card_num, "amount": amount}
        response = requests.post(url, data=data)
        # 返回状态码
        return response.status_code

    def doPay(self, user_id, card_num, amount):
        '''
        支付
        :param userId: 用户ID
        :param card_num: 卡号
        :param amount: 支付金额
        :return:
        '''
        try:
            # 调用第三方支付接口请求进行真实扣款
            resp = self.requestOutofSystem(card_num, amount)
            print('调用第三方支付接口返回结果:', resp)
        except TimeoutError:
            # 如果超时就重新调用一次
            print('重试一次')
            resp = self.requestOutofSystem(card_num, amount)

        if resp == 200:
            # 返回第三方支付成功,则进行系统里面的扣款并记录支付记录等操作
            print("{0}支付{1}成功!!!进行扣款并记录支付记录".format(user_id, amount))
            return 'success'

        elif resp == 500:
            # 返回第三方支付失败,则不进行扣款
            print("{0}支付{1}失败!!不进行扣款!!!".format(user_id, amount))
            return 'fail'

# 单元测试类
class payTest(unittest.TestCase):

    def test_pay_success(self):
        pay = Payment()
        # 模拟第三方支付接口返回200
        pay.requestOutofSystem = mock.Mock(return_value=200)
        resp = pay.doPay(user_id=1, card_num='12345678', amount=100)
        self.assertEqual('success', resp)

    def test_pay_fail(self):
        pay = Payment()
        # 模拟第三方支付接口返回500
        pay.requestOutofSystem = mock.Mock(return_value=500)
        resp = pay.doPay(user_id=1, card_num='12345678', amount=100)
        self.assertEqual('fail', resp)

    def test_pay_time_success(self):
        pay = Payment()
        # 模拟第三方支付接口首次支付超时,重试第二次成功
        pay.requestOutofSystem = mock.Mock(side_effect=[TimeoutError, 200])
        resp = pay.doPay(user_id=1, card_num='12345678', amount=100)
        self.assertEqual('success', resp)

    def test_pay_time_fail(self):
        pay = Payment()
        # 模拟第三方支付接口首次支付超时,重试第二次失败
        pay.requestOutofSystem = mock.Mock(side_effect=[TimeoutError, 500])
        resp = pay.doPay(user_id=1, card_num='12345678', amount=100)
        self.assertEqual('fail', resp)

可能会有人问:第三方支付都不能用,我们的测试结果是否是有效的呢?

通常在测试一个模块的时候,是可以认为其他模块的功能是正常的,只针对目标模块进行测试是没有任何问题的,所以说测试结果也是正确的

mock装饰器

一共两种格式

 @patch('module名字.方法名') 
 @patch.object(类名, '方法名') 
# 装饰类演示
from mock import Mock, patch


# 单独的相乘函数
def multiple(a, b):
    return a * b


# 单独的捕获Exception函数
def is_error():
    try:
        os.mkdir("11")
        return False
    except Exception as e:
        return True


# 计算类,包含add方法
class calculator(object):
    def add(self, a, b):
        return a + b


# 装饰类演示 - 单元测试类
class TestProducer(unittest.TestCase):

    # case执行前
    def setUp(self):
        self.calculator = calculator()

    # mock一个函数,注意也要指定module
    @patch('mock_learn.multiple')
    def test_multiple(self, mock_multiple):
        mock_multiple.return_value = 3
        self.assertEqual(multiple(8, 14), 3)

    # mock一个类对象的方法
    @patch.object(calculator, 'add')
    def test_add(self, mock_add):
        mock_add.return_value = 3
        self.assertEqual(self.calculator.add(8, 14), 3)

    # mock调用方法返回多个不同的值
    @patch.object(calculator, 'add')
    def test_effect(self, mock_add):
        mock_add.side_effect = [1, 2, 3]
        self.assertEqual(self.calculator.add(8, 14), 1)
        self.assertEqual(self.calculator.add(8, 14), 2)
        self.assertEqual(self.calculator.add(8, 14), 3)

    # mock的函数抛出Exception
    @patch('os.mkdir')
    def test_exception(self, mkdir):
        mkdir.side_effect = Exception
        self.assertEqual(is_error(), True)

    # mock多个函数,注意函数调用顺序
    @patch.object(calculator, 'add')
    @patch('mock_learn.multiple')
    def test_more(self, mock_multiple, mock_add):
        mock_add.return_value = 1
        mock_multiple.return_value = 4
        self.assertEqual(self.calculator.add(3, 3), 1)
        self.assertEqual(multiple(3, 3), 4)
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

只有勇往直前的人,才能创造属于自己的奇迹;只有愿意付出的人,才能收获真正的成就;只有坚持不懈的人,才能实现自己的梦想。别停下脚步,勇敢地追逐,你将发现无限可能!

只有坚持不懈的努力,才能追逐梦想;只有永不放弃的奋斗,才能创造辉煌。每一天的努力,都铸就美好未来的希望。相信自己,勇往直前,你将收获无限可能!

只有不断努力,才会收获辉煌的未来;只有持之以恒,才能攀登人生的高峰;只有坚定信念,才能战胜一切困难;只有挑战自我,才能超越自己的极限。奋斗吧,你就是无敌的!

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

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

相关文章

基于Docker-compose实现的Postgresql-11的主从复制

参考文章&#xff1a; http://t.csdn.cn/EnOVn http://t.csdn.cn/XTJqZ 记录一次主从复制的配置经历 服务器主从角色分配 ipdb 版本角色192.168.33.23411主192.168.33.22511从 docker-compose.yml文件 version: "3.3" services:postgres:image: postgresql-gis:11…

Windows11添加用户自定义短语

比如要输入手机号码&#xff0c;直接输入sj就会弹出预先设定好的手机号&#xff0c;也可以预先设置好邮箱&#xff0c;身份证等等&#xff0c;这样就不用输入了 这个咋设置的有时候确实会忘记&#xff0c;所以就记下来了 步骤 第一步 打开设置 时间和语言>语言和区域 第二…

WebRTC的技术原理和使用浅析

一、基本介绍 WebRTC即网页即时通信&#xff0c;是一个支持网页浏览器进行音视频对很多 技术方案。 二、技术特征 1.实时通讯: WebRTc是一项实时通讯技术&#xff0c;允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点的连接&…

Java读取文件内容到字符串

例如当前在D:\\test目录下有一个名为demo.txt的文件&#xff0c;文件里面的内容如下图所示&#xff1a; 第一种方式&#xff1a; 使用BuffererReader 缓冲字符输入流 import lombok.extern.slf4j.Slf4j;import java.io.BufferedReader; import java.io.File; import java.io.…

css对盒模型的理解

面试碰到的一个问题&#xff0c;记录一下 ’ CSS3中的盒模型有以下两种&#xff1a;标准盒子模型、IE盒子模型 盒模型都是由四个部分组成的: 分别是margin、border、padding和content。 标准盒模型和IE盒模型的区别在于设置width和height时&#xff0c;所对应的范围不同&#…

csproj文件常用设置及C#注释常用写法

csproj文件常用设置及C#注释常用写法 .NET新版SDK风格的csproj文件 打开可为空警告 <PropertyGroup><Nullable>enable</Nullable> </PropertyGroup>启动全局引用using 下图没有任何using&#xff0c;仍然不报错 <PropertyGroup><Implicit…

扑克牌最优组合算法题(动态规划+备忘录+快排)

题目如下 题目&#xff1a; 设一副包含点数从A到K,四种花色的52张牌, 将 三张及以上同点数不同花色的牌组 或者三张以及上的同花顺称为 组合, 求出给定一副20张以内的牌中,所能形成的最优的组合列表(最优即组合点数累加最大) 代码要运行正确而且要做输入处理&#xff0c;输出格…

Uncaught TypeError: Illegal invocation

使用console.time报错 console.time将在当前对象(即支持)的上下文中执行&#xff0c;发现一些老的chrome版本中&#xff0c;上下文可能有问题. 解决&#xff1a; 可以使用 console.time.call(window,1111)

关于Easy Mesh

随着网络技术的高速发展&#xff0c;家庭宽带进入了千兆时代&#xff0c;AR&#xff0c;VR&#xff0c;8K影视等高品质产品和智能家居正以前所未有的速度进入寻常百姓家&#xff0c;由于网络覆盖的问题&#xff0c;给WIFI网络应用带来了更大的考验。 WIFI网络覆盖一般是有四种方…

git下载总是报错:身份认证失败的解决办法

在利用git命令下载代码时&#xff0c;提示输入用户名和密码&#xff0c;但是总是显示身份认证失败&#xff0c;在修改密码后仍然没有解决。于是&#xff0c;换了一种方式&#xff0c;采用SSH。 首先在本地生成ssh-key 在虚拟机中执行命令 ssh-keygen -t rsa -C "github…

不再手动PS,教你如何快速删除图片文字!

可以让你快速从照片中提取和复制任何对象的应用。它可以让你轻松地将照片中的物品、人物、动物、文字等放到其他应用中&#xff0c;比如Photoshop、PowerPoint、Word等。ClipDrop还有一个很有用的功能&#xff0c;就是可以去除照片中的文字&#xff0c;让你得到一个干净的背景。…

【MySQL】MySQL数据库基础

目录 一、数据库概念 二、数据库基本使用 1、链接服务器 2、服务器管理 3、使用案例 3.1、创建数据库 3.2、使用数据库 4、服务器&#xff0c;数据库&#xff0c;表关系 三、MySQL架构 四、SQL分类 五、存储引擎 1、存储引擎概念 2、查看存储引擎 3、存储引擎对比…

【强化学习】常用算法之一 “A3C”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

前端JS一维数组转树状数组并获取当前节点的所有父级名称或id

注意一维数组里面必须要有属性跟父级关联 test(){const list2 [{id: 1,pid: 0,name: 湖南},{id: 2,pid: 1,name: 长沙},{id: 3,pid: 2,name: 雨花区},];// 参数一:需要转树状数组的数组// 参数二:父id// 参数三:当前递归的父级节点name// 参数三:当前递归的父级节点idconst ar…

移远通信再推模组新品,全新5G智能模组SG530C-CN智创全景智慧生活

6月28日&#xff0c;在2023 MWC上海展会首日&#xff0c;移远通信再次宣布推出模组新品。 此次推出的全新5G智能模组SG530C-CN在连接能力、算力、多媒体性能与成本效益等层面都呈现较高水平。该模组将在智慧零售、车载后装、娱乐/直播、手持终端、工业AI等行业与应用场景上大有…

大数据需要一场硬件革命

光子盒研究院 计算领域的进步往往集中在软件上&#xff1a;华丽的应用程序和软件可以跟踪人和生态系统的健康状况、分析大数据&#xff0c;并在智力竞赛中击败人类冠军。与此同时&#xff0c;对支撑所有这些创新的硬件进行全面改革的努力相对来说&#xff0c;略显小众。 自2020…

如何实现MySQL的读写分离?

其实很简单&#xff0c;就是基于主从复制架构&#xff0c;简单来说&#xff0c;就搞一个主库&#xff0c;挂多个从库&#xff0c;然后我们就单 单只是写主库&#xff0c;然后主库会自动把数据给同步到从库上去。 MySQL主从复制原理的是啥&#xff1f; 主库将变更写入 binlog …

架构图的实现过程

项目需求架构图 实现代码 index.vue <template><!-- 外层div --><div class"topu-container" :style"{ minWidth: ${functionDomainList.length * 330}px }"><!-- 头部显示 --><div class"topu-heard"><!-- …

vue3高德地图点击标点

1.首先如果没有key的话需要在高德开发平台申请key。 2.安装 npm i amap/amap-jsapi-loader --save cnpm i amap/amap-jsapi-loader --save3.容器&#xff1a; <template><div><div class"info"><h4>获取地图级别与中心点坐标</h4>&l…

git常用命令之Cherry-pick

8. Cherry-pick 8.1 基本用法 命令作用延展阅读git cherry-pick 125a1d将提交125a1d应用于当前分支. 在当前分支会产生一个新的提交.链接git cherry-pick bugfix将分支bugfix应用于当前分支. 在当前分支会产生一个新的提交. 场景1&#xff1a;提交125a1d应用到master分支 命…