在自動化測試過程中我們可能會遇到一個 A 接口需要調用其他的接口(外部接口),但是其他接口不能正常訪問;但是我們又需要測試 A 接口;這時我們就可以使用 mock ,來模擬第三方接口請求成功后,獲取到他的返回值,才可以進行下一步測試
先定義第三方接口支付類
import requests class Payment: """ 定義第三方支付類 """ @staticmethod def auth(card_num, amount): """ 請求 某付寶 第三方的支付接口, 不是我們自己開發的接口 :param card_num: 卡號 :param amount: 金額 :return: 返回狀態碼, 200代碼支付成功, 500 代表支付異常 """ url = "http://第三方字符串接口.site" # 假接口地址不能訪問 data = {"card_num": card_num, "amount": amount} # 參數 res = requests.post(url, data=data) # 傳參 return res.status_code # 正常返回狀態碼, 200代碼支付成功, 500 代表支付異常 def pay(self, user_id, card_num, amount): """ 支付方法 :param user_id: 用戶ID :param card_num: 卡號 :param amount: 金額 :return: """ try: status_code = self.auth(card_num, amount) except TimeoutError: # 超時異常,后再進行支付 status_code = self.auth(card_num, amount) if status_code == 200: # 返回200成功 print(f"【{user_id}】支付【{amount}】成功!!! 進行扣款並登記支付記錄!") return "success" elif status_code == 500: # 500 代表支付異常 print(f"【{user_id}】支付【{amount}】失敗!!! 不進行扣款!") return "Fail"
接下來我們來測試支付接口
只有支付成功后才能買到商品,但現在不能調用第三方的支付接口時,就使用mock來代替充值成功,方便測試支付功能?
import unittest from unittest import mock # 導入unittest當中的mock from scripts.bbpayment import Payment # 測試的支付接口模塊 class PaymentTest(unittest.TestCase): """ 測試支付接口 """ def setUp(self): self.payment = Payment() # 創建這個類的對象 def test_normal(self): """ 正常調用支付接口會失敗 :return: """ res = self.payment.pay(user_id=1001, card_num=6666, amount=100000) self.assertEqual('success', res) def test_success(self): """ 測試支付成功,模擬返回值 :return: """ # 第三方支付接口不能訪問,我們需要來創建一個假的接口來替代它,模擬返回的數據 # 可以直接返回對象 # self.payment.auth = mock.Mock(return_value='{"name": "超越", "msg": "征婚成功", "code": 8888}') # 可以模擬返回狀態碼 self.payment.auth = mock.Mock(return_value=200) # 創建假接口來覆蓋第三方接口,模擬返回200 res = self.payment.pay(user_id=1001, card_num=6666, amount=100000) self.assertEqual('success', res) def test_fail(self): """ 測試支付失敗,模擬返回值 :return: """ self.payment.auth = mock.Mock(return_value=500) # 創建假接口來覆蓋第三方接口,模擬返回500 res = self.payment.pay(user_id=1001, card_num=6666, amount=100000) self.assertEqual('Fail', res) def test_retry_success(self): """ 測試調用的第三方接口超時之后, 再次字符串成功,模擬返回值 :return: """ # 邊界校驗傳參 self.payment.auth = mock.Mock(side_effect=[TimeoutError, 200]) res = self.payment.pay(user_id=1001, card_num=6666, amount=100000) self.assertEqual('success', res) if __name__ == '__main__': unittest.main()
失敗結果
成功結果
*******請大家尊重原創,如要轉載,請注明出處:轉載自:https://www.cnblogs.com/shouhu/ 謝謝!!*******