在Python3.x中,mock已经被集成到了unittest单元测试框架中,所以,可以直接使用。
可能你和我初次接触这个概念的时候会有这样的疑问:把要测的东西都模拟掉了还测试什么呢?
但在,实际生产中的项目是非常复杂的,对其进行单元测试的时候,会遇到以下问题:
- 接口的依赖
- 外部接口调用
- 测试环境非常复杂
单元测试应该只针对当前单元进行测试, 所有的内部或外部的依赖应该是稳定的, 已经在别处进行测试过的.使用mock 就可以对外部依赖组件实现进行模拟并且替换掉, 从而使得单元测试将焦点只放在当前的单元功能。
简单示例一:
from unittest.mock import Mock import unittest class Count(): def add(self,a,b): return a+b class test_add(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def test_add(self): count=Count() count.add=Mock(return_value=13) result=count.add(4,4) self.assertEqual(result,13) if __name__=='__main__': unittest.main()
count = Count()
首先,调用被测试类Count() 。
count.add = mock.Mock(return_value=13)
通过Mock类模拟被调用的方法add()方法,return_value 定义add()方法的返回值。
result = count.add(4,4)
接下来,相当于在正常的调用add()方法,传两个参数4和4,然后会得到相加的结果8。
然后,13的结果是我们在上一步就预先设定好的。
self.assertEqual(result,13)
最后,通过assertEqual()方法断言,返回的结果是否是预期的结果13。
简单示例二:
from unittest.mock import Mock from unittest.mock import patch import unittest class Count(): def add(self,a,b): return a+b class test_add(unittest.TestCase): def setUp(self): pass def tearDown(self): pass @patch.object(Count,'add') def test_add(self,mock_add): count=Count() mock_add.return_value=13 result=count.add(4,4) self.assertEqual(result,13) if __name__=='__main__': unittest.main()
参考:https://www.cnblogs.com/ajianbeyourself/p/8795441.html