一、Mock是什么?
二、为什么要使用的mock?
三、Mock可以解决哪些场景问题?
- 接口的依赖
- 外部接口调用
- 测试环境非常复杂
具体来说就是:
四、mock的使用
五、mock的代码实现
1、mock的基本使用
# -*- coding: utf-8 -*-
# @Time: 2022/1/20 5:50 下午
# @Author: wcystart
# @File: modular.py
# @description:
"""
这里要实现一个Count计算类,add() 方法要实现两数相加。
但,这个功能我还没有完成。这时就可以借助mock对其进行测试。
"""
class Count():
def add(self):
pass
# -*- coding: utf-8 -*-
# @Time: 2022/1/20 5:51 下午
# @Author: wcystart
# @File: mock_demo01.py
# @description:
from unittest.mock import Mock
import unittest
from modular import Count
class TestCount(unittest.TestCase):
def test_add(self):
# 首先,调用被测试类Count()
count = Count()
# 通过Mock类模拟被调用的方法add()方法,return_value 定义add()方法的返回值。
count.add = Mock(return_value=13)
# 正常的调用add()方法,传两个参数8和5,然后会得到相加的结果13。然后,13的结果是我们在上一步就预先设定好的。
result = count.add(8, 5)
self.assertEqual(result, 13)
if __name__ == '__main__':
unittest.main()
2、mock解决依赖
# -*- coding: utf-8 -*-
# @Time: 2022/1/21 11:13 上午
# @Author: wcystart
# @File: function.py
# @description: 定义一个函数,用来计算两个数的和、乘积
def add_and_multiply(x, y):
addition = x + y
mul = multiply(x, y)
return addition, mul
def multiply(x, y):
return x * y
然后针对:add_and_multiply()函数编写测试用例
import unittest
import function
class MyTestCase(unittest.TestCase):
def test_add_and_multiple(self):
x = 3
y = 5
addition, mul = function.add_and_multiply(x, y)
self.assertEqual(8, addition)
self.assertEqual(15, mul)
if __name__ == '__main__':
unittest.main()
运行结果:
Ran 1 test in 0.004s
OK
add_and_multiply()函数依赖了multiply()函数的返回值。如果这个时候修改multiply()函数的代码。
def multiply(x, y):
return x * y + 6
再次运行,就会断言失败:
21 != 15
Expected :15
Actual :21
<Click to see difference>
Traceback (most recent call last):
File "/Users/wangchuangyan/Desktop/py42/mock/func_test.py", line 16, in test_add_and_multiple
self.assertEqual(15, mul)
AssertionError: 15 != 21
测试用例运行失败了,然而,add_and_multiply()函数以及它的测试用例并没有做任何修改,罪魁祸首是multiply()函数引起的,那么此时我们应该把 multiply()函数mock掉。
import unittest
import function
from unittest.mock import patch
class MyTestCase(unittest.TestCase):
# 针对add_and_multiply做测试用例
# def test_add_and_multiply(self):
# x = 3
# y = 5
# addition, multiple = function.add_and_multiply(x, y)
# self.assertEqual(8, addition)
# self.assertEqual(15, multiple)
"""
patch()装饰/上下文管理器可以很容易地模拟类或对象在模块测试。
在测试过程中,您指定的对象将被替换为一个模拟(或其他对象),
并在测试结束时还原。
"""
# 模拟function.py文件中multiply()函数
# 将mock的multiply()函数(对象)重命名为 mock_multiply对象
@patch("function.multiply")
def test_add_and_multiple2(self, mock_multiply):
x = 3
y = 5
# 设定mock_multiply对象的返回值为固定的15
mock_multiply.return_value = 15
addition, multiple = function.add_and_multiply(x, y)
# 检查mock_multiply方法的参数是否正确
mock_multiply.assert_called_once_with(3, 5)
self.assertEqual(8, addition)
self.assertEqual(15, multiple)
if __name__ == '__main__':
unittest.main()
再次运行:运行通过
Ran 1 test in 0.004s
OK
Process finished with exit code 0
六、patch装饰器简介