python mock简单了解使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python mock简单了解使用相关的知识,希望对你有一定的参考价值。

参考技术A Mock就是模拟,在测试一个对象或服务时,为排除其他因素对本身对象或服务的测试,事先设定且符合预期的(正常和异常处理)Mock对象。来被测对象功能是否满足需求,异常逻辑或压力情况下工作是否正常
如此例模拟通过第三方接口返回的状态,假设自己写的一个处理逻辑是oneurl_is_accessable()
oneurl()的功能是访问 http://XXX.com ,状态需要依赖的第三方接口的返回,要验证的自己写的逻辑oneurl_is_accessable()判断第三方接口返回的状态码,如果是200返回‘访问正常’,否则‘访问异常’
tmptestdemo.py文件为被测逻辑所在文件,具体内容如下

testdemo.py为测试模块
对被测对象oneurl_is_accessable()编写用例,利用mock模拟oneurl()的返回状态

执行结果:

Python中使用mock.Mock()进行mock测试

先来一个简单的例子:

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"

下面来看测试类:

import unittest
from payment import Payment
from unittest import mock


class PaymentTest(unittest.TestCase):
    """
    测试支付接口
    """
    def setUp(self):
        self.payment = Payment()

    def test_success(self):
        """
        测试支付成功
        :return:
        """
        self.payment.authe = mock.Mock(return_value=200)
        res = self.payment.pay(user_id=10001, card_num="123444", amount=1000)
        self.assertEqual("success", res)

    def test_fail(self):
        """
        测试支付成功
        :return:
        """
        self.payment.authe = mock.Mock(return_value=500)
        res = self.payment.pay(user_id=10002, card_num="1233444", amount=1000)
        self.assertEqual("fail", res)

    def test_retry_success(self):
        """
                测试支付失败重试在成功
                side_effect 可以为序列类型 异常类型,对象
                如果为序列类型 每次调用mock对象,会依次将side effcet中的元素返回
                :return:
                """
        self.payment.authe = mock.Mock(side_effect=[TimeoutError, 200])
        res = self.payment.pay(user_id=10003, card_num="1234444", amount=1000)
        self.assertEqual("success", res)


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

  

以上是关于python mock简单了解使用的主要内容,如果未能解决你的问题,请参考以下文章

python mock 使用

mock搭建——python——搭建一个简单的mock服务

mock搭建——python——搭建一个简单的mock服务

python接口自动化测试 - mock模块基本使用介绍

Python中好用的第三方mock库-httmock

python 接口测试之Mock