python实现mock测试

python + flask+mock实现简单的mock测试

#pip install flask
from flask import Flask, request, json,jsonify

#实例化Flask类
app = Flask(__name__)
#flask 轻量级web框架
#jsonify 用来序列化返回的json格式的数据
#request 用来获取调用接口时传入的数据

#app.route定义的路由,第一个参数为接口路径,第二个参数为请求方法,不写默认为get
@app.route('/mock', methods=['POST'])
def mock():
    """ 模拟运营商系统
    :param mobile:用户手机号
    :param password:运营商密码
    :return:性别、身份证号、话费
    """
    #获取表单数据
    mobile = request.form['mobile']
    password = request.form['password']
    #获取请求中的入参
    user=request.get_json()
    #获取请求头
    header=request.headers
    # 获取传入的参数pwd  例如传入的是 {"pwd":"123456"}
    pwd=request.values.get('pwd')

    try:
        assert password == 'a123456', u'运营商密码错误'

        if mobile == "12345678901":
            data = {'sex': 'man', 'Id number': '111111111111111111', 'charge': 105}
        elif mobile == "12345678902":
            data = {'sex': 'woman', 'Id number': '1111111111111112', 'charge': 120}
        elif mobile == "12345678903":
            data = {'sex': 'man', 'Id number': '111111111111111113', 'charge': 135}
        else:
            data = {'msg': 'mobile number not found'}
    except:
        data = {'msg': 'password error'}

    return json.dumps(data)



if __name__ == '__main__':
    #启用服务 debug=True,加上这个参数之后不用重新执行,他会自动执行
    app.run(debug=True)

调用时可用postman,jmeter,python等

另外还可以使用unittest自带的mock 和pytest自带的mock

#payment.py
import requests


class Payment:
    """
    定义第三方支付类
    """
    def auth(self, card_num, amount):
        """
        请求第三方外部支付接口的方法, 返回响应状态码
        :param card_num: 卡号
        :param amount: 金额
        :return: 返回状态码, 200 代表支付成功, 500 代表支付异常, 失败
        """
        url = "http://第三方支付url.payment"
        data = {"card_num": card_num, "amount": amount} # 请求参数
        self.res = requests.post(url, data=data)
        return self.res.status_code  # 返回的状态码

    def pay(self, user_id, card_num, amount):
        """
        支付方法
        :param user_id: 用户ID
        :param card_num: 卡号
        :param amount: 支付金额
        :return:
        """
        try:
            status_code = self.auth(card_num, amount)
        except TimeoutError:
            status_code = self.auth(card_num, amount)   # 如果支付超时, 再请求一次

        if status_code == 200:
            print("[{}]支付[{}]成功!!! 进行扣款并登记支付记录".format(user_id, amount))
            return "success"
        elif status_code == 500:
            print("[{}]支付[{}]失败!!! 不进行扣款".format(user_id, amount))
            return "Fail"
#test_pay.py
import unittest
from unittest import mock

from unittest_mock.payment import Payment


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

    def test_1_success(self):
        """
        测试支付成功
        :return:
        """
        self.payment.auth = mock.Mock(return_value=200)
        res = self.payment.pay(user_id=1001, card_num=12345678, amount=5000000)
        self.assertEqual('success', res)

    def test_2_fail(self):
        """
        测试支付失败
        :return:
        """
        self.payment.auth = mock.Mock(return_value=500)
        res = self.payment.pay(user_id=1001, card_num=12345678, amount=5000000)
        self.assertEqual('Fail', res)

    def test_3_retry_success(self):
        """
        测试调用第三方接口超时之后, 再次支付成功
        :return:
        """
        self.payment.auth = mock.Mock(side_effect=[TimeoutError, 200])
        res = self.payment.pay(user_id=1001, card_num=12345678, amount=5000000)
        self.assertEqual('success', res)

    def test_4_retry_fail(self):
        """
        测试调用第三方接口超时之后, 再次支付失败
        :return:
        """
        # side_effect 第一次会得到列表第一个值抛出TimeoutError的异常,抛出异常payment.py里会再次调用第
        # 三方支付接口auth,接着将列表第2个值 500返回给auth,pay函数里面代码判断 500 为失败 Fail.
        # side_effect 参数可以等于另外一个函数 函数的返回值,作为Mock函数的返回值,例子这里就不举了。
        self.payment.auth = mock.Mock(side_effect=[TimeoutError, 500])
        res = self.payment.pay(user_id=1001, card_num=12345678, amount=5000000)
        self.assertEqual('Fail', res)


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

 后面内容转载自:Mock:unittest - 简书 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值