开发神技能 | Python Mock 的入门

  • 时间:
  • 浏览:2

def visit_ustack():

from client import visit_ustack

self.assertEqual(client.visit_ustack(), '150')

class TestClient(unittest.TestCase):

from client import visit_ustack

就说 利用mock模块,越来越就还都要达到那我的效果:使用另一一3个mock对象替换掉里面的requests.get函数,就说 执行函数c时,c调用requests.get的返回值就利于由大伙 儿的mock对象来决定,而不都要服务器的参与。简单的说,就说 大伙 儿用另一一3个mock对象替换掉c函数和服务器交互的过程。你一定很好奇你许多功能是怎么才能 才能 实现的,你许多是mock模块內部的实现机制,越来越了本文的讨论范围。本文主要讨论怎么才能 才能 用mock模块来解决里面提到的你许多单元测试场景。

return send_request('http://www.ustack.com')

self.assertEqual(visit_ustack(), status_code)

fail_send = mock.Mock(return_value='404')

mock对象有许多依据还都要用来检查该对象是否被调用过、被调用时的参数怎么才能 才能 、被调用了十几个 等。实现什么功能还都要调用mock对象的依据,具体的还都要查看mock的文档。这里大伙 儿举个例子。

$ sudo pip install mock

client.send_request = fail_send

import requests

def test_call_send_request_with_right_arguments(self):

Mock对象

def c(url):

在了解了mock对象以前,大伙 儿来看另一一3个方便测试的函数:patch和patch.object。你许多另一一3个函数都在返回另一一3个mock內部的类实例,你许多类是class _patch。返回的你许多类实例既还都要作为函数的装饰器,也还都要作为类的装饰器,也还都要作为上下文管理器。使用patch就说 patch.object的目的是为了控制mock的范围,意思就说 在另一一3个函数范围内,就说 另一一3个类的范围内,就说 with话语的范围内mock掉另一一3个对象。大伙 儿看个代码例子即可:

with mock.patch('client.send_request', fail_send):

def test_fail_request(self):

https://segmentfault.com/a/1190000002.jpg"max-width: 1150%;min-height: 1em;color: rgb(62, 62, 62);font-size: 16px;white-space: normal;background-color: rgb(255, 255, 255);line-height: 25.6px;text-align: center;box-sizing: border-box !important;word-wrap: break-word !important;">

client.send_request = mock.Mock()

就说 替换掉另一一3个对象的指定名称的属性,用法和setattr例如。

status_code = '150'

Mock你许多词在英语包含模拟的你许多意思,就说 大伙 儿还都要猜测出你许多库的主要功能是模拟许多东西。准确的说,Mock是Python中另一一3个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。简单的说,mock库用于如下的场景:

class TestClient(unittest.TestCase):

return r.status_code

最后,学习mock技能你应该利于够感受到两种控制的快感,就你越来越了能享受控制內部服务的快乐。当你感受到你许多快感的以前,你的mock应该就达到熟练使用的水平了。

def test_success_request(self):

· http://www.voidspace.org.uk/python/mock/index.html

client.v2_client.get.return_value = '150'

mock对象的自动创建

from unittest import mock

mock还未加入标准库。

怎么才能 才能 学习使用mock?

client = mock.Mock()

patch.object和patch的效果是一样的,只不过用法很糙不同。举例来说,同样是里面你许多例子,加带patch.object话语是那我的:

就说 在代码中就还都要直接import进来:

Python 3.4

class Mock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, **kwargs)

你许多以前,你就得到了另一一3个mock过的client实例,调用该实例的v2_client.get()依据会得到的返回值是”150″。

class TestClient(unittest.TestCase):

稍微高级点的用法

from client import visit_ustack

Mock是什么

mock就说 加入了标准库。

· https://docs.python.org/3.4/library/unittest.mock-examples.html

从Python 3.3就让开始了了,mock模块就说 被合并到标准库中,被命为unittest.mock,还都要直接import进来使用:

当你知道了mock能做什么以前,要怎么才能 才能 学习并掌握mock呢?最好的依据就说 查看阅读官方文档,并在另一方的单元测试中使用。

import requests

越来越怎么才能 才能 在越来越测试服务器的情况报告下进行里面你许多情况报告的单元测试呢?Mock模块就说 答案。里面就说 说过了,mock模块还都要替换Python对象。大伙 儿假设a.b.c的代码如下:

Mock对象的call_args表示该mock对象被调用的tuple,tuple的每个成员都在另一一3个mock.call对象。mock.call你许多对象代表了一次对mock对象的调用,其内容是另一一3个tuple,包含另一一3个元素,第另一一3个元素是调用mock对象时的位置参数(args),第3个元素是调用mock对象时的关键字参数(*kwargs)。

內部模块调用visit_ustack()来访问UnitedStack的官网。下面大伙 儿使用mock对象在单元测试中分别测试访问正常和访问不正常的情况报告。

