接口
一、接口
1、什么是接口?
(1)软件:统称API,application,program,interface,微信提现和充值,支付宝支付,银联支付接口(鉴权码:token,key,appkey)鉴权码:token,key,appkey
(2)接口包括:内部接口和外部接口
- 内部接口:开发人员自己开发的对自身系统提供的接口
- 外部接口:开发系统调用外部的,微信,支付宝,其他的接口
- 总结:借口就是软件提供给外部的一种服务
2、软件为什么需要接口
- 因为接口能够让内部的数据被外部进行修改
3、为何做接口测试
(1)前后端开发进度不一致,需要把一开始开发出的接口进行测试
- mock:mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mock对象来模拟对象的行为
(2)基于安全考虑,前端有验证很容易绕过去,直接请求接口,特别是涉及到身份证信息、银行卡、金钱交易方面
(3)测试推崇的是测试左移,测试尽早介入
接口测试的本质:测试接口能否正常的交互数据,权限控制及异常场景
二、接口返回数据和JSON详解
1、JSON格式 (包含三组数据)
(error_code:0,msg"提现成功",data:[])
- error_code:错误码,0表示成功,code
- msg:对错误码的中文说明
- data:真正的返回的数据
(1)json就是一种数据类型,整形,小数,字符串
(2)JSON由两组数据组成:MAP对象,键值对(key:value)
数组:{value1,value2,value3}
2、HTML格式
<html>
<title></title>
<body>
<error_code>0</error_code>
.........
</body>
</html>
3、xml格式
<?xml?version="1.0"encoding="utf-8">
<error_code>0</error_code>
.......
</xml>
三、接口测试协议
1、webservice协议
接口地址:http://…?wsdl
soap协议(一种通信协议),wsdl是其描述文件
restful规则:get获取规则,post提交数据,put修改数据,delete修改数据
2、dubbo协议
接口地址以dubbo://…
适用于少量数据的传输(不适合传视频,大文件等数据),大并发
3、http协议(主流)
接口地址:http://…
https=http+ssl 安全传输协议 端口:443
http 端口:80
http协议:http是超文本传输协议,主要用于浏览器和服务器之间交互数据,交互有两个部分 请求和响应
请求:get、put、post、delete
响应:1XX信息,2XX成功,3XX重定向(跳转不传值),4XX客户端错误,5XX服务器错误
请求部分包含:
请求行:请求方式,请求地址,协议
请求头:
Accept:application/json,tex/javascript,’/’,q=0.01(客户端可以接收的数据格式)
X-Requested-With:XMLHttpRequest(异步请求,一般应用在局部刷新的请求里)
User-Agent:PosmaRuninue/7.26.5(客户端的用户/代理)
Cache-Control:no-cache
Postman-Token:14a45257-b900-46e4-b760-e45c1a2ac824(postman的鉴权)
Host:47.107.116.139(请求的主机地址)
Accept-Encoding:gzip,deflate,br(压缩方式)
Connection:keep-alive(保持活跃,如果不是保持活跃这个状态,每请求一次就会断开)
Cookie:wNq_lastvisit=1029%091605272358%09%2Fphpwind%2F
wNq_visitor=pWS4zEbz%2F5x0XgEQQ4F20ipEcVIS8AU0DopI6Xoj7L3SmaUYR%2Fw%3D%
3D;csrf_token=68bd2c7857e99ca7(这个请求的cookie信息)
Content-Length:0(内容的长度)
空一行
请求正文
响应部分:
响应行:协议,响应码,响应信息
HTTP/1.1.200 OK
Server.nginx
Date:Fri.13 Nov 2020 21:55:23 GMT
Conent-Type: text/html; charset=UTF-8
Connection:keep-alive
X-Powered-By: PHP/5.6.36
Set-Cookie:
wNq_lastvisit=1033%091605272362%2Fphpwind%2Findex.php%3Fm%3Du%26c%3Dlogin%26a%3Dorun; expires=Sat, 13-Nov-2021 21:55:23 GMT; Max-Age=31536000; path=/
Vary: Accept-Encoding(响应的)
Content-Length: 196
四、企业接口测试的流程和方案
1、拿到api接口文档,熟悉接口的业务、接口地址、鉴权、入参、出参、错误码
2、接口计划和方案
思路:
(1)正例:输入正常的入参,查看接口是否返回正常
(2)反例:
- 鉴权反例:鉴权为空,鉴权码错误,鉴权码过期…
- 参数反例:参数为空,参数类型异常,参数长度异常,错误码的覆盖
- 其他场景:分页异常
3、编写用例和评审
4、执行接口测试
5、输出接口测试报告
五、接口测试工具以及Postman介绍
1、接口测试工具:postman、soupUI、apipost、fiddler、charies
2、postman界面介绍
- Params:用于在get请求传参
- Authorization:postman自带的鉴权功能
- Headers:请求头(详情请点击“请求头”,查看相关内容)
- Body:post请求传参(none:没有参数;form-data:既有文件又有键值对;x-www-form:只传输键值对;raw:创JSON,TXT,HTML,JS;binary:把文件以二进制的方式传输)
- Pre-request Script:接口请求之前的脚本(js)
- Tests:断言
cookies:postman的cookie管理器 - code:生成接口自动化脚本
- Body:返回的数据(Pretty:以JSON格式展示;Raw:以文本格式展示;Preview:以网页的格式展示)
- cookie:返回的cookie信息
- Header:响应头
- Test Result:断言
- status:状态码
- time:消耗的时间
- size:字节数
3、postman内置的动态参数
企业当中做接口测试的时候会出现接口不能把参数写死
- 时间戳:{{$timestamp}}
- 生成0-1000的随机整数:{{$randomInt}}
- 生成一个GUID的字符串:{{$guid}}(很长的一个字符串)
4、postman环境变量和全局变量
- 环境包括:开发环境、测试环境、预发布环境、线上环境
- 环境变量和Globals都是全局变量
5、接口关联 - JSON提取器
//提取access_token的值
var jsValue = Json.parse(responseBody);
console.log(jsValue.access_token);
//把提取的值保存到全局变量
pm.globals.set("access_token",jsValue.access_token);
- 正则表达式
//使用正则表达式提取
var flag_id = responseBody.match(new RegExp('"id":(.+?),'));
//new RegExp 新建一种规则
var flag_id = responseBody.match(new RegExp('"id":(.+?),'))[1];
//取第一个值(id:518 是第 0个值)
- Cookie提取器
6、断言
八大断言方式,八大元素定位
※1、断言返回为200 (一般用于状态断言)
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
※2、断言返回的结果中包括一个指定的字符串 (一般用于业务断言)
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
3、对返回的结果做json字段检查 (用于业务断言)
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
4、断言返回的结果等于一个字符串 (用于业务断言)
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
5、断言响应头中包含有指定的响应头
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
6、断言接口请求的时间少于200毫秒 (用于性能断言)
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
7、断言一个post请求的返回的状态码是否在指定的范围里面
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
8、断言返回的信息中包含指定的字符串
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});