python Mock基本使用
mock简介
mock原是python的第三方库。python3以后mock模块已经整合到了unittest测试框架中,不用再单独安装。Mock这个词在英语中有模拟的意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为既然mock已经被整合到了unittest单元测试框架中,可想而知mock的目的就是为了让我们更好的进行测试
mock作用
1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模块,那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以使用mock模拟被依赖接口,完成目标接口的测试
2. 单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试
3. 模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复杂的接口业务,那么我们完全可以使用mock来模拟这个复杂的业务接口,其实这个和解决接口依赖是一样的原理
4.前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同的页面,那么你就需要调用后台的接口,但是后台接口还未开发完成,是不是你就停止这部分工作呢?答案是否定的,你完全可以借助mock来模拟后台这个接口返回你想要的数据
支付案例:第三方支付接口目前不能调用情况下 使用mock完成测试
支付功能: payment.py
import requests from unittest import mock def request_lemonfix(): """ :return: """ res = requests.get('http://www.lemonfix.com') return res.status_code.encode('utf-8') if __name__ == '__main__': request_lemonfix = mock.Mock(return_value="这里会显示论坛主页") print(request_lemonfix()) 然后再来一个实用的例子:第三方支付接口目前不能调用情况下 使用mock完成测试 import requests class Payment: """ 定义第三方支付类 """ def authe(self, card_num, amount): """ 请求第三方支付接口,并返回响应码 :param card_num: 卡号 :param amount: 金额 :return: 返回状态码200 代表支付成功,500 代表支付异常 """ url = "https://www.dd.com" # 第三方的url data = {"card_num": card_num, "amount": amount} response = requests.post(url, data=data) return response.status_code def pay(self, user_id, card_num, amount): """ 支付 :param user_id: 用户id :param card_num: 卡号 :param amount: 金额 :return: """ try: status_code = self.authe(card_num, amount) except TimeoutError: status_code = self.authe(card_num, amount) if status_code == 200: print("支付成功") return "success" if status_code == 500: print("支付失败") return "fail"
测试Case功能:Mock_demo
# -*- coding: utf-8 -*- #@Time : 2021/11/2 20:16 #@Auth : Ann #@File :modular.py #@IDE :PyCharm import requests class Payment: """ 定义第三方支付类 """ def authe(self, card_num, amount): """ 请求第三方支付接口,并返回响应码 :param card_num: 卡号 :param amount: 金额 :return: 返回状态码200 代表支付成功,500 代表支付异常 """ url = "https://www.dd.com" # 第三方的url data = {"card_num": card_num, "amount": amount} response = requests.post(url, data=data) return response.status_code def pay(self, user_id, card_num, amount): """ 支付 :param user_id: 用户id :param card_num: 卡号 :param amount: 金额 :return: """ try: status_code = self.authe(card_num, amount) except TimeoutError: status_code = self.authe(card_num, amount) if status_code == 200: print("支付成功") return "success" if status_code == 500: print("支付失败") return "fail"