Mock和MagicMock

Mock和MagicMock

转载:https://blog.csdn.net/lk142500/article/details/85881426

在单元测试进行的同时,就离不开mock模块的存在,初次接触这个概念的时候会有这样的疑问:把要测的东西都模拟掉了还测试什么呢?
  但在,实际生产中的项目是非常复杂的,对其进行单元测试的时候,会遇到以下问题:
•接口的依赖
•外部接口调用
•测试环境非常复杂

单元测试应该只针对当前单元进行测试, 所有的内部或外部的依赖应该是稳定的, 已经在别处进行测试过的.使用mock 就可以对外部依赖组件实现进行模拟并且替换掉, 从而使得单元测试将焦点只放在当前的单元功能。

在这里插入图片描述

因为在为代码进行单元测试的同时,会发现该模块依赖于其他的模块,例如数据库,网络,或者第三方模块的存在,而我们对一个模块进行单元测试的目的,是测试当前模块正常工作,这样就要避开对其他模块的依赖,而mock主要作用便在于,专注于待测试的代码。而在但与测试中,如何灵活的使用mock模块是核心所在。下面便以mock为核心,结合最近所写的代码,阐述mock模块的使用。

函数的如何mock

在rbd_api.py文件中如下内容:

import DAO_PoolMgr

def checkpoolstat(pool_name)
  ret, poolstat = DAO_PoolMgr.DAO_query_ispoolok(pool_name)
if ret != MGR_COMMON.MONGO_SUCCESS:
    return ret
if poolstat is False:
    return MGR_COMMON.POOL_STAT_ERROR
return MGR_COMMON.SUCCESS

要为这个函数撰写单元测试,因为其有数据库的操作,因而就需要mock 出DAO_query_ispoolok操作。
因此,我们在test_rbd_api.py文件中可以这么写:因为DAO_query_ispoolok是类DAO_PoolMgr的操作,因此可以这么写

#!/usr/bin/python
import DAO_PoolMgr
import unittest
import rbd_api as rbdAPI

class TestAuxiliaryFunction(unittest.TestCase):
	def setUp(self):
		self.pool_name = "aaa"
	
	def tearDown(self):
		self.pool_name = None
	@mock.patch.object(DAO_PoolMgr, "DAO_query_ispoolok")
	def test_checkpoolstat(self, mock_DAO_query_ispoolok):
		mock_DAO_query_ispoolok.return_value = (MGR_COMMON.POOL_STAT_ERROR, None)
		self.assert(rbdAPI.checkpoolstat(self.pool_name), MGR_COMMON.POOL_STAT_ERROR)

		mock_DAO_query_ispoolok.return_value = (MGR_COMMON.SUCCESS, False)
		self.assert(rbdAPI.checkpoolstat(self.pool_name), MGR_COMMON.POOL_STAT_ERROR)
		
		mock_DAO_query_ispoolok.return_value = (MGR_COMMON.SUCCESS, True)
		self.assert(rbdAPI.checkpoolstat(self.pool_name), MGR_COMMON.SUCCESS)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章