【Mock】mock基礎、簡單的單元測試代碼練習。


說到接口測試,必問 mock,mock 通俗一點來說就是模擬接口返回。解決接口的依賴關系,主要是為了解耦,單元測試用的多。

什么是Mock

 

unittest.mock 是一個用於在 Python 中進行單元測試的庫,Mock 翻譯過來就是模擬的意思,顧名思義這個庫的主要功能是模擬一些東西。它的主要功能是使用 mock 對象替代掉指定的 Python 對象,以達到模擬對象的行為。

學過 python 自動化的對 unittest 並不陌生,unittest 其實是單元測試框架, 但對於單元測試,估計很多小伙伴都不懂,單元測試才是自動化測試的至高境界,其中 mock 是單元測試的脊髓所在。

mock 能做什么
 1.前后端聯調,如果你是一個前端頁面開發,現在需要開發一個功能:下一個訂單,支付頁面的接口,根據支付結果,支付成功,展示支付成功頁,支付失敗,展示支付失敗頁。要完成此功能,你需要調用后端的接口,根據返回給你的結果,來展示不同的頁面。此時后端接口還沒開發好,作為一個前端開發總不能等別人開發好了,你再開發,那你只有加班的命了。為了同步開發完成任務,此時,你可以根據接口文檔的規定,把接口的地址和入參傳過去,然后自己 mock 接口的不同返回界面,來完成前端的開發任務

 2.單元測試,單元測試的目的是測試某個小小單元的功能,但現實中開發的函數或方法都是有依賴關系的,比如 b 函數的參數,需要調用 a 函數返回結果,但是我前面已經測試 a 函數了。這種情況下,就不需要再測一次 a 函數了,此時就可以用 mock 模塊來模擬調用這部分內容,並給出返回結果

 3.第三方接口依賴,在做接口自動化的時候,有時候需要調用第三方的接口,但是別人公司的接口服務不受你的控制,有可能別人提供的測試環境今天服務給你開着,別人就關掉了,給自動化接口測試帶來很多的麻煩,此時就可以自己寫一個 mock-server來模擬接口的返回數據。

mock 環境准備
1.python2.x 的版本,mock 是一個獨立的模塊,需要用 pip 安裝

pip install -U mock

3.從 Python 3.3 以后的版本 mock 已經合並到 unittest 模塊中了,是 unittest單元測試的一部分,直接導入過來就行

from unittest import mock

PS:我用的是pycharm運行的下面的代碼,在pycharm中,沒有安裝上unittest(但是后來發現運行代碼並不影響),直接安裝了mock,在安裝mock之前需要先升級pip到19以上的版本才行。

單元測試場景(依賴關系)

1.如下場景:支付是一個獨立的接口,由其它開發提供,根據支付的接口返回狀態去顯示失敗,還是成功,這個是你需要實現的功能

也就是說你寫一個 b 功能,你的同事寫一個 a 功能,你的 b 功能需要根據 a 功能的結果去判斷,然后實現對應的功能。這就是存在依賴關系,你同事開發的進度你是無法控制的你要是等他開發完了,你再開發,那你就坐等加班吧.

2.以下是自己寫的 zhifu_statues()函數功能,大概設計如下,保存為temple.py 文件。

 

 

#保存為temple.py
#coding:utf-8

def zhifu():
'''假設這里是一個支付的功能,未開發完 
支付成功返回:{"result": "success", "reason":"null"} 
支付失敗返回:{"result": "fail", "reason":"余額不足"} 
reason 返回失敗原因
'''
    pass

def zhifu_statues():
'''根據支付的結果  or 判斷跳轉到對應頁面'''
    result = zhifu()
    print(result)
    try:
        if result["result"] == "success":
            return "支付成功"
        elif result["result"] == "fail":
            print("失敗原因:%s" % result["reason"])
            return "支付失敗"
        else:
            return "未知錯誤異常"
    except:
     return "Error,服務端返回異常"

 

以下為單元測試用例設計:

#保存為unittest_cases.py

# coding:utf-8
from unittest import mock import unittest import temple class Test_zhifu_statues(unittest.TestCase): '''單元測試用例'''
    def test_01(self): '''測試支付成功場景'''
#mock一個支付成功數據
        temple.zhifu = mock.Mock(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": "余額不足"}) #根據支付結果測試頁面跳轉
        statues = temple.zhifu_statues() print(statues) self.assertEqual(statues,'支付失敗') def test_03(self): temple.zhifu = mock.Mock(return_value={"result": "1", "reason": "未知錯誤"}) statues = temple.zhifu_statues() print(statues) self.assertEqual(statues,'未知錯誤異常') if __name__=="__main__": unittest.main()

運行效果截圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM