zoukankan      html  css  js  c++  java
  • python Mock基本使用

    mock简介

    mock原是python的第三方库。python3以后mock模块已经整合到了unittest测试框架中,不用再单独安装。Mock这个词在英语中有模拟的意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为既然mock已经被整合到了unittest单元测试框架中,可想而知mock的目的就是为了让我们更好的进行测试

    mock作用

    1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模块,那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以使用mock模拟被依赖接口,完成目标接口的测试

    2. 单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试

    3. 模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复杂的接口业务,那么我们完全可以使用mock来模拟这个复杂的业务接口,其实这个和解决接口依赖是一样的原理

    4.前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同的页面,那么你就需要调用后台的接口,但是后台接口还未开发完成,是不是你就停止这部分工作呢?答案是否定的,你完全可以借助mock来模拟后台这个接口返回你想要的数据

    支付案例:第三方支付接口目前不能调用情况下 使用mock完成测试

    支付功能: payment.py

    import requests
    from unittest import mock
    
    def request_lemonfix():
        """
    
        :return:
        """
        res = requests.get('http://www.lemonfix.com')
        return res.status_code.encode('utf-8')
    
    
    if __name__ == '__main__':
        request_lemonfix = mock.Mock(return_value="这里会显示论坛主页")
        print(request_lemonfix())
    然后再来一个实用的例子:第三方支付接口目前不能调用情况下 使用mock完成测试
    
    import requests
    
    
    class Payment:
        """
        定义第三方支付类
        """
        def authe(self, card_num, amount):
            """
            请求第三方支付接口,并返回响应码
            :param card_num: 卡号
            :param amount: 金额
            :return: 返回状态码200 代表支付成功,500 代表支付异常
            """
            url = "https://www.dd.com"  # 第三方的url
            data = {"card_num": card_num, "amount": amount}
            response = requests.post(url, data=data)
            return response.status_code
    
        def pay(self, user_id, card_num, amount):
            """
            支付
            :param user_id: 用户id
            :param card_num: 卡号
            :param amount: 金额
            :return:
            """
            try:
                status_code = self.authe(card_num, amount)
            except TimeoutError:
                status_code = self.authe(card_num, amount)
    
            if status_code == 200:
                print("支付成功")
                return "success"
            if status_code == 500:
                print("支付失败")
                return "fail"

    测试Case功能:Mock_demo

    # -*- coding: utf-8 -*-
    #@Time : 2021/11/2 20:16
    #@Auth : Ann
    #@File :modular.py
    #@IDE :PyCharm
    import requests
    
    class Payment:
        """
        定义第三方支付类
        """
        def authe(self, card_num, amount):
            """
            请求第三方支付接口,并返回响应码
            :param card_num: 卡号
            :param amount: 金额
            :return: 返回状态码200 代表支付成功,500 代表支付异常
            """
            url = "https://www.dd.com"  # 第三方的url
            data = {"card_num": card_num, "amount": amount}
            response = requests.post(url, data=data)
            return response.status_code
    
        def pay(self, user_id, card_num, amount):
            """
            支付
            :param user_id: 用户id
            :param card_num: 卡号
            :param amount: 金额
            :return:
            """
            try:
                status_code = self.authe(card_num, amount)
            except TimeoutError:
                status_code = self.authe(card_num, amount)
    
            if status_code == 200:
                print("支付成功")
                return "success"
            if status_code == 500:
                print("支付失败")
                return "fail"
  • 相关阅读:
    确保EF上下文线程内唯一
    linq的join
    编码:隐匿在计算机软硬件背后的语言
    EF删除数据
    插入数据返回主键值用 output inserted.UId
    Fancybox丰富的弹出层效果
    回车登录
    “:Choose a destination with a supported architecture in order to run on this device.”
    How to Enable Multi-Touch
    How does CCFileUTils::fullPathForFilename work
  • 原文地址:https://www.cnblogs.com/lanyinhao/p/15501081.html
Copyright © 2011-2022 走看看