python mock
python mock基本使用
测试依赖
三级目录
举例1
modular01.py
class Count():
def add(self, a, b):
pass
mock_demo01.py
from unittest import mock
import unittest
from mock_test.modular01 import Count
class TestCount(unittest.TestCase):
def test_add(self):
#调用被测试类Count()
count = Count()
#Mock类模拟被调用的add()方法,return_value定义返回值
count.add = mock.Mock(return_value = 13)
#【相当于】正常调用未完成的add()
result = count.add(8, 5)
#断言
self.assertEqual(result, 13)
if __name__ == '__main__':
unittest.main
举例2
side_effect参数和return_value是相反的。它给mock分配了可替换的结果,覆盖了return_value。简单的说,一个模拟工厂调用将返回side_effect值,而不是return_value。
所以,设置side_effect参数为Count类add()方法,那么return_value的作用失效。
class Count():
def add(self, a, b):
return a + b
from unittest import mock
import unittest
from mock_test.modular01 import Count
class TestCount(unittest.TestCase):
def test_add(self):
#调用被测试类Count()
count = Count()
#Mock类模拟被调用的add()方法,return_value定义返回值
count.add = mock.Mock(return_value = 13, side_effect = count.add)
result = count.add(8, 5)
print(result)
count.add.assert_called_with(8, 5)
#断言
self.assertEqual(result, 13)
if __name__ == '__main__':
unittest.main
测试依赖
function.py
def add_and_multiply(x, y):
addition = x + y
multiple = multiply(x, y)
return (addition, multiple)
def multiply(x, y):
return x * y
func_test.py
import unittest
import function
class MyTestCase(unittest.TestCase):
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)
if __name__ == '__main__':
unittest.main()
function.py multiply为x*y+3
def add_and_multiply(x, y):
addition = x + y
multiple = multiply(x, y)
return (addition, multiple)
def multiply(x, y):
return x * y + 3
import unittest
from unittest.mock import patch
import function
class MyTestCase(unittest.TestCase):
@patch("function.multiply")
def test_add_and_multiply2(self, mock_multiply):
x = 3
y = 5
mock_multiply.return_value = 15
addition, multiple = function.add_and_multiply(x, y)
mock_multiply.assert_called_once_with(3, 5)
self.assertEqual(8, addition)
self.assertEqual(15, multiple)
if __name__ == "__main__":
unittest.main()