python mock测试的示例


Posted in Python onOctober 19, 2020

mock总所周知是模拟的意思,我们在做接口测试的时候有时候会发现部分功能依赖其他业务场景或者第三方功能或者是线上数据或者业务场景过于复杂(需要大量调用)的情况,没有办法通过接口调用或者做断言,这个时候就需要mock了

python2中需要pip install mock来导入mock第三方模块,而python3中被引入到unittest框架中,直接from unittest import mock 就可以导入mock模块了

在单元测试中只针对当前单元做测试,就是测试当前方法或者是当前类,但是如果出现这个方法依赖其他第三方模块,那不是还要校验其他方法了吗,那就违背了单元测试这个概念了,所有将外部依赖组件实现模拟并替换掉,使得单元测试的焦点放在自己身上

为了演示,用fastapi模拟了一个tx和ali的接口来调用作为单元测试,可以看到需要同时调用两个接口才能完成单元测试

from unittest import TestCase, main, mock
import requests


class Request(object):
  def request_tx(self):
    tx_url = 'http://127.0.0.1:8000/tx'
    tx_data = {"a": 1, "b": 2}
    tx_result = requests.post(tx_url, json=tx_data)
    tx_result = tx_result.json()
    return tx_result

  def request_ali(self):
    ali_url = 'http://127.0.0.1:8000/ali'
    ali_data = {"c": 1, "d": 2}
    ali_result = requests.post(ali_url, json=ali_data)
    ali_result = ali_result.json()
    return ali_result


class Myproject(TestCase):
  def test_api(self):
    r = Request()
    ali_result = r.request_ali()
    tx_result = r.request_tx()
    self.assertEqual(int(ali_result['result']['all_add_value']) + int(tx_result['result']['all_add_value']), 6)
'''
@File    : mock_third_server.py
@Copyright : rainbol
@Date    : 2020/9/28
@Desc    :
'''

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn

app = FastAPI()


def add(a, b):
  return a + b


# json参数传参
class TX(BaseModel):
  a: int
  b: int


@app.post('/tx')
def txApi(u: TX):
  u.a += 1
  u.b -= 1
  add_result = add(u.a, u.b)
  return {'status': 1, 'result': {'value_a': u.a, 'value_b': u.b, 'all_add_value': add_result}}


class Al(BaseModel):
  c: int
  d: int


@app.post('/ali')
def aliApi(u: Al):
  u.c *= 1
  u.d /= 1
  add_result = add(u.c, u.d)
  return {'status': 1, 'result': {'value_c': u.c, 'value_d': u.d, 'all_add_value': add_result}}


if __name__ == '__main__': # 一定要加上这句话才行
  uvicorn.run('mock_third_server:app', port=8000, debug=True)

可以看到上面的接口是可以调通的如果txapi因为一些原因不能返回,ali的接口是通的,如果要实现ali接口的测试就需要使用mock来模拟tx的接口了

mock方法一:(对于同一文件下/不同文件下的方法或者类进行mock)

'''
@File    : mock_third_server.py
@Copyright : rainbol
@Date    : 2020/9/28
@Desc    :
'''

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn

app = FastAPI()


def add(a, b):
  return a + b


# json参数传参
class TX(BaseModel):
  a: int
  b: int


@app.post('/tx')
def txApi(u: TX):
  u.a += 1
  u.b -= 1
  add_result = add(u.a, u.b)
  raise("接口异常") # 在这里加了异常
  return {'status': 1, 'result': {'value_a': u.a, 'value_b': u.b, 'all_add_value': add_result}}


class Al(BaseModel):
  c: int
  d: int


@app.post('/ali')
def aliApi(u: Al):
  u.c *= 1
  u.d /= 1
  add_result = add(u.c, u.d)
  return {'status': 1, 'result': {'value_c': u.c, 'value_d': u.d, 'all_add_value': add_result}}


if __name__ == '__main__': # 一定要加上这句话才行
  uvicorn.run('mock_third_server:app', port=8000, debug=True)
'''
@File    : local_project_mock_test.py
@Copyright : rainbol
@Date    : 2020/9/28
@Desc    :
'''

from unittest import TestCase, main, mock
import requests


class Request(object):
  def request_tx(self):
    tx_url = 'http://127.0.0.1:8000/tx'
    tx_data = {"a": 1, "b": 2}
    tx_result = requests.post(tx_url, json=tx_data)
    tx_result = tx_result.json()
    return tx_result

  def request_ali(self):
    ali_url = 'http://127.0.0.1:8000/ali'
    ali_data = {"c": 1, "d": 2}
    ali_result = requests.post(ali_url, json=ali_data)
    ali_result = ali_result.json()
    return ali_result


