Postman

安装

官方文档

https://learning.postman.com/docs/writing-scripts/pre-request-scripts/

安装

这个没啥说的,下载安装就行

首页

出现问题

问题一:

Error: Client network socket disconnected before secure TLS connection was established

请求页面出现如下错误:

控制台信息:

检查 代理 设置,关掉代理即可

问题二:SSL Error: Self signed certificate

请求后报如下错误:

原因:开启了 SSL 校验,可是用的是本地的 SSL

解决方法:关闭 SSL 校验即可

快捷操作-小技巧

快速整理 json/xml

ctrl + b

打开控制台

ctrl + alt + c

创建团队

创建团队

页面顶部中间,点击

加入团队后,可以看到团队内成员的数据

对URL手动编码

默认不会自动编码

在URL上,选中需要编码的内容,鼠标右击,选择 EncodeURIComponent 或者 DecodeURIComponent

变量管理

使用 {{username}}

环境管理

添加环境

设置环境变量

选择环境变量

使用数据文件

准备数据文件

JSON 和 CSV 皆可,这里以 JSON 文件为例

[{
		"user_id": 1
	},
	{
		"user_id": 2
	},
	{
		"user_id": 3
	},
	{
		"user_id": 4
	},
	{
		"user_id": 5
	},
	{
		"user_id": 6
	},
	{
		"user_id": 7
	},
	{
		"user_id": 8
	},
	{
		"user_id": 9
	},
	{
		"user_id": 10
	}
]

Body 构造请求参数

Tests 编写请求语句

pm.test("Response has data value",function(){
    var jsonData = pm.response.json();
    pm.expect(jsonData.data.user_id).to.equal(pm.iterationData.get("user_id"));
});

pm.expect(jsonData.data.请求字段名) to.equal(pm.iterationData.get("字段变量名,需要和json文件中保持一致"))

示例如下:

# Body
{
    "type":"1",
    "user_id":{{idid}}
}

# Tests
pm.test("Response has data value",function(){
    var jsonData = pm.response.json();
    pm.expect(jsonData.data.user_id).to.equal(pm.iterationData.get("idid"));
});

# json 文件
[{"idid":1},{"idid":2}]

准备 Run

点击之后出现如下界面,选择你的各种参数和文件

点击运行之后就是下图,我这里显示的都是FAILED,接口请求都是成功了的

附录一:接口主要干嘛了

接口做的事情很简单,就是去数据库查询记录,代码如下

private function type1($data = '') {
    $id = $data['user_id'];
    return User::find($id);
}

附录二:接口请求记录

显示接口都成功请求,并且成功响应了

Chrome network timing 分析

如图所示:

Queueing(队列)

排队的时间花费。可能由于该请求被渲染引擎认为是优先级比较低的资源(图片)、服务器不可用、超过浏览器并发请求的最大连接数(Chrome的最大并发连接数是6)

【资源调度】期间,浏览器有自己的线程限制,所有的请求不可能都能够同时发送,一般chrome的最大并发连接数为6,根据请求顺序,会将所有请求加入队列中,此概念表示在队列所耗费等待的时间。

Stalled(阻塞,卡顿)

Queueing完成后,准备发出请求 ——> 实际发出请求消耗的时间。浏览器准备要发出这个请求,但由于一些情况不能发出请求指令,例如此刻没有可复用的TCP链接,此过程不包括DNS查询、建立TCP连接等时间等。(浏览器对同一个主机域名的并发连接数有限制,因此如果当前的连接数已经超过上限,那么其余请求就会被阻塞,等待新的可用连接;)

Proxy negotiation

与代理服务器连接的时间花费

DNS Lookup(DNS查找)

DNS解析域名消耗的时间。可以借助DNS缓存减少该消耗

Initial connection(初始化连接)

TCP建立连接的三次握手时间

Request sent

发送HTTP请求的时间(从第一个字节发出前到最后一个字节发出后的时间

TTFB(Time To First Byte)

发送请求完毕到接收请求的第一个字节的时间 影响因素:线路、服务器距离、后台服务性能,MySQL查询等

Content Download

资源下载时间 影响因素:资源大小、是否使用缓存

参考链接

  • https://github.com/w3c/web-performance/

ApiPost

预执行脚本

// //生成指定长度的随机数字字符
// function randomString(length) {
//       const str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
//       let result = '';
//       for(let i = 0; i<length; i++)
//       {
//         let id = Math.floor(Math.random() * str.length);
//         result += str[id];
//       }
//       return result;
//   }

// var nonce =  randomString(10);
// var time = Math.round(new Date() / 1000);
// var sign_string = nonce + time +'shuxiaoyuan';
// var sign =  CryptoJS.MD5(sign_string).toString().toUpperCase();

// apt.setRequestHeader("nonce", nonce);
// apt.setRequestHeader("timestamp", time);
// apt.setRequestHeader("sign",sign);

预执行脚本

预执行脚本

// //生成指定长度的随机数字字符
// function randomString(length) {
//       const str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
//       let result = '';
//       for(let i = 0; i<length; i++)
//       {
//         let id = Math.floor(Math.random() * str.length);
//         result += str[id];
//       }
//       return result;
//   }

// var nonce =  randomString(10);
// var time = Math.round(new Date() / 1000);
// var sign_string = nonce + time +'shuxiaoyuan';
// var sign =  CryptoJS.MD5(sign_string).toString().toUpperCase();

// apt.setRequestHeader("nonce", nonce);
// apt.setRequestHeader("timestamp", time);
// apt.setRequestHeader("sign",sign);