首页 > 编程语言 >python - mock 处理

python - mock 处理

时间:2023-05-06 19:11:51浏览次数:34  
标签:__ return python pay self 接口 处理 mock

前言

在现在的软件开发过程中,特别是app的部分,需要的很多数据以及内容,都是来自server端的API,但是不能保证在客户端开发的时候,
api在server端已经开发完成,专门等着前端来调用,理想的情况是前端在开发的时候,已经有人写好了接口,直接调用就可以了。
但往往是页面写好了,后端接口没有写好,这时前端等后端的话就会比较浪费时间。


mock的作用

  1. 单元测试,函数A的参数需要函数B的返回,但是函数B原先已经测试过了,就不要重新再测试了,这时就可以用mock模块来模拟函数B的返回。
  2. 依赖第三方接口的测试,比如说获取身份信息,支付等第三方接口,做自动化测试或者性能测试的时候就可以利用mock来模拟第三方接口的返回。
  3. 前后端联调,前端开发写页面比较快,这时就可以通过mock来模拟后端接口的情况,就不需要等后端把接口写好再来联调了。


先举一个例子

通过 return_value 参数在构造函数中设置返回值,看官方的例子:


import unittest
from unittest import mock


def add(a, b):
    """两个数相加的功能"""
    pass  # 还没有时间开发这个功能,占个坑


# 测试 add
class TestAdd(unittest.TestCase):
    def test_add(self):
        """
        www = mock.Mock(return_value=8)  # 构造mock 返回 8
        print(type(www))  # <class 'unittest.mock.Mock'>,  类对象
        result = www(4, 4, 4)  # 这里无论怎么写,result的值都是 8 ,所以 www(4, 4) 这里就可以随便构造函数了
        self.assertEqual(result, 8)  #  断言,判断两个值相等
        """
        add = mock.Mock(return_value=8)
        result = add(4, 4)  # 构造函数 add 的格式
        self.assertEqual(result, 8)


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



如果开发把功能开发好了,那怎么处理了呢,很简单,传一个 side_effect 关键字参数即可。改一下代码

import unittest
from unittest import mock


def add(a, b):
    """两个数相加的功能"""
    return a + b  # 开发把两个数相加的功能开发好了


# 测试 add
class TestAdd(unittest.TestCase):
    def test_add(self):
        """
        www = mock.Mock(return_value=8)  # 构造mock 返回 8
        print(type(www))  # <class 'unittest.mock.Mock'>,  类对象
        result = www(4, 4, 4)  # 这里无论怎么写,result的值都是 8 ,所以 www(4, 4) 这里就可以随便构造函数了
        self.assertEqual(result, 8)  #  断言,判断两个值相等
        """
        testAdd = mock.Mock(return_value=8, side_effect=add)  # 传side_effect关键字参数, 会覆盖return_value参数值, 使用真实的add方法测试
        result = testAdd(4, 4)  # 这里调的就是上面 add 的方法了,只能传入两个参数,可以改来试试
        self.assertEqual(result, 8)


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




用户-商户-第三方支付的业务流程


假设一个场景:

支付模块,开发没有跟第三方平台对接好支付接口,或者你跑自动化脚本的时候不想每次都真实支付。
平时的功能测试可以真实支付,测试完成后,去找财务报销即可。我们做自动化测试的时候就可以使用mock功能来模拟第三方的返回。
你可以根据接口文档的规定,把接口的地址和入参传过去,然后自己mock接口的不同返回界面。


第三方支付的接口是这样子:


模拟第三方支付接口的返回

# pay.py

import requests


class PayApi(object):

    def zhifubao(self, out_trade_no, total_amount, subject, store_id, timeout_express):
        """第三方支付的接口,比如支付宝,微信等"""
        pay_url = "http://www.pay.com"  # 第三方支付接口地址
        data = {
            "out_trade_no": out_trade_no,
            "total_amount": total_amount,
            "subject": subject,
            "store_id": store_id,
            "timeout_express": timeout_express
        }
        response = requests.post(pay_url, json=data)  # 请求第三方支付接口
        return response  # 返回状态码

    def pay(self, user_id, out_trade_no, total_amount, subject, store_id, timeout_express):
        """自己项目的接口"""

        # 调用第三方支付接口
        response = self.zhifubao(out_trade_no, total_amount, subject, store_id, timeout_express)
        try:
            if response['status_code'] == '200':
                return '支付成功'
            elif response['status_code'] == '201':
                return '支付失败,余额不足'
            else:
                return '未知错误'
        except Exception:
            return "Error, 服务器异常,请重试!"


if __name__ == '__main__':
    pass

以上第三方接口是模拟的,不能真正运行,通过mock来模拟,以下编写测试用例

# test_pay.py

