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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章