【mock的简单用法】

一、mock定义

unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,主要是模拟一些东西。

她的主要功能是使用mock对象替代指定的Python对象,以达到模拟对象的行为,并且对已使用的方式进行断言

在python2.X中mock是一个单独的模块,在3.X中,mock已经被集成到unittest单元测试框架中,故可直接使用

二、mock作用

1.在项目的单元测试过程中,会遇到:

1.接口的依赖

2.外部接口调用

3.测试环境非常复杂

三、mock使用场景

1.前后端联调,如果你是一个前端,现需要开发一个功能:

支付页面的接口,根据支付结果,支付成功与失败,展示成功与失败页。要完成此功能,你需要掉后端的接口,根据返回给你的结果来展示不同的页面。此时后端接口还未开发完,如果你等后端开发完了你再开发,那你只有加班。

为了同步完成开发任务,此时,你可以根据接口文档的规定,把接口地址和入参传过去,然后自已mock接口不同的返回界面,来完成前端的开发任务。

2.单元测试,单元测试的目的是测试某个小小单元的功能,但现实中开发的函数或方法都是哟依赖关系的,比如B函数的参数,需要调用A函数的返回结果,但是我前面已经测试A函数了,这种情况下,就不要再测试一次A函数了,此时就可以用mock模块来模拟调用这部分内容,并给出返回结果。

3.第三方接口依赖,在做接口自动化的时候,有时候需要调用第三方的接口,但是别人公司的接口服务不收你的控制,有可能别人提供的测试环境今天给你服务开着,第二天就关了,给自动接口测试带来很多麻烦,此时就可以自已写一个mock-server来模拟接口的返回数据。

四、环境准备

1.python2.x的版本,mock是一个独立的模块,需要pip安装

pip install -Umock

2.从python3.X以后的版本mock已经合并到unittest模块中,是unittest单元测试的一部分,直接导入就可以用

from unittest import mock

五、简单实例:

下面使用简单的加法和减法算法函数为例:

#function.py


#encoding:utf-8
#@Time:2019/7/7 12:19
#@Author:sunny
def add_add_multiply(x,y):
    addition=x+y
    multiple=multiply(x,y)
    return addition,multiple

def multiply(x,y):
    return x*y

#test.py

#encoding:utf-8
#@Time:2019/7/7 13:19
#@Author:sunny

import unittest
import function 
class MyTestCase(unittest.TestCase): def test_add_multiply(self): x=3 y=5 addition,multiple=function.add_and_multiply(x,y) self.assertEqual(8,addition) self.assertEqual(15,multiple) if __name__ =="__main__": unittest.main()

运行结果:

D:\Python34\python.exe F:/AAM_project/exercise_v1/automation_seat/automation/test/test.py
.
---------------------------------------------------------------------- Ran 1 test in 0.001s OK

综上看来,add_and_multiply()函数依赖了multiply()函数的返回值,想修改传统的加法,想在加法的运算中再加,此时,就直接修改multiply函数的代码就好了。

def multiply(x,y):

  return x*y+3

现在我们运行,会报错,因为我们只修改了multiply函数,add_and_multiply函数以及他的测试用例没有做相应的修改,我们应该把multiply函数mock掉


D:\Python34\python.exe F:/AAM_project/exercise_v1/automation_seat/automation/test/test.py

F
====================================================================== FAIL: test_add_and_multiply (__main__.MyTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "test.py", line 13, in test_add_and_multiply self.assertEqual(15, multiple) AssertionError: 15 != 18 ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (failures=1)

修改代码如下:

from unittest
from mock import Mock
from unittest.mock import patch
imort function


class MyTestCase(unittest.TestCase):
    

    #mock.patch('multiply')
    def test_add_and_multiply(self,mock_multiply)
        x=3
        y=5
        
        #mock multiply函数返回等于15
        mul=Mock(return_value=15)
        retsult=mul.reult(3,5)
        addition,multiply=function.add_and_multiply(x,y)
        #验证multiply()函数的参数是否正确
       mul.result.assert_called_once_with(3,5)
        self.assertEqual(8,addition)
        self.assertEqual(15,multiple)
    
if __name__="_main__":
        unittest.main()             

运行结果:

D:\Python34\python.exe F:/AAM_project/exercise_v1/automation_seat/automation/test/test.py
. ---------------------------------------------------------------------- Ran 1 test in 0.001s OK

 

参考文献:

http://engineroom.trackmaven.com/blog/making-a-mockery-of-python/

 

posted @ 2019-07-07 20:20  做一只热爱生活的小透明  阅读(1550)  评论(0)    收藏  举报