首页 > 编程语言 >python mock使用

python mock使用

时间:2023-06-01 12:36:00浏览次数:53  
标签:... python value echo call 使用 foo mock

Overview

mock 是一个用于单元测试的 Python 库,它使用 mock 模拟系统中如 class, method 等部分,并且断言它们是如何被调用的。在编写单元测试时,mock 非常适合模拟数据库,web 服务器等依赖外部的场景。本文是 mock 的入门篇,主要介绍 mock 的基本用法。

除了 mock 外,还有许多其它的 mocking 库,Python Mock Library Comparison 在用法上对这些库做了简单的比较,其中 OpenStack 单元测试广泛的使用了 mock 和 mox。

mock 的安装非常简便:

$ pip install mock

Mock Patching Methods

当使用 mock 模拟 methods 时,mock 会替换被模拟的 methods,并且记录调用详情。

>>> class Foo(object):
...     def echo(self, *args):
...         return "hello"
...
>>>
>>> foo = Foo()
>>> foo.echo = mock.MagicMock()
>>> foo.echo.return_value = "mock value"
>>>
>>> foo.echo()
'mock value'
>>> foo.echo(1, 2)
'mock value'

被模拟后,foo.echo 的类型是一个名为 mock.MagicMock 类,具有 assert_any_call, assert_called_once_with 等方法,其中 assert 类型的方法通常用于检验 foo.echo 是否被正确调用。

>>> type(foo.echo)
<class 'mock.MagicMock'>

>>> dir(foo.echo)
['assert_any_call', 'assert_called_once_with', 'assert_called_with',
'assert_has_calls', 'attach_mock', 'call_args', 'call_args_list',
'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec',
'mock_calls', 'reset_mock', 'return_value', 'side_effect']

断言 foo.echo 被调用的情况,其中 foo.echo 共被调用两次(见上)。

