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使用socket远程连接错误处理方法
Apr 29 Python
python抓取网页中图片并保存到本地
Dec 01 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
flask框架视图函数用法示例
Jul 19 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
使用python实现飞机大战游戏
Mar 23 Python
python用什么编辑器进行项目开发
Jun 17 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
SpringBoot首页设置解析(推荐)
Feb 11 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中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Javascript - HTML的request类
2007/01/09 Javascript
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python如何读写csv数据
2018/03/21 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
python实现ip代理池功能示例
2019/07/05 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
python随机模块random使用方法详解
2020/02/14 Python
python 等差数列末项计算方式
2020/05/03 Python
Python新手如何理解循环加载模块
2020/05/29 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
企业读书活动总结
2014/06/30 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
法律讲堂观后感
2015/06/11 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers