为什么用APIFOX
如果你只是一个人,什么方便用什么,无所谓。但是,在公司就一定是一个团队,只要是团队,就需要协作,就需要**沟通成本,时间成本**,这些,如果你用了APIFOX,就都帮你节省下来了。
APIFOX=Postman + Swagger + Mock + JMeter
通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、API 自动化测试就可以直接使用,无需再次定义;API 文档和 API 开发调试使用同一个工具,API 调试完成后即可保证和 API 文档定义完全一致。高效、及时、准确!🔥🔥🔥
下图是大多数团队的常规做法
上图可以看到,N多个直线连接,每一个直线连接都很可能意味着时间成本+沟通成本。 如果用了APIFOX,就会变成下面这样,非常简洁。
使用
注册 -》新建项目-》新建团队=》拉成员。
这个实在是太简单了,顺序官网里都有,就不说了。但是,团队和项目的规则需要说一下。对于我们的团队,这样规定。比如,A项目就建个A团队,每个微服务做为一个项目。
导入/编写接口
swagger导入接口,定时自动导入
随便找到一个接口,选择运行标签页,基本的操作都PostMan一模一样,PostMan能做的他全部都一样,在此不再详述。
你也可以自己创建一个API,同步swagger后也不会被覆盖。如果是自己新写的接口,要写返回,可以把以前的JSON复制过来,直接智能导入。
{
"code": 200,
"msg": "",
"data": {
"name":"zs"
"code":"001"
}
}
如果有不正确的,自行微调。
还可以添加响应示例。由于格式都已经定好,所以他能自动MOCK
这些自动生成的规则都可以去选择(对测试有用)
如果需要修改接口,比如再加个参数,自动生成同样的会把新的给弄过来。可以演示一下。至此,接口文档结束。当然,如果有SWAGGER导入过来的直接用就行了。新建接口是为了还没有上测试环境的新接口,来给前后端联调用的。
前端直接调用这个MOCK地址,就可以开始照着结构开发了
具体字段什么意思,新接口的这个东西应该由后端开发去导入或者自行去填写
另,需要文档的话,分享出去即可。
复制完链接即可看到很美观的文档了
单元测试:
在运行页这里CTRL+S就能直接保存相应的测试用例。测试如果需要单元测试,也只需要点按钮就行了,节省大量时间。
自动化测试:
复制是复制一份新数据,绑定就是用原来的数据
如果需要测试数据的话可以去填写,不需要的话填写线程数和循环次数(同JMeter),点运行。
每个都可以点更多详情去查看
测试套件是可以套多个测试用例的,可以用回归测试,在此也不在详述。
数据类型校验
数据类型校验,就是你期望什么类型,实际返回什么类型,如果不一致,会返回错误。但是这里注意一下,如果返回空,会检验失败。可以点进去勾选允许NULL。
环境
接口路径 建议不要包含 HTTP 协议及域名,这部分建议在 环境管理 的前置URL里设置,接口调试时的 URL 会自动加上当前环境的前置URL。
BUG重现
这是一个非常实用的功能。比如测试告诉你这个页面有BUG,然后你点进去看,打开CHROME,打开NETWORK,看到一大堆的输入参数,头都大了,难道要一个个复制过去么?现在不需要了!!!怎么做?
利用导入抓包数据(url)
chrome的NETWORK右键copy as curl(bash)
apifox直接新建导入抓包工具,所有参数会全部填充。
最后,当然是改成localhost去调试了。
APIHUB
在设置里面有APIHUB,可以看到很多开放的API,对于我们团队来说,看看别人的API的命名规范,是一个很好的学习方式。
前端MOCK
前端必须看,必须看,必须看。重要的事情说3遍
https://www.apifox.cn/help/articles/apifox-mock
注:如果之前后端API没定义完整的可以直接把已经成功的返回值给复制过来,可自动生成
自动登录脚本
像我们项目里的header里需要带Authorization的该怎么办呢?
那就可以把他作为全局参数。token24小时后失效,那就需要去访问一下登录接口,然后把token放到全局参数里即可,1天只需要做一次。但是,我还是觉得这样很麻烦,因为登录是auth开头的,而其它服务不是auth开头的。按照上面说的配置环境的原则,不是没法搞了么?其实可以加个专门的auth环境,这样就可以了。那这不是更麻烦了么?其实,有办法一键搞定。**用脚本。**
前置知识:环境变量相当于K-V。可以在其它地方随意调用该变量,调用方式通过 {{}}
下面就可以写脚本了
function sendLoginRequest() {
// 获取环境里的 前置URL
const baseUrl = pm.environment.get("BASE_URL");
// 构造一个 POST x-www-form-urlencoded 格式请求。这里需要改成你们实际登录接口的请求参数。
const loginRequest = {
url: "http://10.89.33.54:3001/auth/login",
method: "POST",
// body 为 json 格式
header: {
"Content-Type": "application/json", // 注意:header 需要加上 Content-Type
},
body: {
mode: 'raw',// 此处为 raw
raw: JSON.stringify({ username: 'admin', password:'admin123@',"code":" " }), // 序列化后的 json 字符串
}
};
// 发送请求。
// pm.sendrequest 参考文档: https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequest
pm.sendRequest(loginRequest, function(err, res) {
if (err) {
console.log(err);
} else {
// 读取接口返回的 json 数据。
// 如果你的 token 信息是存放在 cookie 的,可以使用 res.cookies.get('token') 方式获取。
// cookies 参考文档:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookies
const jsonData = res.json();
// 将 accessToken 写入环境变量 ACCESS_TOKEN
pm.environment.set("Authorization", jsonData.data.access_token);
// 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRES
pm.environment.set(
"ACCESS_TOKEN_EXPIRES",
jsonData.data.userInfo.expireTime
);
}
});
}
// 获取环境变量里的 ACCESS_TOKEN
const accessToken = pm.environment.get("Authorization");
// 获取环境变量里的 ACCESS_TOKEN_EXPIRES
const accessTokenExpires = pm.environment.get("ACCESS_TOKEN_EXPIRES");
// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求
if (
!accessToken ||
(accessTokenExpires && new Date(accessTokenExpires) <= new Date())
) {
sendLoginRequest();
}
注意,这里面的变量Authorization和{{Authorization}}没有直接关系,只是名字一样。{{Authorization}}引用的永远是环境变量里的key,和脚本里的变量没有任何关系。上图有变量预览,这样可以确认下是否已经取到
那这个脚本写在哪里呢?为什么会生效呢?
在接口管理里,找到项目概览,然后自定义脚本。
可以看到,所有项目都是默认继承父级的,项目概览是所有项目的父级,所以会生效
角色职责
1. 后端在 Apifox 上定好接口文档初稿。
2. 前端 使用系统根据接口文档自动生成的 Mock 数据进入开发,无需手写 mock 规则。
3. 后端 使用接口用例 调试开发中接口,只要所有接口用例调试通过,接口就开发完成了。如开发过程中接口有变化,调试的时候就自动更新了文档,零成本的保障了接口维护的及时性。
4. 后端 每次调试完一个功能就保存为一个接口用例。
5. 测试人员 直接使用接口用例测试接口。
6. 前后端 都开发完,前端从Mock 数据切换到正式数据,联调通常都会非常顺利,因为前后端双方都完全遵守了接口定义的规范。
总结:
- 后端人员:编写或导入接口,接口有修改必须要通过APIFOX进行接口自测,只要自测成功那接口文档必然会进行同步。
- 前端人员:直接MOCK生成后端结构进行开发。
- 测试:可以在自动化测试里进行接口测试,可以在套件里自己配置测试步骤,比如可用于回归测试。