在测试过程中,为了更好地展开单元测试,mock一些数据跟对象在所难免,下面讲一下python的mock的简单用法。

关于python mock,网上有很多资料,这里不会讲的特别深,但一定会是实用为主,看完后,至少可以让你知道mock是怎样用的。

1.mock对象方法中的返回数据:

我们经常会需要这样的场景,a系统跟b系统联调,b系统开发人员进度较慢,有些a需要调用b系统api的返回数据没办法拿到,这时候,不改变原来的代码,但联调需要保证a系统这边功能完全ok

的场景就可以用到mock这个模块了。

在这里,我们假设b系统完成时是以下这个样子

system_b.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import requests def send_request(url):
r = requests.get(url)
return json.loads(r.text) def visit_ustack():
return send_request('http://api.kanzhihu.com/getposts') if __name__ == '__main__':
content = visit_ustack()
print content

我们通过调用visit_ustack()这个入口,可以得到http://api.kanzhihu.com/getposts这个接口返回的json数据。理想测试情况下,a系统这边的测试代码是这样的

system_a.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- import system_b def system_b_test():
if system_b.visit_ustack()['count'] == 10:
print "system b正常,测试通过"
else:
print "system b异常,测试失败" system_b_test()

结果显而易见是这样的

/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python /Users/lsf/PycharmProjects/py_pattern/test.py
system b正常,测试通过 Process finished with exit code 0

但现在糟糕的是,系统 b的主体函数send_request还没开发,我们没办法获取json格式的数据,当然,现实中可以通过很多其他的办法来解决,但为了最大程度仿真b系统,现在可以通过mock来完成这项工作。

现实中功能未完成的a系统

system_a.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- def send_request(url):
pass def visit_ustack():
return send_request('http://api.kanzhihu.com/getposts') if __name__ == '__main__':
content = visit_ustack()
print content

system_b.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- import mock
import system_b def system_b_test():
mock_result = {u'count': 1000, u'publishtime': u'1470798000', u'date': u'2016-08-10', u'id': u'2375'}], u'error': u''}
system_b.send_request = mock.Mock(return_value=mock_result)
if system_b.visit_ustack()['count'] == 1000:
print "system b正常,测试通过"
else:
print "system b异常,测试失败" system_b_test()

结果是

/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python /Applications/PyCharm.app/Contents/helpers/pycharm/utrunner.py /Users/lsf/PycharmProjects/py_pattern/test.py true
Testing started at 15:24 ...
system b正常,测试通过 Process finished with exit code 0
Empty test suite.

在这里,我们通过直接mock一个json数据,来达到b系统返回数据的目的,甚至我们调用的依然是b系统的接口,区别已用红色字体标出,这个就是mock的操作了。

(1)mock_result:准备需要的mock数据

(2)用mock.Mock(return_value=mock_result)将mock对象设置给系统b对应的返回方法中

值得注意的是,mock.Mock(return_value=mock_result)是一个对象,但为什么system_b.send_request = mock.Mock(return_value=mock_result)返回的是数据而不是对象的其他属性跟方法呢,在这里,是因为mock对象中有一个side_effect属性,如果这个属性为None,就会将return_value设置的值返回。

2.mock对象中的方法:mock.patch跟mock.patch.object

#!/usr/bin/env python
# -*- coding: utf-8 -*- import mock class By(object): def add(self, a, b):
return a + b + self.multiply(a,b) def multiply(self, a, b):
pass b = By() class MockDemo(object):
def __init__(self):
self.b = b @mock.patch.object(b,'multiply')
def test_add(self,mock_multiply):
a = 3
b = 5
mock_multiply.return_value = 15
if self.b.add(a,b) == 23:
print "mock成功"
else:
print "mock失败" if __name__ == '__main__':
MockDemo().test_add()

如果mock的是一个函数,则可以用@mock.patch(target='module.func')来实现。

Python mock的更多相关文章

  1. 使用 Python Mock 类进行单元测试

    数据类型.模型或节点——这些都只是mock对象可承担的角色.但mock在单元测试中扮演一个什么角色呢? 有时,你需要为单元测试的初始设置准备一些“其他”的代码资源.但这些资源兴许会不可用,不稳定,或者 ...

  2. Python Mock的入门(转)

    原文:https://segmentfault.com/a/1190000002965620 Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西. ...

  3. Python Mock的入门学习

    一.Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象 ...

  4. 开发神技能 | Python Mock 的入门

    Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...

  5. Python Mock 的入门

    Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...

  6. Python mock 的使用

    使用 mock 对象替换系统的一部分并且能获取它们的使用情况. 具体的说,你可以获取方法/属性的使用情况以及它们的调用参数.也可以指定返回值和设置属性. 思路是将对象设置为 mock 对象,然后根据需 ...

  7. python mock模块使用(二)

    本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 官方文档地址 patch简介 1.unittest.mock.patc ...

  8. python mock模块使用(一)

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...

  9. 一文熟练使用python mock

    mock作为python测试模拟对象工具,在单元测试当中使用较多,官方文档详细不够精简,这篇文章介绍mock常用的用法,以下为引用全文,留给自己和有需要的人查阅. https://realpython ...

随机推荐

  1. 计算机程序的思维逻辑 (53) - 剖析Collections - 算法

    之前几节介绍了各种具体容器类和抽象容器类,上节我们提到,Java中有一个类Collections,提供了很多针对容器接口的通用功能,这些功能都是以静态方法的方式提供的. 都有哪些功能呢?大概可以分为两 ...

  2. RAC 主库配置单实例ADG

    1.主库准备工作 2.物理备库准备工作 3.创建物理备库 写在前面: 最终实现环境:11.2.0.4版本 2节点RAC + 1节点DG 本文旨在弄清楚整个搭建过程中涉及到的基础概念: 本文安装maxi ...

  3. 网站实现微信登录之嵌入二维码——基于yii2开发的描述

    之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...

  4. Java I/O and NIO [reproduced]

    Java I/O and NIO.2---Five ways to maximize Java NIO and NIO.2---Build more responsive Java applicati ...

  5. ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考

    原文:Razor Syntax Reference 作者:Taylor Mullen.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:何镇汐 什么是 Razor? Razor 是一 ...

  6. MVC采用Jquery实现局部刷新

    该文纯粹属于个人学习,有不足之处请多多指教! 效果图: 单击Detail下面出现详细,效果如下: 为了使操作时两个不同的数据源相互干扰,使用局部视图刷新,代码如下: 首先介绍主页Index代码: @m ...

  7. JsCharts图表的介绍和简单使用

    一.JSCharts介绍 JScharts是一个用于在浏览器直接绘制图表的javascript工 具包.JScharts支持柱状图.圆饼图以及线性图,可以直接将这个图插入网页, JScharts图的数 ...

  8. Interview website

    https://www.interviewcake.com http://www.leetcode.com

  9. org.apache.log4j.Logger详解

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...

  10. spider RPC过滤器

    spider支持在请求执行前或完成后进行特殊处理,比如安全性检查.敏感字段混淆等等.为此,spider提供了BeforeFilter和AfterFilter.其执行位置如下图所示: 流水线插件配置在s ...