mock是輔助單元測試的一個模塊。它允許您用模擬對象替換您的系統的部分,並對它們已使用的方式進行斷言。
mock在python3中已經被集成到了unittest單元測試框架中,所以,可以直接使用。
mock作用
1. 解決依賴問題:當我們測試一個接口或者功能模塊的時候,如果這個接口或者功能模塊依賴其他接口或其他模塊,那么如果所依賴的接口或功能模塊未開發完畢,那么我們就可以使用mock模擬被依賴接口,完成目標接口的測試
2. 單元測試:如果某個功能未開發完成,我們又要進行測試用例的代碼編寫,我們也可以先模擬這個功能進行測試
3. 模擬復雜業務的接口:實際工作中如果我們在測試一個接口功能時,如果這個接口依賴一個非常復雜的接口業務,那么我們完全可以使用mock來模擬這個復雜的業務接口,其實這個和解決接口依賴是一樣的原理。
4.前后端聯調:如果你是一個前端頁面開發,現在需要開發一個功能:根據后台返回的狀態展示不同的頁面,那么你就需要調用后台的接口,但是后台接口還未開發完成,是不是你就停止這部分工作呢?答案是否定的,你完全可以借助mock來模擬后台這個接口返回你想要的數據
實例:
# mock_modular.py import requests class PayApi(): @staticmethod def auth(card, money): ''' 第三方支付接口 :param card: 卡號 :param money: 支付金額 :return: ''' pay_url = "http://www.payapi.com" data = { "card": card, "money": money } response = requests.post(url=pay_url, data=data) return response def pay(self, userId, card, money): ''' 我們自己的支付接口 :param userId: 用戶id :param card: 卡號 :param money: 支付金額 :return: ''' # 調用第三方支付接口 response = self.auth(card, money) try: if response['status_code'] == "200": print("用戶{}支付金額{}成功" .format(userId, money)) return "支付成功" elif response['status_code'] == "500": print("用戶{}支付失敗,金額不變".format(userId)) return "支付失敗" else: return "未知錯誤" except Exception: return "Error, 服務器異常!" if __name__ == "__main__": pass
# modular.py import unittest from unittest import mock from mock_modular import PayApi class TestPayApi(unittest.TestCase): def setUp(self): self.pay = PayApi() def test_success(self): # pay = PayApi()
# mock.Mock定義要模擬的函數,return_value定義模擬函數的返回值 self.pay.auth = mock.Mock(return_value={"status_code": "200"}) status = self.pay.pay('10000', '123456', "10000")
# 增加斷言,檢查返回值是否正確 self.assertEqual(status, "支付成功") def test_fail(self): # pay = PayApi() self.pay.auth = mock.Mock(return_value={"status_code": "500"}) status = self.pay.pay("10001", '1234567', "20000") self.assertEqual(status, "支付失敗") def test_error(self): # pay = PayApi() self.pay.auth = mock.Mock(return_value={"status_code": "300"}) status = self.pay.pay("10002", '12345678', '30000') self.assertEqual(status, "未知錯誤") def test_exception(self): # pay = PayApi() self.pay.auth = mock.Mock(return_value="201") status = self.pay.pay("10003", "123456789", "40000") self.assertEqual(status, "Error, 服務器異常!") '''
# mock.patch(模塊名.類名.函數名)指明了將要模擬的函數 @mock.patch("modular.PayApi.auth") def test_success(self, mock_payapi): mock_payapi.return_value={"status_code": "200"} pay = PayApi() status = pay.pay('10000', '123456', "10000") self.assertEqual(status, "支付成功") @mock.patch("modular.PayApi.auth") def test_fail(self, mock_payapi): pay = PayApi() mock_payapi.return_value={"status_code": "500"} status = pay.pay("10001", '1234567', "20000") self.assertEqual(status, "支付失敗") ''' if __name__ == "__main__": unittest.main()
運行modular.py,結果如下:
Ran 4 tests in 0.002s OK 用戶10001支付失敗,金額不變 用戶10000支付金額10000成功 Process finished with exit code 0
參考:https://www.cnblogs.com/linuxchao/p/linuxchao-mock.html