python mock接口返回数据(转载)

摘要:
在Python mock的测试过程中,为了更好地扩展单元测试,不可避免地要模拟一些数据和对象。让我们来谈谈Python mock的简单用法。互联网上有很多关于python锁的资料。我不会在这里深入讨论它,但它必须是实用的。阅读后,您至少可以知道如何使用mock/usr/bin/envpython#-*-coding:utf-8-*-importjsonimportrequestsdefsend_request:r=requests.getreturnjson。loadsdefvist_ustack():returnsend_requestif__name__=='__main__':content=visit_ustack()printcontent我们调用visit_ustack()条目可以获得http://api.kanzhihu.com/getposts此接口返回的json数据。
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接口返回数据(转载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jenkins安装WebStorm设置编辑器中的字体大小下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python程序的执行过程

1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊! 为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题...

Django基础(1)

昨日内容回顾: 1. socket创建服务器 2. http协议: 请求协议 请求首行 请求方式 url?a=1&b=2协议 请求头 key:value 请求体 a=1&b=2(只有post请求才有请求体) 响应协议...

17.异常(三)之 e.printStackTrace()介绍

一、关于printStackTrace()方法 public void printStackTrace()方法将此throwable对象的堆栈追踪输出至标准错误输出流,作为System.err的值。输出的第一行是此对象的toString()方法的结果,剩余行表示以前由方法 fillinStackTrace() 记录的数据。此信息的格式取决于实现,但以下示例...

python学习列表、字典、元祖、字符串

一、列表 Python内置的一种数据类型是列表:list,它是一种有序的集合,可添加和删除其中的元素。 列表的创建:将用逗号分隔的不同数据项用方括号括起来即可 获取list元素的个数:len() 1 name = ['小白','小黑','小花','小灰'] #创建列表 2 print(name) 3 print(len(name)) 1、列表方法及其基本...

python os.path模块常用方法详解:转:http://wangwei007.blog.51cto.com/68019/1104940

1.os.path.abspath(path)  返回path规范化的绝对路径。    >>> os.path.abspath('test.csv')  'C:\Python25\test.csv'    >>> os.path.abspath('c:\test.csv')  'c:\test.csv'    &g...

python输入年月日,得出已经过了多少天?

#-*- coding: UTF-8 -*- importtime defWhat_day_of_the_year(inputTime): #函数,判断字符串是否为数字 defis_number(s): try: float(s) returnTrue exceptV...