使用Python來寫mock代碼(樁代碼)-其實很簡單

 

1.Mock基本用法

  • 使用Mock能建立你能訪問(模擬)的屬性和方法
  • 指定類或者函數的返回值和斷言方式

建立handle_mock_01.py文件python

# 1. 導入mock模塊
from unittest import mock


class Payment(object):
    """
    建立支付類
    """
    pass


payment = Payment()
# 2. 建立Mock對象, 做爲Payment的實例方法
payment.pay = mock.Mock(return_value="Success")
# 3. 當調用pay方法時, 會返回定義Mock對象時指定的return_value值
print(payment.pay())

  

2.不一樣的參數返回不一樣的值

建立handle_mock_02.py文件web

# 1. 導入mock模塊
from unittest import mock


class Payment(object):
    """
    建立支付類
    """
    pass


def parameter_return_data(param):
    """定義參數與返回值映射函數
    """
    param_data = {
        "用戶ID1": "支付成功",
        "用戶ID2": "支付異常",
        "用戶ID3": "支付超時",
        "用戶ID4": KeyError("參數有誤"),  # 能夠返回異常

    }
    return param_data[param]


payment = Payment()
# 2. 建立Mock對象, 做爲Payment的實例方法
payment.pay = mock.Mock(side_effect=parameter_return_data)
# 3. 當調用pay方法時, 會返回指定的值
print(payment.pay("用戶ID1"))   # 返回結果: 支付成功
print(payment.pay("用戶ID2"))   # 返回結果: 支付異常
print(payment.pay("用戶ID3"))   # 返回結果: 支付超時
print(payment.pay("用戶ID4"))   # 返回結果: '參數有誤'

  

3.傳參個數

建立handle_mock_03.py文件面試

 

# 1. 導入mock模塊
from unittest import mock


class Payment(object):
    """
    建立支付類
    """
    pass


def fn(a, b):
    """假設實際pay函數, 有兩個參數"""
    pass


payment = Payment()
# 2. 建立Mock對象, 做爲Payment的實例方法
payment.pay = mock.create_autospec(fn, return_value="支付成功")
# 3. 當調用pay方法時, 傳參數的個數若是不爲兩個, 則會拋出異常
print(payment.pay("用戶ID1", "卡號"))   # 返回結果: 支付成功
print(payment.pay("用戶ID1"))           # 返回結果: TypeError: missing a required argument: 'b'

  

4.斷言方式

建立handle_mock_04.py文件架構

# 1. 導入mock模塊
from unittest import mock


class Payment(object):
    """
    建立支付類
    """
    pass


def parameter_return_data(param):
    """定義參數與返回值映射函數
    """
    param_data = {
        "用戶ID1": "支付成功",
        "用戶ID2": "支付異常",
        "用戶ID3": "支付超時",
        "用戶ID4": KeyError("參數有誤"),  # 能夠返回異常

    }
    return param_data[param]


payment = Payment()
# 2. 建立Mock對象, 做爲Payment的實例方法
payment.pay = mock.Mock(side_effect=parameter_return_data)
# 3. 當調用pay方法時, 會返回指定的值
# 4. 不一樣的斷言方式
# a. assert_called() mock方法至少調用一次
# 若是還未調用, 則返回 AssertionError: Expected 'None' to have been called.
# 若是已經調用, 則返回None
print(payment.pay("用戶ID1"))   # 返回結果: 支付成功
# print(payment.pay.assert_called())  # 返回結果: None

# b. assert_called_once() mock方法只調用一次
# 若是調用超過一次則返回 AssertionError: Expected 'None' to have been called.
# 不然返回None
print(payment.pay.assert_called_once())  # 返回結果: None

# c. assert_called_with() 斷言mock方法已經攜帶某個參數調用了
# 若是沒有攜帶某個參數調用, 那麼會斷言失敗
print(payment.pay.assert_called_with("用戶ID1"))  # 返回結果: None

# d. assert_called_once_with() 斷言mock方法已經攜帶某個參數調用了一次
# 若是沒有攜帶某個參數調用一次的話, 那麼會斷言失敗
print(payment.pay.assert_called_once_with("用戶ID1"))  # 返回結果: None

# e. assert_any_call() 有攜帶參數(有便可)調用過

# f. assert_not_called() 斷言mock方法從未調用過

  

2、總結💡💡

  • 本文介紹了Python處理Mock的經常使用操做
  • 對於使用Python寫mock代碼有幫助
  • 本文爲原創, 如需轉載請聯繫本人。有不足之處, 歡迎指點!

 

 

 


若是對python自動化測試、web自動化、接口自動化、移動端自動化、大型互聯網架構技術、面試經驗交流等等感興趣的老鐵們,能夠關注我。我會不按期的發放免費的資料連接,這些資料都是從各個技術網站蒐集、整理出來的,若是你有好的學習資料能夠私聊發我,我會註明出處以後分享給你們。歡迎分享,歡迎評論,歡迎轉發。須要資料的同窗能夠關注個人微頭條獲取資料連接。ide

相關文章
相關標籤/搜索