>>> foo.echo.called
True
>>> foo.echo.call_count
2
>>> foo.echo.mock_calls
[call(), call(1, 2)]
>>>
>>> foo.echo.assert_called_with(1, 2)
>>> foo.echo.assert_called_with(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/mock.py", line 844, in assert_called_with
    raise AssertionError(msg)
AssertionError: Expected call: mock(1)
Actual call: mock(1, 2)

mock.Mock 和 mock.MagicMock 是两个常用的类,stackoverflow 有篇帖子 mock-vs-magicmock 专门讲述二者的区别:

  • MagicMock 是 Mock 的之类
  • MagicMock 额外实现了很多 magic 的方法

Mocking Classes

采用 mock 可方便的模拟 class,例如:

>>> def some_function():
...     foo = Foo()
...     return foo.echo()
...
>>> with mock.patch('__main__.Foo') as foo_mock:
...     instance = foo_mock.return_value
...     instance.echo.return_value = "mock result"
...     result = some_function()
...     assert result == "mock result"
...
>>> print some_function()
hello

值得注意的是,mock.patch 把模拟的效果限制在 with 作用域的范围内,所以 with 作用域之外的 some_function 的返回值依旧为 hello。


Setting Return Values and Attributes

mock 同样可方便的模拟返回值和 attributes,例如模拟一个对象的返回值,

>>> value_mock = mock.Mock()
>>> value_mock.return_value = 3
>>> value_mock()
3

模拟一个方法的返回值:

>>> method_value_mock = mock.Mock()
>>> method_value_mock.method.return_value = 3
>>> method_value_mock.method()
3

模拟对象的 attribute:

>>> attr_mock = mock.Mock()
>>> attr_mock.x = 3
>>> attr_mock.x
3

参数 side_effect

side_effect 是一个非常有用的参数,大大提高了 mock 返回值的灵活性,它可以是一个异常、函数或者可迭代对象。例如返回一个异常:

>>> except_mock = mock.Mock(side_effect=Exception('Boom!'))
>>> except_mock()
Traceback (most recent call last):
  ...
Exception: Boom!

当 side_effect 为迭代对象时,样例如下:

>>> iter_mock = mock.Mock(side_effect=[1, 2, 3])
>>> iter_mock()
1
>>> iter_mock()
2
>>> iter_mock()
3
>>> iter_mock()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/mock/mock.py", line 1062, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/mock/mock.py", line 1121, in _mock_call
    result = next(effect)
  File "/Library/Python/2.7/site-packages/mock/mock.py", line 127, in next
    return _next(obj)
StopIteration

单 side_effect 为函数时,样例如下:

>>> def side_effect(value):
...     return value
...
>>>
>>> side_effect_mock = mock.Mock(side_effect=side_effect)
>>> side_effect_mock(1)
1
>>> side_effect_mock("hello world!")
'hello world!'

标签:...,python,value,echo,call,使用,foo,mock
From: https://blog.51cto.com/u_11908275/6393201

相关文章

  • pytest-mock mock的高层封装
    pytest-mockpytest-mock是一个pytest的插件,安装即可使用。它提供了一个名为mocker的fixture,仅在当前测试function或method生效,而不用自行包装。objectmock一个object,是最常见的需求。由于function也是一个object,以下以function举例。importosdefrm(filename):os.remove......
  • 在linux服务器上使用命令行下载百度网盘中的文件
    转载自https://blog.csdn.net/qq_37428140/article/details/124219739 1、安装bypy工具pipinstallbypy2、认证自己的网盘账号bypyinfo按照提示,在控制台和浏览器中完成认证3、授权成功后,我们可以在网盘中的“我的应用数据”目录下看到如下文件夹: 将需要下载的......
  • 自动化测试系统​的意义、优势以及使用过程中的注意事项
    在当今的软件开发领域中,自动化测试已经成为了一种常见的实践方法。而自动化测试系统也是较为重要的开发工具之一。这篇文章将探讨自动化测试系统的意义、优势以及使用过程中的注意事项。自动化测试系统是指一种利用计算机程序对软件进行自动化测试的集成系统。它的主要作用在于设计......
  • python 合并k个有序链表
     fromheapqimportheappush,heappopclassSolution:defmergeKLists(self,lists):q=[]fori,headinenumerate(lists):ifhead:heappush(q,(head.val,i,head))node=dummy=ListNode(0)......
  • sparkSQL原理和使用——一般在生产中,基本都是使用hive做数据仓库存储数据,然后用spark
    一、sparkSQL概述1.1什么是sparkSQLSparkSQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。类似于hive的作用。1.2sparkSQL的特点1、容易集成:安装Spark的时候,已经集成好了。不需要单独安装。2、统一的数据访问方......
  • python代码规范 自动优化工具Black
    自动优化工具Black在众多代码格式化工具中,Black算是比较新的一个,它***的特点是可配置项比较少,个人认为这对于新手来说是件好事,因为我们不必过多考虑如何设置Black,让Black自己做决定就好。1).安装与使用与pylint类似,直接pipinstallblack即可完成该模块的安装,不过black依赖于Pyth......
  • ES shrink ——一般是结合rollover一起使用的,一开始没有看懂官方shrink文档,当看了这个
    rolloverElasticsearch从5.0开始,为日志场景的用户提供了一个很不错的接口,叫rollover。其作用是:当某个别名指向的实际索引过大的时候,自动将别名指向下一个实际索引。因为这个接口是操作的别名,所以我们依然需要首先自己创建一个开始滚动的起始索引:1.#curl-XPUT'http://localh......
  • ES 内存使用和GC指标——主节点每30秒会去检查其他节点的状态,如果任何节点的垃圾回收
    内存使用和GC指标在运行Elasticsearch时,内存是您要密切监控的关键资源之一。Elasticsearch和Lucene以两种方式利用节点上的所有可用RAM:JVMheap和文件系统缓存。Elasticsearch运行在Java虚拟机(JVM)中,这意味着JVM垃圾回收的持续时间和频率将成为其他重要的监控领域。JVMheap:AGo......
  • python--PythonMagick安装过程
    一、发现问题使用:pipinstallpythonmagick安装出错:1.打开网站下载自己python版本对应的pythonmagick版本其中的cp310,cp39之类就是对应Python的版本,不知道的也可以使用pipdebug--verbose查看2.打开CMD窗口,进入到pythonmagick的安装目录3.使用import命令将jpg、png图......
  • python之struct模块处理二进制
    嵌入式开发中,有时需要对二进制流文件进行读写操作,一种方法是将二进制流文件转换为c语言数组形式。这样可以使用python的struct模块,python的struct模块可以方便的进行字节与二进制之间的相互转换。1struct模块常用的几个函数函数说明struct.pack(format,v1,v2,...)......