python接口测试之mock(十)

在之前的博客中介绍了moco的详细的使用,它主要是基于moco-runner-0.11.0-standalone.jar,通过编写json的文件来实现,那么我们现在来看python之中的mock,那么怎么理解mock了,mock翻译过来就是模拟的意思,也就是说,它是将测试对象所依存的对象替换为虚构对象的库,该虚构对象的调用允许事后查看。在python的2.x版本中,它是属于第三方的库,需要单独的按钮,在python3.3的版本以后,不需要单独的安装,直接导入就可以了,那么我们先看它的安装命令,安装命令为:

pip install mock

见安装的截图:

安装好后,在cmd的命令行中进入到python的环境中,可以直接的导入,见操作的截图:

在python3.3以上的版本中,因为是标准库,就不需要单独的按钮,直接导入就可以了,见操作的截图:

Ok,安装成功后,下来我们来看mock库的经常使用的方法以及它的详细的帮助信息,见获取的代码:

#!/usr/bin/env python 
#-*- coding:utf-8 -*-

import  mock
print u'查看modk库常用的方法:',dir(mock)
print u'查看mock库详细的帮助信息:',type(help(mock)) 

mock详细的学习文档可以参考官方的文档,官方地址: http://www.voidspace.org.uk/python/mock/mock.html

下面我们首先来看一个例子,来引入mock,来查看它解决什么问题,以及我们为什么需要mock,知道了这些以后,我们再详细的探讨mock它详细的使用。我们编写如下的一个方法,它要实现的是删除一个C盘下的文件夹,而该文件夹就是Windows文件夹,见该代码:

#!/usr/bin/env python 
#-*- coding:utf-8 -*-

import  mock
import  os
  
class Remove(object):    
    def rmdir(self,path='c:/Windows'):
        os.rmdir(path)

如果我们要测试rmdir()的方法,那么执行的就是我们每测试一次,就得删除一次文件夹,这样我们的测试结果是通过的,另外有这么几个点需要考虑,第一就是该文件夹是否可删除,如果删除,引起系统出问题如何处理?第二是删除该文件夹的时候,是否已经创建了,难道我们每次删除一次,就得判断是否存在,是否创建,再做删除的操作?很显然这样的一个测试过程,最难的不是第二个问题,而是第一个文件,C盘下的Windows文件夹可以正常的删除吗?可以做删除的操作吗?答案是不可以的,因为我们的系统盘就是C盘下,而Windows文件夹里面储存了很多的系统文件,绝对不允许删除,那么我们如何测试了,这个时候,就需要mock,也就是模拟,我们再写一个方法,模拟rmdir()方法的执行,见更新后的代码:

#!/usr/bin/env python 
#-*- coding:utf-8 -*-

import  mock
import  os
  
class Remove(object):    
    def rmdir(self,path='c:/Windows'):
        r=os.rmdir(path)        
        if r==None :            
            return u'删除成功'
        else:            
            return u'Sorry,删除失败'

    def exists_get_rmdir(self):        
        return self.rmdir()

见测试的代码:

#!/usr/bin/env python 
#-*- coding:utf-8 -*-

import  mock
import  os
import  unittest
  
class Remove(object):    
    def rmdir(self,path='c:/log'):
        r=os.rmdir(path)        
        if r==None :            
            return 'success'
        else:            
            return 'fail'

    def exists_get_rmdir(self):        
        return self.rmdir()
 
class MockTest(unittest.TestCase):    
    def setUp(self):
        self.r=Remove()   
 
    def tearDown(self):        
        pass

    def test_success_rmdir(self):        
        '''
        删除目录成功
        :return:
        '''
        success_path=mock.Mock(return_value='success')
        self.r.rmdir=success_path
        self.assertEqual(self.r.exists_get_rmdir()
,'success')    


    def test_fail_rmdir(self):        
        '''
        删除目录失败
        :return:        
        '''
        fail_path=mock.Mock(return_value='fail')
        self.r.rmdir=fail_path
        self.assertEqual(self.r.exists_get_rmdir(),
'fail')

if __name__=='__main__':
    unittest.main(verbosity=2)

执行如上的代码的时候,我们就不需要考虑是否存在该文件夹,以及该文件夹是否可正常的删除,我们完全使用mock来解决了这个问题,那么我们来看它的执行顺序:

1、找到替换的对象,我们需要测试的是exists_get_imdir()方法,那么我们就需要替换掉rmdir()方法

2、对Mock类进行实例化对象得到mock,并且设置这个mock的行为return_value值,也就是mock虚构对象,在测试通过中,我们虚构return_value为'success',在测试不通过我们虚构return_value为'fail'

3、使用mock对象我们想替换的方法rmdir(),这样我们就替换到了self.r.rmdir

4、编写测试代码,进行断言,我们调用self.r.exists_get_imdir()方法,并且期望它的返回值与我们预期的结果一致(不管是成功的还是失败的)

使用mock虚构对象,比如我们案例使用的Mock(return_value='success'),它是一个什么样的形式了,如果我们使用函数怎么样编写,下来我们详细的来实现这个过程:

见如下模拟类当中的方法,见实现的案例代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import  mock

mock=mock.Mock()
mock.info.return_value='Hello Mock'
print mock.info()
 
class F:    
    def info(self):        
        return 'Hello Mock'
f=F()
print f.info()

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2017-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

在vim中快速复制粘贴多行

用vim写代码时,经常遇到这样的场景,复制多行,然后粘贴。 我现在这样做: 1. 将光标移动到要复制的文本开始的地方,按V(是大写V)进入可视模式。 2. 将光...

693100

如何用split命令来拆分文件

split是一个类似于grep或tail的Unix命令行实用程序。它允许您将较大的文件分成几个较小的文件。

15040
来自专栏深度学习之tensorflow实战篇

pycharm 之模块与模块引用

首先在pycharm,创建文件的快捷键ALT+INS,可以将自己常用的模版导入 ? 其次函数的模块调用规则如下图 ? 模块引用并指导源文...

39990
来自专栏赵俊的Java专栏

Python 文件操作

30830
来自专栏不想当开发的产品不是好测试

查看jar包的jdk版本并降级

用解压工具打开jar包(例子都是用7zip) ? 进入到META-INF目录,查看MANIFEST.MF文件,查看Bulid-Jdk,下图就为1.7.0_55版...

30470
来自专栏Java成神之路

Java微信开发_03_使用测试号进行开发

今天进行自定义菜单的开发时,发现公众号没有自定义菜单的权限。于是想到用测试号,但微信服务器如何区分你要请求的是公众号还是测试号呢。

8930
来自专栏ytkah

dedecms建的网站如何去掉/index.html

DEDECMS建立的网站,www.abc.com/index.html和www.abc.com两个都可以访问,而且两个页面都是一样的,这样就会造成重复页面,对搜...

37160
来自专栏Java后端技术

解决jetty7.0.pre5启动时报ClassNotFoundException: javax.interceptor.InvocationContext异常的问题

一.背景介绍:最近项目在使用maven命令行运行jetty服务器时出现ClassNotFoundException: javax.interceptor.Inv...

8010
来自专栏河湾欢儿的专栏

常用的dos命令

10820
来自专栏我的博客

CI页面乱码

今天项目页面乱码 我确认了数据库读取时utf8,页面也添加 <meta http-equiv=”content-type” content=”text/html...

31460

扫码关注云+社区

领取腾讯云代金券