fail_send = mock.Mock(return_value=status_code)

Mock的安装和导入

success_send = mock.Mock(return_value=status_code)

里面你许多就说 使用mock对象的基本步骤了。在里面的例子中大伙 儿替换了另一方写的模块的对象,觉得也还都要替换标准库和第三方模块的对象,依据是一样的:先import进来,就说 替换掉指定的对象就还都要了。

def test_fail_request(self):

Mock对象的called属性表示该mock对象是否被调用过。

def send_request(url):

with mock.patch.object(client, 'send_request', fail_send):

patch和patch.object

从里面的例子中还还都要就看,指定mock对象的return_value还还都要使用属性赋值的依据。

import mock

· return_value: 你许多大伙 儿刚才使用过了,你许多字段还都要指定另一一3个值(就说 对象),当mock对象被调用时,就说 side_effect函数返回的是DEFAULT,则对mock对象的调用会返回return_value指定的值。

class Mock的参数

with mock.patch('client.send_request', success_send):

举个例子来说:大伙 儿有另一一3个简单的客户端实现,用来访问另一一3个URL,当访问正常时,都要返回情况报告码150,不正常时,都要返回情况报告码404。首先,大伙 儿的客户端代码实现如下:

· name: 你许多是用来命名另一一3个mock对象,就说 起到标识作用,当你print另一一3个mock对象的以前,还都要就看它的name。

import mock

success_send = mock.Mock(return_value='150')

假设你开发的项目叫a,里面包含了另一一3个模块b,模块b中的另一一3个函数c(也就说 a.b.c)在工作的以前都要调用发送请求给特定的服务器来得到另一一3个JSON返回值,就说 根据你许多返回值来做解决。就说 要为a.b.c函数写另一一3个单元测试,该怎么才能 才能 做?

对依据调用进行检查

你许多测试类和大伙 儿刚才写的第另一一3个测试类一样,包含另一一3个测试,只不过这次都在显示创建另一一3个mock对象就说 进行替换,就说 使用了patch函数(作为上下文管理器使用)。

self.assertEqual(visit_ustack(), status_code)

当访问另一一3个mock对象中不所处的属性时,mock会自动建立另一一3个子mock对象,就说 把正在访问的属性指向它,你许多功能对于实现多级属性的mock很方便。

import client

self.assertEqual(client.send_request.called, True)

基本用法

另一一3个简单的依据是搭建另一一3个测试的服务器,在单元测试的以前,让a.b.c函数和你许多测试服务器交互。就说 你许多做法有另一一3个疑问:

def test_success_request(self):

Mock对象是mock模块中最重要的概念。Mock对象就说 mock模块中的另一一3个类的实例,你许多类的实例还都要用来替换许多的Python对象,来达到模拟的效果。Mock类的定义如下:

client.send_request = success_send

status_code = '404'

resp = requests.get(url)

status_code = '404'

Python 2.7

import unittest

client.visit_ustack()

现在来分析下里面的用例,大伙 儿要检查的项目有另一一3个:

里面讲的是mock对象最基本的用法。下面来看看mock对象的稍微高级点的用法(并都在很高级啊,最完整篇 最高级的直接去看mock的文档即可,里面给出)。

def test_fail_request(self):

r = requests.get(url)

这里给出你许多定义就说 要说明下Mock对象觉得就说 个Python类而已,当然,它內部的实现是很巧妙的,有兴趣的还都要去看mock模块的代码。

Mock对象的一般用法是那我的:

来自:diabloneo

你肯定很奇怪,本文不就说 教人使用mock的么?觉得都在的,我发现另一方在学习mock的过程中遇到的主要困难是不清楚mock能做什么,而都在mock对象到底有什么函数。就说 写这篇文章的主要目的是为了说明mock能做什么。

· https://docs.python.org/3.4/library/unittest.mock.html

fail_send = mock.Mock(return_value=status_code)

call_args = client.send_request.call_args

self.assertIsInstance(call_args0, str)

还是使用里面的代码,这次大伙 儿要检查visit_ustack()函数调用send_request()函数时,传递的参数类型是否正确。大伙 儿还都要像下面那我使用mock对象。

self.assertEqual(visit_ustack(), status_code)

在Python 3.3以前的版本中,都要另外安装mock模块,还都要使用pip命令来安装:

· side_effect: 你许多参数指向另一一3个可调用对象,一般就说 函数。当mock对象被调用时,就说 该函数返回值都在DEFAULT时,越来越以该函数的返回值作为mock对象调用的返回值。

先来看看Mock你许多类的参数,在里面就看的类定义中,大伙 儿知道它有好十几个 参数,这里介绍最主要的十几个 :

许多的参数请参考官方文档。

self.assertEqual(client.visit_ustack(), '404')

官方文档