py3已将mock集成到unittest库中为的就是更好的进行单元测试简单理解,模拟接口返回参数通俗易懂,直接修改接口返回参数的值
mock作用
解决依赖问题,达到解耦作用
当我们测试某个目标接口时,该接口依赖其他接口,当被依赖的接口未开发完成时,可以用mock模拟被依赖接口,完成目标接口的测试
模拟复杂业务的接口
当我们测试某个目标接口,该接口依赖一个非常复杂的接口时,可以用mock来模拟这个复杂的业务接口;也解决接口依赖一样的原理
单元测试
如果某个接口未开发完成时,又需要编写测试用例,则可以通过mock模拟该接口进行测试
前后端联调
前端开发的页面需要根据后端返回的不同状态码展示不同的页面,当后端接口未开发完成时,也可通过mock来模拟后端接口返回自己想要的数据
mock类解读
secp:定义mock对象的属性值,可以是列表,字符串,甚至一个对象或者实例side_effect:可以用来抛出异常或者动态改变返回值,它必须是一个iterator,它会覆盖return_valuereturn_value:定义mock方法的返回值,它可以是一个值,可以是一个对象name:作为mock对象的一个标识,在print时可以看到
mock实际使用
一个未开发完成的功能如何测试?
1 def add(self, a, b):
2 """两个数相加"""
3 pass
4
5
6 class TestSub(unittest.TestCase):
7 """测试两个数相加用例"""
8
9 def test_sub(self):
10 # 创建一个mock对象 return_value代表mock一个数据
11 mock_add = mock.Mock(return_value=15)
12 # 将mock对象赋予给被测函数
13 add = mock_add
14 # 调用被测函数
15 result = add(5, 5)
16 # 断言实际结果和预期结果
17 self.assertEqual(result, 15)
一个完成开发的功能如何测试?
class SubClass(object):
def add(self, a, b):
"""两个数相加"""
return a + b
class TestSub(unittest.TestCase):
"""测试两个数相加用例"""
def test_add2(self):
# 初始化被测函数类实例
sub = SubClass()
# 创建一个mock对象 return_value代表mock一个数据
# 传递side_effect关键字参数, 会覆盖return_value参数值, 使用真实的add方法测试
sub.add = Mock(return_value=15, side_effect=sub.add)
# 调用被测函数
result = sub.add(5, 5)
# 断言实际结果和预期结果
self.assertEqual(result, 10)
side_effect:这里给的参数值是sub.add相当于add方法的地址,当我们调用add方法时就会调用真实的add方法
简单理解成:传递了side_effect参数且值为被测函数地址时,mock不会起作用;两者不可共存
side_effect接受的是一个可迭代序列,当传递多个值时,每次调用mock时会返回不同的值;如下
1 mock_obj = mock.Mock(side_effect= [1,2,3])
2 print(mock_obj())
3 print(mock_obj())
4 print(mock_obj())
5 print(mock_obj())
6
7 # 输出
8 Traceback (most recent call last):
9 1
10 File "D:/MyThreading/mymock.py", line 37, in <module>
11 2
12 print(mock_obj())
13 3
14 File "C:Python36libunittestmock.py", line 939, in __call__
15 return _mock_self._mock_call(*args, **kwargs)
16 File "C:Python36libunittestmock.py", line 998, in _mock_call
17 result = next(effect)
18 StopIteration
存在依赖关系的功能如何测试?
也许有小伙伴会问,第三方支付都不能用,我们的测试结果是否是有效的呢?
通常在测试一个模块的时候,是可以认为其他模块的功能是正常的,只针对目标模块进行测试是没有任何问题的,所以说测试结果也是正确的
mock装饰器
一共两种格式
文章为作者独立观点,不代表股票交易接口观点