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中的exec、eval使用实例
Sep 23 Python
Python中for循环控制语句用法实例
Jun 02 Python
Django中处理出错页面的方法
Jul 15 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 Python
Python调用服务接口的实例
Jan 03 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Python利用scapy实现ARP欺骗的方法
Jul 23 Python
django 控制页面跳转的例子
Aug 06 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
python编程的核心知识点总结
Feb 08 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
跟我学Laravel之安装Laravel
2014/10/15 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
js word表格动态添加代码
2010/06/07 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
js创建对象的方式总结
2015/01/10 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
后勤人员岗位职责
2013/12/17 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
精彩的英文自荐信
2014/01/30 职场文书
促销活动总结范文
2014/04/30 职场文书
运动会班级口号
2014/06/09 职场文书
学校清明节活动总结
2014/07/04 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
先进个人评语大全
2015/01/04 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript