1、什么是mock?
unittest.mock 是python单元测试的库,mock译文是模拟的意义,顾名思义它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。
学过python自动化的对unittest并不陌生,unittest其实是单元测试框架,
但对于单元测试,估计很多小伙伴都不懂,单元测试才是自动化测试的至高境界,其中mock是单元测试的脊髓所在。
mock能做什么:
1.前后端联调,如果你是一个前端页面开发,现在需要开发一个功能:
下一个订单,支付页面的接口,根据支付结果,支付成功,展示支付成功页,支付失败,展示支付失败页。
要完成此功能,你需要调用后端的接口,根据返回给你的结果,来展示不同的页面。此时后端接口还没开发好,
作为一个前端开发总不能等别人开发好了,你再开发,那你只有加班的命了。
为了同步开发完成任务,此时,你可以根据接口文档的规定,把接口的地址和入参传过去,然后自己mock接口的不同返回界面,来完成前端的开发任务
2.单元测试,单元测试的目的是测试某个小小单元的功能,但现实中开发的函数或方法都是有依赖关系的,比如b函数的参数,需要调用a函数的返回结果,但是我前面已经测试a函数了
这种情况下,就不需要再测一次a函数了,此时就可以用mock模块来模拟调用这部分内容,并给出返回结果
3.第三方接口依赖,在做接口自动化的时候,有时候需要调用第三方的接口,但是别人公司的接口服务不受你的控制,有可能别人提供的测试环境今天服务给你开着,别人就关掉了,
给自动化接口测试带来很多的麻烦,此时就可以自己写一个mock-server来模拟接口的返回数据
2、安装环境
pip install -U mock
3、练习
#tag.py
class P(object):
def payment():
'''假设这里是一个支付的功能,未开发完
支付成功返回:{"code": "000000", "msg":"支付成功"}
支付失败返回:{"code": "999999", "msg":系统错误"}
支付失败返回:{"code": "123456", "msg":余额不足"}
nsg返回失败原因
'''
pass
def payment_statue():
'''根据支付的结果code,判断跳转到对应页面'''
result = zhifu()
print(result)
try:
if result["code"] == "000000":
return result["msg"]
elif result["code"] == "123456":
return result["msg"]
elif result["code"] == "999999":
return result["msg"]
except:
return "Error, 服务端返回异常!"```
from unittest import mock
import unittest,tag
class Test_payment_statues(unittest.TestCase):
'''单元测试用例'''
@classmethod
def setUpClass(cls):
cls.p=tag.P()
def test_sucess(self):
'''测试支付成功场景'''
# mock一个支付成功的数据
tag.payment= mock.Mock(return_value={"code": "000000", "msg":"支付成功"})
# 根据支付结果测试页面跳转
statue = self.p.payment_statue()
self.assertEqual(statues, "支付成功")
def test_fail(self):
'''测试支付失败场景'''
# mock一个支付成功的数据
tag.payment= mock.Mock(return_value={"code": "123456", "msg": "余额不足"})
# 根据支付结果测试页面跳转
statue = self.p.payment_statue()
self.assertEqual(statues, "支付失败")
def test_system_error(self):
'''测试支付错误场景'''
# mock一个支付成功的数据
tag.payment= mock.Mock(return_value={"code": "999999", "msg": "系统错误"})
# 根据支付结果测试页面跳转
statue = self.p.payment_statue()
self.assertEqual(statues, "系统错误")
def test_system_error(self):
'''测试支付异常场景'''
# mock一个支付成功的数据
tag.payment= mock.Mock(return_value={"code": " ", "msg": ""})
# 根据支付结果测试页面跳转
statue = self.p.payment_statue()
self.assertEqual(statue, "Error, 服务端返回异常!")
if __name__ == "__main__":
unittest.main()