Mock概念
mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。
一般有两种场景:
-
前端对后端接口的 mock,
-
后端服务之间的测试中涉及的mock,常常发生在单元测试的时候。
前端mock可以通过一些工具来完成:
-
使用抓包工具Fiddler,Charles 来实现,通过修改代理返回的数据,实现多种场景的测试。
-
使用一些API管理工具来模拟,比如yapi,Easy Mock 等
-
当然有编码能力的,也可以使用node.js,python的fastAPI来模拟
后端的 Mock 则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到 Mock。
对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用 Mock 来模拟。
在 python3.X 中 Mock 模块已经被集成到unittest里面。
Mock类
class Mock(spec=None,side_effect=None,return_value=DEFAULT,name=None)
-
spec:定义Mock对象的属性值,可以是一个列表,字符串,一个对象的实例
-
side_effect:可以用来抛出异常或者动态改变返回值,可以覆盖return_value
-
return_value:定义mock的返回值
-
name:作为mock对象的标识可以在print时候看到
简单的例子体验下 Mock 的功能特点
1
2
3
4
5
6
7
|
from
unittest
import
mock
def
add(num1,num2):
return
num1
+
num2
# pass
add
=
mock.Mock(return_value
=
200
)
# 创建mock对象
print
( add(
10
,
20
) )
|
你会发现无论输入的参数是什么,输出结果都是200。等于方法被 Mock 拦截处理了。
一个相对正式的 Mock 例子
正常情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
requests
def
request_scm():
# res = requests.get('http://www.mysx-scm.com')
res
=
requests.get(
'http://baidu.com'
)
return
res.status_code
import
unittest
from
unittest
import
mock
class
TestScmApi(unittest.TestCase):
def
testUrl(
self
):
# request_scm = mock.Mock(return_value=200)
self
.assertEqual(request_scm(),
200
, msg
=
'testUrl 出现错误'
)
if
__name__
=
=
'__main__'
:
unittest.main()
|
可以分别把两个 # 注释移到下一句试试。
一个完整的测试例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import
requests
class
scmapi():
def
request_scm():
res
=
requests.get(
'http://www.mysx-scm.com'
)
# res = requests.get('http://baidu.com')
return
res.status_code
def
pay_alipay():
'''
待实现
return 200
'''
return
0
import
unittest
from
unittest
import
mock
class
TestScmApi(unittest.TestCase):
needmock
=
True
def
setUpClass():
print
(
"setUpClass():所有方法之前执行"
)
def
tearDownClass():
print
(
"tearDownClass():所有方法之后执行"
)
def
setUp(
self
):
self
.scmapi
=
scmapi()
print
(
"setUp():每个方法之前执行"
)
def
tearDown(
self
):
print
(
"teardown():每个方法之后执行"
)
def
test_request_scm(
self
):
if
self
.needmock:
scmapi.request_scm
=
mock.Mock(return_value
=
200
)
self
.assertEqual(scmapi.request_scm(),
200
, msg
=
'test_request_scm 出现错误'
)
def
test_pay_alipay(
self
):
if
self
.needmock:
scmapi.pay_alipay
=
mock.Mock(return_value
=
200
)
self
.assertEqual(scmapi.pay_alipay(),
200
, msg
=
'test_pay_alipay 出现错误'
)
if
__name__
=
=
'__main__'
:
unittest.main()
|
断言方法
基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
序号
|
断言方法
|
断言描述
|
1
|
assertEqual(arg1, arg2, msg=None)
|
验证arg1=arg2,不等则fail
|
2
|
assertNotEqual(arg1, arg2, msg=None)
|
验证arg1 != arg2, 相等则fail
|
3
|
assertTrue(expr, msg=None)
|
验证expr是true,如果为false,则fail
|
4
|
assertFalse(expr,msg=None)
|
验证expr是false,如果为true,则fail
|
5
|
assertIs(arg1, arg2, msg=None)
|
验证arg1、arg2是同一个对象,不是则fail
|
6
|
assertIsNot(arg1, arg2, msg=None)
|
验证arg1、arg2不是同一个对象,是则fail
|
7
|
assertIsNone(expr, msg=None)
|
验证expr是None,不是则fail
|
8
|
assertIsNotNone(expr, msg=None)
|
验证expr不是None,是则fail
|
9
|
assertIn(arg1, arg2, msg=None)
|
验证arg1是arg2的子串,不是则fail
|
10
|
assertNotIn(arg1, arg2, msg=None)
|
验证arg1不是arg2的子串,是则fail
|
11
|
assertIsInstance(obj, cls, msg=None)
|
验证obj是cls的实例,不是则fail
|
12
|
assertNotIsInstance(obj, cls, msg=None)
|
验证obj不是cls的实例,是则fail
|
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
希望能帮助到你!
【100%无套路免费领取】