【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/

浙公网安备 33010602011771号