class Myproject(TestCase):
  def test_api(self):
    r = Request()
    ali_result = r.request_ali()
    tx_mock = mock.Mock(
      return_value={"status": 1, "result": {"value_a": 2, "value_b": 1, "all_add_value": 3}})
    r.request_tx = tx_mock
    tx_result = r.request_tx()
    self.assertEqual(int(ali_result['result']['all_add_value']) + int(tx_result['result']['all_add_value']), 6)


if __name__ == '__main__':
  main()

#以上将request_tx方法mock掉,可以mock掉写在同一文件的方法

mock方法二:@patch(对于不同文件下的类进行mock)

'''
@File    : local_project_mock_test.py
@Copyright : rainbol
@Date    : 2020/9/28
@Desc    :
'''

from unittest import TestCase, main
from unittest.mock import patch
import mock_request_server


class Myproject(TestCase):
  @patch("mock_request_server.Request.request_tx") # @patch装饰器模拟类对象
  def test_api(self, _mock_tx):
    _mock_tx.return_value = {'status': 1, 'result': {'value_a': 2, 'value_b': 1, 'all_add_value': 3}}
    r = mock_request_server.Request()
    ali_result = r.request_ali()

    tx_result = r.request_tx()
    print(tx_result)
    self.assertEqual(int(ali_result['result']['all_add_value']) + int(tx_result['result']['all_add_value']), 6)


if __name__ == '__main__':
  main()
'''
@File    : mock_request_server.py
@Copyright : rainbol
@Date    : 2020/9/28
@Desc    :
'''
import requests


class Request:
  def request_tx(self):
    tx_url = 'http://127.0.0.1:8000/tx'
    tx_data = {"a": 1, "b": 2}
    tx_result = requests.post(tx_url, json=tx_data)
    tx_result = tx_result.json()
    raise('接口异常') 
    return tx_result

  def request_ali(self):
    ali_url = 'http://127.0.0.1:8000/ali'
    ali_data = {"c": 1, "d": 2}
    ali_result = requests.post(ali_url, json=ali_data)
    ali_result = ali_result.json()
    return ali_result
'''
@File    : mock_third_server.py
@Copyright : rainbol
@Date    : 2020/9/28
@Desc    :
'''

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn

app = FastAPI()


def add(a, b):
  return a + b


# json参数传参
class TX(BaseModel):
  a: int
  b: int


@app.post('/tx')
def txApi(u: TX):
  u.a += 1
  u.b -= 1
  add_result = add(u.a, u.b)
  return {'status': 1, 'result': {'value_a': u.a, 'value_b': u.b, 'all_add_value': add_result}}


class Al(BaseModel):
  c: int
  d: int


@app.post('/ali')
def aliApi(u: Al):
  u.c *= 1
  u.d /= 1
  add_result = add(u.c, u.d)
  return {'status': 1, 'result': {'value_c': u.c, 'value_d': u.d, 'all_add_value': add_result}}


if __name__ == '__main__': # 一定要加上这句话才行
  uvicorn.run('mock_third_server:app', port=8000, debug=True)

以上就是python mock测试的示例的详细内容,更多关于python mock测试的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python可跨平台实现获取按键的方法
Mar 05 Python
python妙用之编码的转换详解
Apr 21 Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 Python
python中正则表达式的使用方法
Feb 25 Python
Python实现的微信好友数据分析功能示例
Jun 21 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
python binascii 进制转换实例
Jun 12 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
python GUI计算器的实现
Oct 09 Python
一篇文章教你用python画动态爱心表白
Nov 22 Python
正确的理解和使用Django信号(Signals)
Apr 14 Python
python 提高开发效率的5个小技巧
Oct 19 #Python
python 利用toapi库自动生成api
Oct 19 #Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 #Python
python爬取音频下载的示例代码
Oct 19 #Python
Python爬虫教程知识点总结
Oct 19 #Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 #Python
如何利用python读取micaps文件详解
Oct 18 #Python
You might like
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
js读取本地文件的实例
2017/12/22 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
python读文件逐行处理的示例代码分享
2013/12/27 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python获取代码运行时间的实例代码
2018/06/11 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
Born鞋子官网:Born Shoes
2017/04/06 全球购物
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
100%法国制造的游戏和玩具:Les Jouets Français
2021/03/02 全球购物
企业文化宣传标语
2014/06/09 职场文书
ktv好的活动方案
2014/08/15 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
仲裁协议书
2014/09/26 职场文书
班主任自我评价范文
2015/03/11 职场文书
社区义诊通知
2015/04/24 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
python基础之类方法和静态方法
2021/10/24 Python