python mock(模拟)接口

本文深入解析了Mock接口的概念,探讨了其在软件测试中的关键作用,包括辅助测试未完成的接口和提供安全的数据查询方式。同时介绍了实现Mock接口的多种方法,如使用Fiddler、Charles工具,MocoJar包,以及Python的Flask框架。

什么是mock接口?
Mock通常是指,在测试一个对象时,我们构造一些假的对象来模拟与其交互。而这些Mock对象的行为是我们事先设定且符合预期。通过这些Mock对象来测试对象在正常逻辑,异常逻辑或压力情况下工作是否正常。
引入Mock最大的优势在于:Mock的行为固定,它确保当你访问该Mock的某个方法时总是能够获得一个没有任何逻辑的直接就返回的预期结果。Mock接口就是用一些合理的手段构造对象去模拟真实接口,达到我们需要的测试效果。

开发mock接口的目的:
1、辅助测试,暂时代替第三方接口 或者 用来代替没有开发好的接口
2、查看数据,为了避免其它人连接数据库查看其它数据,直接提供接口查询想要的数据


mock接口的方法:
1.使用fiddler、charles工具;
2.使用moco jar包;
3.写代码,python可以使用flask框架(轻量级的web开发框架)

python之使用flask框架

import flask,json

#1.创建flask对象,使用该对象进行配置与运行
#name是python中的特殊变量,如果文件作为主程序执行,
# __name__变量的值就是__main__,如果是被其他模块引入,那么__name__的值就是模块名称

server = flask.Flask(__name__) #把app.python当作一个server

#2.装饰器,将get_all_user()函数变为一个接口127.0.0.1:9000、get_user
@server.route('/get_user',methods=['get','post'])
def get_all_user():
    all_user = [
        {'id':1,'sex':1,'real_name':'小花'},
        {'id': 2, 'sex': 0, 'real_name': '小明'},
        {'id': 1, 'sex': 1, 'real_name': '小黑'},
    ]
    res = json.dumps(all_user,ensure_ascii=False)#ensure_ascii为False时,可以包含non-ASCII字符
    return res

#3启动服务,debug=True表示修改代码后自动重启;
# 启动服务后接口才能访问,端口号为9000,默认ip地址为127.0.0.1
server.run(port=9000, debug=True)



 


 

### 使用Python Mock模拟第三方API调用 当开发依赖于外部服务的应用程序时,直接调用这些服务可能会带来不便或不可控因素。为了克服这些问题,在单元测试期间可以利用`unittest.mock`模块下的功能来替代实际的服务请求。 对于模拟第三方API接口而言,通常会采用`patch()`函数配合`MagicMock`类实现这一目标。下面给出一段具体的例子说明如何操作: 假设有一个名为`weather_service.py`的文件,其中定义了一个获取天气预报数据的功能函数`get_weather_forecast(city)`,该函数向某气象站发送HTTP GET请求以取得特定城市的天气情况。 #### 示例代码展示 ```python import requests def get_weather_forecast(city): url = f"https://api.weather.com/v3/wx/forecast/daily?geocode={city}&format=json" response = requests.get(url) return response.json() ``` 现在要对该函数编写对应的单元测试案例,并且不希望真的发起网络请求而是通过mock技术伪造返回的数据包。可以在测试脚本里这样做: ```python from unittest.mock import patch, MagicMock import weather_service @patch('requests.get') def test_get_weather_forecast(mock_get): # 定义预期响应内容 expected_response = {"success": True, "data": [{"date": "2023-10-09", "temperatureMax": 28}]} # 设置mock对象的行为 mock_response = MagicMock() mock_response.status_code = 200 mock_response.json.return_value = expected_response # 配置mock_get()行为 mock_get.return_value = mock_response result = weather_service.get_weather_forecast("Beijing") assert isinstance(result, dict), "The function should return a dictionary." assert 'success' in result and result['success'] is True, \ "Response data structure does not match expectation." # 断言是否正确地发起了GET请求以及参数传递无误 mock_get.assert_called_once_with( 'https://api.weather.com/v3/wx/forecast/daily?geocode=Beijing&format=json' ) ``` 上述代码片段展示了怎样借助`patch()`装饰器拦截住真实的`requests.get()`执行路径,转而由自定义好的`MagicMock`实例接管其职责;同时设置了期望的状态码与JSON解析后的字典形式的结果集作为回应给业务逻辑层的内容[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值