import unittest
from unittest import mock
from pay import PayApi


class TestPayApi(unittest.TestCase):

    def test_success(self):
        pay = PayApi()
        pay.zhifubao = mock.Mock(return_value={'status_code': '200'})  # {'status_code': '200'}返回给 zhifubao
        status = pay.pay("001", "2021120921", "1999", "pay002", "dev100", "121")
        self.assertEqual(status, '支付成功')

    def test_fail(self):
        pay = PayApi()
        pay.zhifubao = mock.Mock(return_value={'status_code': '201'})
        status = pay.pay("002", "2021120921", "1998", "pay003", "dev101", "60")
        self.assertEqual(status, '支付失败,余额不足')


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

上面这个就是使用mock对象的基本使用,在上面的例子中我们替换了自己写的模块的对象,其实也可以替换标准库和第三方模块的对象。

标签:__,return,python,pay,self,接口,处理,mock
From: https://www.cnblogs.com/qin512/p/17378282.html

相关文章

  • python 制作奥运五环 (turtle模块)
     importturtle#第一个圈turtle.width(10)#画笔宽度10turtle.color("black")#画笔的颜色turtle.circle(50)#半径50的圆#第二个圈turtle.penup()#抬笔turtle.goto(110,0)#去到坐标(110,0)turtle.pendown()#放笔turtle.width(10)turt......
  • 使用Python扩展PAM(part 1)
    0、使用Python扩展PAM实现一些额外的功能,比如ssh、vpn等二次验证。1、准备工具实现这个功能需要用到pam_python pam-python 注意!是pam-python不是python_pamPam-python是一个开源的Python模块,用于编写自定义PAM模块。Pam-python使用Python脚本来扩展PAM功能。它使用Cython和Pyt......
  • mule 3.9.0 没有mac arm 版本的处理办法
    现在官方只能下载到3.9.5的mac版本使用javaservicewraaper包装的并不支持偷梁换柱大法下载mule-enterprise-standalone-3.9.5企业版本mule-standalone-3.9.0社区版本把lib/boot、bin、conf全部替换到掉mule-standalone-3.9.0对应目录下设置为x86_64arch-x......
  • python给onnet上报数据
      #!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2021/2/2423:01#@Author:LiShan#@Email:[email protected]#@File:OneNet_Post.py#@Note:https://blog.csdn.net/lishan132/article/details/114044902importurllib.requesti......
  • python中怎么输出字典中字典的值
    #T要求输出'./a/text()url_gglb_xpath_dic={'中国邮政储蓄银行':{'发行公告':['https://www.psbc.com/cn/grfw/tzlc/lc/ywgg/lcxsgg/index_页码.html','https://www.psbc.com/cn/grfw/tzlc/lc/ywgg/lcxsgg&#......
  • python中判断多个元素是否在列表中
    判断单个元素是否在列表中时可以通过in>>>'a'in['a','b','c']True但如果是多个元素,就不能通过in进行判断此时我们可以通过集合中的issubset和issuperset方法顾名思义,issubset是判断某集合是否是另外一个集合的子集,issuperset是判断某集合是否是另外一个集合的超集>>>......
  • 第五章 输入输出系统 5.3 中断机构和中断处理程序
    中断是多道程序得以实现的基础,是设备管理的基础;中断处理程序是I/O系统中最低的一层,是整个I/O系统的基础。一、中断简介 1.中断和陷入 中断:CPU对I/O设备发来的中断信号的响应。 陷入:由CPU内部事件(非法指令、越界、运算上溢下溢等)所引起的中断。 2.中断向量表和中断优......
  • python操作elasticsearch 记录
    一、环境Elasticsearch5.x, python3.6, 注意Elasticsearch不同版本的区别,比如以下几条:_id 字段变为 id 字段:在Elasticsearch5中,文档的唯一标识符使用 _id 字段。而在Elasticsearch6和7中,唯一标识符改为使用 id 字段。在Elasticsearch7中,_id字段被重新引......
  • GaussDB(DWS)字符串处理函数返回错误结果集排查
    摘要:在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应该从encoding和数据本身开始排查。本文分享自华为云社区《GaussDB(DWS)字符串处理函数返回错误结果集排查》,作者:-CHEN111-。在使用字符串处理函数时,有时会出现非预期结果的场景。在排除使用问题后,应......
  • 番外篇:分享一道用Python基础+蒙特卡洛算法实现排列组合的题目(附源码)
    今日鸡汤夕阳无限好,只是近黄昏。    大家好,我是Python进阶者。    是不是觉得很诧异?明明上周刚发布了这篇:分享一道用Python基础+蒙特卡洛算法实现排列组合的题目(附源码),今天又来一篇,名曰番外篇!其实今天是想给大家分享【......