接口自动化测试工具-Apifox 基础篇:简介
1. 接口测试的需求
2. 常用解决方案
3. 存在的问题
存在的问题存在
- 开发人员在 Swagger 定义好文档后,接口调试的时候还需要去 Postman 再定义一遍。
- 前端开发 Mock 数据的时候又要用 Mock 工具定义一遍,还需要手动设置 Mock 规则。
- 测试人员需要去 JMeter 再定义一遍。
- 前端根据 RAP Mock 出来的数据开发完,后端根据 Swagger 定义的接口文档开发完,各都试测试通过了,本以为可以马上上线,结果一对接发现各种问题:
- 开发过程中接口变更了,只修改了 Swagger,但是没有及时同步修改 RAP。
- 后端开发的接口数据类型和文档不一致,肉眼难以发现问题。
- 同样,测试在 JMeter 写好的测试用例,真正运行的时候也会发现各种不一致。
时间久了,各种不一致会越来越严重。
4. Apifox 神器出现
Apifox=Postman + Swagger + Mock + JMeter
Apifox 是 API 文档、调试、Mock、测试一体化协作平台,定位Postman + Swagger + Mock + JMeter
。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、API 自动化测试就可以直接使用,无需再次定义;API 文档和 API 开发调试使用同一个工具,API 调试完成后即可保证和 API 文档定义完全一致。高效、及时、准确!
- 接口文档定义:Apifox 遵循 OpenApi 3.0 (原Swagger)、JSON Schema 规范的同时,提供了非常好用的可视化文档管理功能,零学习成本,非常高效。
- 接口调试:Postman 有的功能,比如环境变量、预执行脚本、后执行脚本、Cookie/Session 全局共享 等功能,Apifox 都有,并且和 Postman 一样高效好用。
- 数据 Mock:内置 Mock.js 规则引擎,非常方便 mock 出各种数据,并且可以在定义数据结构的同时写好 mock 规则。支持添加“期望”,根据请求参数返回不同 mock 数据。最重要的是 Apifox
零配置
即可 Mock 出非常人性化的数据,具体在本文后面介绍。 - 接口自动化测试:提供接口集合测试,可以通过选择接口(或接口用例)快速创建测试集。目前接口自动化测试更多功能还在开发中,敬请期待!目标是: JMeter 有的功能基本都会有,并且要更好用。
5. Apifox 十大核心功能
6. 对比PostMan
Apifox 脚本语法
100%
兼容Postman
脚本语法,Postman 脚本可以无缝迁移到 Apifox
6.1 Apifox使用方式
以下两个环节可添加脚本:
- 在将请求发送到服务器之前,使用 前置脚本。
- 收到响应后,使用 后置脚本(断言测试)
6.2 PostMan加断言在Pre-request script和Tests
以下两个环节可添加脚本:
- 在将请求发送到服务器之前,使用 Pre-request script
- 收到响应后,使用 Tests
Apifox一套接口文档,接口数据格式能做到前后端开发、测试等人员同时共享,可以省去不少沟通成本,对于提高团队协作还是有一定的帮助的。Apifox是一款综合性比较强的工具,学习成本肯定是比postman高些,如果你仅仅是个人开发,对文档、测试没那么高要求的,小而美的PostMan还是比较好的选择,如果你是大型项目,多团队协作,Apifox确实是一个不错的选择.
写脚本的易用性PostMan强很多,只不过Apifox可以兼容PostMan脚本。
7. 优势
8. Apifox常用断言使用示例
#断言请求返回的结果是否正确
// pm.response.to.have 示例
pm.test('返回结果状态码为 200', function() {pm.response.to.have.status(200);
});// pm.expect() 示例
pm.test('当前为正式环境', function() {pm.expect(pm.environment.get('env')).to.equal('production');
});// response assertions 示例
pm.test('返回结果没有错误', function() {pm.response.to.not.be.error;pm.response.to.have.jsonBody('');pm.response.to.not.have.jsonBody('error');
});// pm.response.to.be* 示例
pm.test('返回结果没有错', function() {// assert that the status code is 200pm.response.to.be.ok; // info, success, redirection, clientError, serverError, are other variants// assert that the response has a valid JSON bodypm.response.to.be.withBody;pm.response.to.be.json; // this assertion also checks if a body exists, so the above check is not needed
});
#将请求返回的结果数据写入环境变量
// 获取 JSON 格式的请求返回数据
var jsonData = pm.response.json();// 将 jsonData.token 的值写入环境变量
pm.environment.set('token', jsonData.token);
#检查 response body 是否包含某个字符串
pm.test('Body matches string', function() {pm.expect(pm.response.text()).to.include('string_you_want_to_search');
});
#检查 response body 是否包含等于字符串
pm.test('Body is correct', function() {pm.response.to.have.body('response_body_string');
});
#检查 json 值
pm.test('Your test name', function() {var jsonData = pm.response.json();pm.expect(jsonData.value).to.eql(100);
});
#检查 header 是否有设置 Content-Type
pm.test('Content-Type header is present', function() {pm.response.to.have.header('Content-Type');
});
#检查请求响应耗时是否低于 200 毫秒
pm.test('Response time is less than 200ms', function() {pm.expect(pm.response.responseTime).to.be.below(200);
});
#检查 HTTP 状态码是否为 200
pm.test('Status code is 200', function() {pm.response.to.have.status(200);
});
#检查 HTTP 状态码名称是否包含某个字符串
pm.test('Status code name has string', function() {pm.response.to.have.status('Created');
});
#是否正确的 POST 请求状态码
pm.test('Successful POST request', function() {pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
#断言库的使用示例
Apifox 内置了ChaiJS
作为断言库,以下是常用的断言测试脚本示例,但并非全部示例,更多用法请参考文档: ChaiJS expect BDD library
#断言目标字符串包含另一个字符串
pm.test('断言目标字符串包含另一个字符串', function() {pm.expect('foobar').to.have.string('bar');
});
#断言目标严格等于(===
)某值
const TEN = 10;
pm.test('Check if number is equal to 10', function() {pm.expect(TEN).to.equal(10);
});
如果设置了deep
标记,则断言目标深度等于value
pm.test('断言目标深度等于提供的 JSON', function() {pm.expect(data1).to.deep.equal(data2);
});
注意:
- 设置
deep
标记,然后使用equal
和property
断言。该标记可以让其后的断言不是比较对象本身,而是递归比较对象的键值对。
#断言深度等于某值,相当于deep.equal(value)
的简写
pm.test('Check response value', function() {var jsonData = pm.response.json();pm.expect(jsonData.value).to.eql(100);
});
#断言当前环境
pm.test('Check if environment is production', function() {pm.expect(pm.environment.get('env')).to.equal('production');
});
#断言数据类型
pm.test('Check if target is string', function() {pm.expect('Postman').to.be.a('string');
});
pm.test('Check if target is an object', function() {pm.expect({ a: 1 }).to.be.an('object');
});
pm.test('Check if target is undefined', function() {pm.expect(undefined).to.be.an('undefined');
});
注意:
- 推荐在做其他断言前,先使用
.a
方法检查模板的数据类型。 - 数据类型是大小写敏感的。
#断言是否为空
pm.test('Check if array is empty', function() {pm.expect([]).to.be.empty;
});
pm.test('Check if string is empty', function() {pm.expect('').to.be.empty;
});
还可以使用 .a
方法检查数据类型后,在断言是否为空。
示例:
pm.test('Check if array is empty', function() {pm.expect([]).to.be.an('array').that.is.empty;
});
#断言目标对象的键值
pm.test('Check if object contains all provided keys', function() {pm.expect({ a: 1, b: 2 }).to.have.all.keys('a', 'b');
});
pm.test('Checking if object contains any ONE of the keys', function() {pm.expect({ a: 1, b: 2 }).to.have.any.keys('a', 'b');
});
pm.test('Check if object contains any NONE of the provided keys', function() {pm.expect({ a: 1, b: 2 }).to.not.have.any.keys('c', 'd');
});
#断言目标对象是否包含指定属性
pm.test('Check if object contains the property', function() {pm.expect({ a: 1 }).to.have.property('a');
});
注意:
- 目标对象必须是
object
、set
、array
或map
。 - 如果
.keys
前面没有.all
或.any
,则默认为.all
。 - 由于只有部分数据类型的目标对象可使用
.keys
方法,建议先用.a
方法断言数据类型。
pm.test('Check if object contains all the keys', function() {pm.expect({ a: 1, b: 2 }).to.be.an('object').that.has.all.keys('a', 'b');
});
#断言目标对象的 length
pm.test('Check the length of the target', function() {pm.expect('foo').to.have.lengthOf(3);
});
pm.test('Check the size of the target', function() {pm.expect([1, 2, 3]).to.have.lengthOf(2);
});
#断言目标对象的成员 (members)
pm.test('Check if the target has same members as the array set', function() {pm.expect([1, 2, 3]).to.have.members([2, 1, 3]);
});
注意:
- 默认情况下,
.members
使用严格比较。 - members 的顺序不会影响结果。
#断言目标对象包含指定 item
pm.test('Check if the target array includes the number provided', function() {pm.expect([1, 2, 3]).to.include(2);
});
pm.test('Check if the target object includes the properties provided',function() {pm.expect({ a: 1, b: 2, c: 3 }).to.include({ a: 1, b: 2 });},
);
注意: 建议在 .include
前先使用 .a
方法判断数据类型。
示例:
pm.test('Check if the target is an array that includes the number specified',function() {pm.expect([1, 2, 3]).to.be.an('array').that.includes(2);},
);
接口自动化测试工具-Apifox 基础篇:简介相关推荐
- 接口自动化测试工具-Apifox 基础篇:配置环境
1. 环境管理 一个项目在不同的阶段会处于不同的环境中,比如开发环境.测试环境.生产环境,通常不同的环境有不同的前置 URL.接口参数等.因环境不同而频繁的更改接口前置 URL 及参数,是非常的麻烦的 ...
- 接口自动化测试工具-Apifox 基础篇:前置脚本
1. 前置脚本 前置脚本是在请求发送前执行的代码片段.如要在请求头中包含时间戳或在 URL 参数中发送随机的字母数字字符串等类似请求中非常适用. 2. 使用示例 2.1 要在请求头中包含当前时间戳, ...
- 国产化的接口测试、接口自动化测试工具apifox的介绍及使用
一.Apifox的介绍 1.Apifox 是 API 文档.API 调试.API Mock.API 自动化测试一体化协作平台,它的定位 Postman + Swagger + Mock + JMete ...
- 接口测试工具Apifox 基础篇:接口调试
一.关于Apifox与postman的区别 和 Postman 不一样,Apifox 是区分接口设计和接口运行两个概念的. 接口设计:即 新建接口 界面或接口详情里的 编辑 界面,用途是 定义接口文档 ...
- 接口测试工具Apifox 基础篇:测试管理
一.测试用例 1.路径:[自动化测试]-[测试用例]-[全部用例]-[详情]-[添加步骤] 添加用例有两种方式:从接口导入和从接口用例导入 (推荐) 2.从[接口]导入 根据接口参数自动生成一个用例, ...
- Python接口自动化测试框架(基础篇)-- 常用数据类型Number
前言 上篇讲了python的常用数据类型str,它的出镜率或使用率都还算过得去,常常使用的方法也差不多那几个,当然不排除作者不知或未使用过的方法,这一篇讲Number,同学们思考一下为啥bool要和i ...
- 接口测试工具Apifox 基础篇:数据操作
一.断言 后置操作支持添加断言,可对接口返回的数据(或响应时间)设置断言,判断是否符合预期. 1.设置断言 2.运行后,查看断言结果 二.变量提取 后置操作支持添加提取变量,可从接口返回结果里提取数据 ...
- Python接口自动化测试框架(基础篇)-- 流程控制之循环语句forwhile
前言 很开心,python学到循环语句了,也越来越好玩了,学到这儿,基本上也能处理一些流水线的工作了,只是稍欠装饰显得不那么灵活.复用性不高. 循环语句 python中循环语句有for和while:如 ...
- 类似postman的接口自动化测试工具,为什么都在用 apifox
接口测试很多人都会用到 postman,但实际上,在当下国内测试流程中,postman 有很多功能不符合国人的操作习惯,本文介绍一个接口自动化测试工具,已经在很多公司的测试团队中大量使用,它的主要应用 ...
最新文章
- 《深入理解Hadoop(原书第2版)》——1.3大数据的编程模型
- JavaScript语言基础3
- gba徽章机器人_徽章战士GBA攻略
- Python全栈工程师(文件操作、编码)
- 记不住ASP.NET页面生命周期的苦恼
- MySQL engine/type类型InnoDB/MYISAM/MERGE/BDB/HEAP的区别
- python nlp_使用python在stanford-nlp中的回指解析
- 存储器块清零c语言版,存储器块清零实验报告
- SQL Server2000企业管理器在Win7中新建表错误的解决方法
- 病毒周报(100118至100124)
- 每周.NET前沿技术文章摘要(2017-05-10)
- SQL检索MongoDB的轻量级解决方案
- Javascript条件运算符、其他运算符第五课(小二节)
- mac windows蓝牙问题
- 计算机技术一直在变吗,计算机软考分数线一直是45吗
- 金字塔固定资产管理软件_目前常用固定资产管理软件有哪些?
- 快读与快输(读入优化与输出优化、QIO优化)
- 微信自动投票的php代码
- 系统——windows10专业工作站版简单优化
- vim E486不存在::wq 错误笔记