參考地址:https://www.cnblogs.com/lisa2016/p/12069243.html
1.什麼是mock
unittest.mock是一個用於在Python中進行單元測試的庫,Mock翻譯過來就是模擬的意思,顧名思義這個庫的主要功能是模擬一些東西。
它的主要功能是使用mock對象替代掉指定的Python對象,以達到模擬對象的行爲。
學過python自動化的對unittest並不陌生,unittest其實是單元測試框架,
但對於單元測試,估計很多小夥伴都不懂,單元測試纔是自動化測試的至高境界,其中mock是單元測試的脊髓所在
2.mock能做什麼:
1.前後端聯調,如果你是一個前端頁面開發,現在需要開發一個功能: 下一個訂單,支付頁面的接口,根據支付結果,支付成功,展示支付成功頁,支付失敗,展示支付失敗頁。 要完成此功能,你需要調用後端的接口,根據返回給你的結果,來展示不同的頁面。此時後端接口還沒開發好,
作爲一個前端開發總不能等別人開發好了,你再開發,那你只有加班的命了。 爲了同步開發完成任務,此時,你可以根據接口文檔的規定,把接口的地址和入參傳過去,然後自己mock接口的不同返回界面,來完成前端的開發任務 2.單元測試,單元測試的目的是測試某個小小單元的功能,但現實中開發的函數或方法都是有依賴關係的,比如b函數的參數,需要調用a函數的返回結果,但是我前面已經測試a函數了 這種情況下,就不需要再測一次a函數了,此時就可以用mock模塊來模擬調用這部分內容,並給出返回結果 3.第三方接口依賴,在做接口自動化的時候,有時候需要調用第三方的接口,但是別人公司的接口服務不受你的控制,有可能別人提供的測試環境今天服務給你開着,別人就關掉了,
給自動化接口測試帶來很多的麻煩,此時就可以自己寫一個mock-server來模擬接口的返回數據
函數代碼temple.py:
# coding:utf-8 def zhifu(): '''假設這裏是一個支付的功能,未開發完 支付成功返回:{"result": "success", "reason":"null"} 支付失敗返回:{"result": "fail", "reason":"餘額不足"} reason返回失敗原因 ''' pass # 本接口return值 def zhifu_statues(): '''根據支付的結果success or fail,判斷跳轉到對應頁面''' result = zhifu() # print(result) try: if result["result"] == "success": print("success") return "支付成功" elif result["result"] == "fail": print("失敗原因:%s" % result["reason"]) return "支付失敗" else: return "未知錯誤異常" except: return "Error, 服務端返回異常!"
測試代碼test_temple.py:
# coding:utf-8 from unittest import mock import unittest from . import temple class Test_zhifu_statues(unittest.TestCase): '''單元測試用例''' @mock.patch("temple.zhifu") def test_01(self, mock_zhifu): '''測試支付成功場景''' # 方法一:mock一個支付成功的數據 # temple.zhifu = mock.Mock(return_value={"result": "success", "reason":"null"}) # 方法二:mock.path裝飾器模擬返回結果 # 方法三:如果被測的是面向對象, # @mock.patch("temple_class.Zhifu") # a = mock_Zhifu.return_value # 先返回實例,對類名稱替換 # 通過實例調用方法,再對方法的返回值替換 # a.zhifu.return_value = {"result": "success", "reason": "null"} mock_zhifu.return_value = {"result": "success", "reason": "null"} # 根據支付結果測試頁面跳轉 statues = temple.zhifu_statues() print(statues) self.assertEqual(statues, "支付成功") def test_02(self): '''測試支付失敗場景''' # mock一個支付成功的數據 temple.zhifu = mock.Mock(return_value={"result": "fail", "reason": "777"}) # 根據支付結果測試頁面跳轉 b1 = temple.zhifu_statues() # zhifu_statues()返回值給一個變量接收 self.assertEqual(b1, "支付失敗") if __name__ == "__main__": unittest.main()