在测试过程中,少不了各种情况下的数据的模拟。正常情况下可以通过流程的进行来测试,但有些时候正常流程却无法得到想要的数据,(比如一个接口异常信息的前端展示,正常情况下这种异常不会出现,测试时又不好复现异常场景),这时就需要我们自己来“伪造”一些我们想要的内容了。
先来看下什么叫做Mock,下面是维基百科中的定义:
在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象。程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为。
通俗来讲,就是使用技术手段来创建出一份“虚假数据”
首先来看下怎样通过Python来实现。python现成的可以实现服务端的框架比较出名的有Django、flask等,但对于我们来说这些框架都有些过重了。就拿Django来说,如果我想实现一个接口,我需要创建项目—创建app—编写views代码—配置url路由地址—配置setting等一系列操作。所以综合考虑下来,决定使用一个小型的框架:FastApi ✰✰✰官方文档地址✰✰✰
要使用fastapi,需要安装两个包
pip install fastapi
pip install uvicorn
官方文档中实现一个接口的示例代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root(): # 这里用到了协程,也可以使用普通函数
return {
"message":"success"}
在控制台中运行代码:
uvicorn fastapidemo:app --reload
其中fastapidemo
是这个示例代码文件的名字,app
是实例化的对象。如果没有其他问题的话,在控制台中可以看到如下内容
此时在浏览器中访问 http://127.0.0.1:8000 即可看到返回的结果(因为@app.get("/")
中没有配置其他路由地址,所以直接访问http://127.0.0.1:8000)
这只是最基本的一个接口,几行代码就可搞定了,接下来看看具体如何实现mock数据
首先说明下要实现的功能吧!这次举例用的是一个登录接口,入参为姓名(不做校验)、手机号、验证码,因为每次登录测试都需要发送手机短信验证码,比较麻烦。所以我就想要实现绕过验证码的校验,输入任意验证码都返回成功(因为是一个公司内部使用的接口,所以安全校验方面没做太多拦截,要想绕过验证码也可以使用其他方法。这里使用这个接口举例只是因为比较简单。。。。)
{
"success": true,
"message": "success",
"code": "200",
"data": {
"userId": 2085,
"token": "wer23fAiOiJKV1QiLCJhbGcixxx"
}
}
from fastapi import FastAPI
app = FastAPI()
@app.post("/")
async def login(phone:str, code:str, userName:str):
return {
"success": True,
"message": "success",
"code": "200",
"data": {
"userId": 2085,
"token": "werWEUV1QiLCJhbGciOiJIU"
}
}
这里需要注意的是login()方法的三个参数,这时需要在url中传入的,如:http://127.0.0.1:8000/?phone=13428888888&code=111111&userName=zhangsan,这里的传参方式是通过url来实现的,也可以使用json传参,使用json的话就需要使用BaseModel
包来实现,具体的方法可以查阅fastapi的官方文档。
3. 通过Charles实现代理转发
在charles想要转发的请求上右键单机,选择Map remote
是使用代码还是工具来实现,完全看个人爱好了,其他实现方式例如python的一个单独的mock库,工具中的easy-mock、Yapi等等等等,本文只能算是浅尝辄止,之后可以继续深挖一下更方便测试工作的展开。