在單元測試中,需要測試一個單獨模塊的功能運行情況,這使得我們不希望它被其它模塊的功能所影響
舉例來說,想測試一個get請求返回的數據是否正確,但是在處理get請求的方法中,數據來源於其他模塊函數。在測試中,我們希望測試get請求時,只測試處理該請求的方法,而不關心獲取數據的方法,這時就需要用mock來模擬獲得數據的方法
這裏只介紹最簡單的一種模擬,即模擬一個方法
要測試的函數
具體情況不同,寫的代碼不是完整代碼
def get():
...
data = model.User.getUserName()
...
return ...
單元測試
導入unittest
模塊
import unittest
from unittest import TestCase
from unittest.mock import patch
from app import app
class UnitTest(TestCase):
def setUp(self) -> None:
# 這個app是你的flask應用,也要導入
app.testing = True
# 啓動測試用的客戶端發送請求
self.client = app.test_client()
# 用裝飾器添加要模擬的方法名
@patch('model.User.getUserName')
# 在參數中添加模擬前面方法的Mock對象,(實際是MagicMock對象,Mock的子類)
def test_UserLogin200(self, mock_getpwd):
# 設置該模擬方法的返回值
mock_getpwd.return_value = 'admin'
# 用客戶端發送用要測試模塊處理的請求
rv = self.client.get('/username')
# 測試返回數據是否正確
assert b'admin' in rv.data
在這個測試中,用 Mock 模擬了 model.User.getUserName
方法,在測試get方法時,不再依賴於 model.User.getUserName
的結果