Python mock
在测试过程中,为了更好地展开单元测试,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的更多相关文章
- 使用 Python Mock 类进行单元测试
数据类型.模型或节点——这些都只是mock对象可承担的角色.但mock在单元测试中扮演一个什么角色呢? 有时,你需要为单元测试的初始设置准备一些“其他”的代码资源.但这些资源兴许会不可用,不稳定,或者 ...
- Python Mock的入门(转)
原文:https://segmentfault.com/a/1190000002965620 Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西. ...
- Python Mock的入门学习
一.Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象 ...
- 开发神技能 | Python Mock 的入门
Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...
- Python Mock 的入门
Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...
- Python mock 的使用
使用 mock 对象替换系统的一部分并且能获取它们的使用情况. 具体的说,你可以获取方法/属性的使用情况以及它们的调用参数.也可以指定返回值和设置属性. 思路是将对象设置为 mock 对象,然后根据需 ...
- python mock模块使用(二)
本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 官方文档地址 patch简介 1.unittest.mock.patc ...
- python mock模块使用(一)
什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...
- 一文熟练使用python mock
mock作为python测试模拟对象工具,在单元测试当中使用较多,官方文档详细不够精简,这篇文章介绍mock常用的用法,以下为引用全文,留给自己和有需要的人查阅. https://realpython ...
随机推荐
- jvm系列(二):JVM内存结构
JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...
- C#的Process类调用第三方插件实现PDF文件转SWF文件
在项目开发过程中,有时会需要用到调用第三方程序实现本系统的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用这个插件,并且该插件是如何将PDF文件转化为SWF文件的呢?接下来 ...
- SQL Server 统计信息更新时采样百分比对数据预估准确性的影响
为什么要写统计信息 最近看到园子里有人写统计信息,楼主也来凑热闹. 话说经常做数据库的,尤其是做开发的或者优化的,统计信息造成的性能问题应该说是司空见惯. 当然解决办法也并非一成不变,“一招鲜吃遍天” ...
- webParts与Web部件
web部件是ASP.NET WebForm里面的服务器控件,它涵盖的内容比较多,鉴于这种状况的话鄙人不打算深究下去了,只是局限于了解web.config配置里面的配置内容则可. 那么也得稍微说说啥是W ...
- php:ci学习笔记1
ci下载的开发包: phpstudy的部署: phpstudy的根目录是:D:\WWW 新建目录 cms 把ci开发包的application system index.php lic ...
- python学习笔记(列表、元组、购物车实例)
一.列表 列表和字典是最常用的两种数据类型 1. 需求:怎么存放班级80多人的姓名,如何实现? names = ["Zhangyang","Guyun",&qu ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 14.序列号的设计,不重复的实现一机一码
目 录 第十四章 序列号的设计... 2 14.1 设计原则... 2 14.2 设计思想... 3 14.3 代码实现... 4 14. ...
- Mac下安装ElasticSearch
简单记录一下安装ES的过程,给小小白们提供一下参考: 下载安装包 https://www.elastic.co/downloads/elasticsearch建议下载2.3.2版本,最新的5.0.0版 ...
- AJAX实现简单的注册页面异步请求
p { margin: 0px; padding: 0px } AJAX简介 (1)AJAX = 异步 JavaScript 和 XML. (2)AJAX 是一种用于创建快速动态网页的技术. (3)通 ...
- js实现无缝循环滚动
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...