在自动化测试过程中我们可能会遇到一个 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/ 谢谢!!*******