Psotman 版本

v7.29.1

Pre-request Script 编写

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//设置当前环境变量
pm.environment.set("key", "value");
//获取当前环境变量
pm.environment.get("key");
//清除当前环境变量
pm.environment.unset("key");
//设置全局环境变量
pm.globals.set("key", "value");
//获取全局环境变量
pm.globals.get("key");
//清除全局环境变量
pm.globals.unset("key");
//在全局和当前环境变量中获取
pm.variables.get("key");
//设置集合
pm.collectionVariables.set("key", ["value1", "value2", "value3"]);
//获取集合
pm.collectionVariables.get("key");
//清除集合
pm.collectionVariables.unset("key");
//遍历集集合,遍历function(遍历当前值,索引,集合,)
pm.collectionVariables.get("key").forEach(function (a, b, c) {
console.log(a);
console.log(b);
console.log(c);
});

GET 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//获取当前请求方式,返回:string
var method = pm.request.method;
//输出当前请求信息,返回:json
var request = pm.request.toJSON();
//输出当前请求url,返回:string
var url = pm.request.url.toString();
//输出当前请求参数,参数(是否编码):true false ,返回:string
var querypararm = pm.request.url.getQueryString(false);
//获取请求参数,参数(请求的键值)(string 类型),返回:string
var value = pm.request.url.query.get("key_name");
//删除请求参数,参数(请求的键值)
pm.request.url.query.remove("key_name");
//添加请求参数,参数(添加请求参数),数组类型
pm.request.url.query.add("key1=value1", "key2=value2");
//判断某个键值是否存在,返回:boolean
var has = pm.request.url.query.has("key");

内置请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//定义请求信息
var requests = {
url: url, //请求url
method: "POST", //请求方式
header: { "Content-Type": "application/json" }, //请求header
body: {
mode: "raw", //数据模型
raw: JSON.stringify({ mobile: raw.mobile, useScene: "login" }), //数据
},
};

//发送请求,参数:请求信息,响应函数(异常,响应数据)
pm.sendRequest(requests, function (err, response) {
var result = response.json();
console.log(result);
});

POST 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//获取所有headers
var header = pm.request.getHeaders();
//移除header
pm.request.removeHeader("key");
//添加header
pm.request.addHeader("key:value");
//获得body中的内容,返回:string
var body = pm.request.body.raw;
//重新设置body内容,参数:string
pm.request.body.update("");
//添加param参数,参数:string或者QueryParam对象
pm.request.addQueryParams("key=value");
//移除para参数,参数:数组字符串
pm.request.removeQueryParams("1", "2");

Cookies

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//创建一个cookie容器
const cookieJar = pm.cookies.jar();

//设置cookie,参数: url,cookieName,cookieValue,回调函数function(异常,设置成功的cookie)
/**
* 如果设置失败,提示如下:Unable to access "xxxx.com" cookie store. Try whitelisting the domain in "Manage Cookies
* 点击界面的 Cookies > Whitelist Domains(左下角) > 在输入框中加入xxxx.com 点击
* add
*/
cookieJar.set("xxxx.com", "name", "value", function (error, cookie) {
console.log(error);
console.log(cookie);
});

//获取cookie,参数: url,cookieName,回调函数function(异常,cookie)
cookieJar.get("xxxx.com", "name", function (error, cookie) {
console.log(error);
console.log(cookie);
});

//获取所有cookie,参数: url,回调函数function(异常,cookie)
cookieJar.getAll("xxxx.com", function (error, cookies) {
console.log(error);
console.log(cookie);
});

//删除cookie,参数: url,cookieName,回调函数function(异常)
cookieJar.unset("xxxx.com", "name", function (error) {
console.log(error);
});

//删除所有cookie,参数: url,回调函数function(异常)
cookieJar.clear("xxxx.com", "name", function (error) {
console.log(error);
});

工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//字符串转json对象
var json = JSON.parse("");

//json对象转字符串
var string = JSON.stringify(obj);

//获取当前时间的时间格式
var time = require("moment")().format("YYYY-MM-DD HH:mm:ss");

//参数编码参数
var encodeURI = encodeURIComponent("");

//编码整个url
var encodeURI = encodeURI("");

//base64编码
var content = CryptoJS.enc.Utf8.parse("1");
var base64Content = CryptoJS.enc.Base64.stringify(content);

//base64解码
var parsedWordArray = CryptoJS.enc.Base64.parse(base64Content);
var wordString = parsedWordArray.toString(CryptoJS.enc.Utf8);

//xml转换json对象,参数:请求响应的xml
var jsonObject = xml2Json(responseBody);

//解析响应的csv
const parse = require("csv-parse/lib/sync");
const responseJson = parse(pm.response.text());

//解析html
const $ = cheerio.load(pm.response.text());
console.log($.html());

//MD5加密
var md5 = CryptoJS.MD5("").toString();

//SHA1加密
var sha1 = CryptoJS.SHA1("").toString();

//AES加密
const keys = CryptoJS.enc.Utf8.parse("123456789"); //秘钥
const ivs = CryptoJS.enc.Utf8.parse("tltlaycvtweasa"); //偏移量
let encryptedWord = CryptoJS.enc.Utf8.parse("1"); //加密内容
var encrypted = CryptoJS.AES.encrypt(encryptedWord, keys, {
iv: ivs,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
}); //加密结果
var ciphertext = encrypted.toString(); //密文

Tests 编写

值获取

1
2
3
4
5
6
7
8
9
10
//请求耗时
var time = pm.response.responseTime;
//获取响应code
var code = pm.response.code;
//获取错误描述:例如返回200,下面返回的是OK
var status = pm.response.status;
//获取响应数据
var data = pm.response.json();
//获取响应header
var header = pm.response.headers.get("key");

模板判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
//断言响应中是否包含指定字符串
pm.test("断言响应体包含指定字符串", function () {
pm.expect(pm.response.text()).to.include("指定字符串");
});

//断言响应是否等于指定字符串
pm.test("断言响应是否等于指定字符串", function () {
pm.response.to.have.body("指定字符串");
});

//断言json值是否等于指定值
pm.test("断言json值是否等于指定值", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});

//断言是否存在Content-Type标头
pm.test("断言是否存在Content-Type标头", function () {
pm.response.to.have.header("Content-Type");
});

//断言cookie是否存在
pm.test("断言cookie是否存在", () => {
pm.expect(pm.cookies.has("JSESSIONID")).to.be.true;
});

//断言cookie是否等于特定值
pm.test("断言cookie是否等于特定值", () => {
pm.expect(pm.cookies.get("JSESSIONID")).to.eql("1");
});

//断言响应时间小于200ms
pm.test("断言响应时间小于200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});

//断言状态码为200
pm.test("断言状态码为200", function () {
pm.response.to.have.status(200);
});

//断言状态响应说明是否包指定值
pm.test("断言状态响应说明是否包指定值", function () {
pm.response.to.have.status("Created");
});

//断言成功响应状态码,oneOf表示在一组值中
pm.test("断言成功响应状态码", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});

//断言环境值和响应回来的值
pm.test("断言环境值和响应回来的值", function () {
pm.expect(pm.response.json().name).to.eql(pm.environment.get("name"));
});

//断言响应数据类型
/* 响应数据结构如下
{
"name": "Jane",
"age": 29,
"hobbies": [
"skating",
"painting"
],
"email": null
}
*/
const jsonData = pm.response.json();
pm.test("Test data type of the response", () => {
pm.expect(jsonData).to.be.an("object"); //是否为对象类型
pm.expect(jsonData.name).to.be.a("string"); //是否为字符串类型
pm.expect(jsonData.age).to.be.a("number"); //是否为数字类型
pm.expect(jsonData.hobbies).to.be.an("array"); //是否为数组
pm.expect(jsonData.website).to.be.undefined; //是否未定义
pm.expect(jsonData.email).to.be.null; //是否为null
});

//断言数组
/* 响应数据结构如下
{
"errors": [],
"areas": [ "goods", "services" ],
"settings": [
{
"type": "notification",
"detail": [ "email", "sms" ]
},
{
"type": "visual",
"detail": [ "light", "large" ]
}
]
}
*/
const jsonData = pm.response.json();
pm.test("Test array properties", () => {
//判断是否为空
pm.expect(jsonData.errors).to.be.empty;
//判断是否包含 "goods"
pm.expect(jsonData.areas).to.include("goods");
//判断 settings 中的object是否有type='notification'
const notificationSettings = jsonData.settings.find(
(m) => m.type === "notification"
);
pm.expect(notificationSettings).to.be.an(
"object",
"Could not find the setting"
);
//判断是否notificationSettings.detail中是否包含"sms"
pm.expect(notificationSettings.detail).to.include("sms");
//判断是否notificationSettings.detail中是否包含如下所有成员
pm.expect(notificationSettings.detail).to.have.members(["email", "sms"]);
});

//断言一个对象包含键或属性
//断言包含所有的key
pm.expect({ a: 1, b: 2 }).to.have.all.keys("a", "b");
//断言包含任何一个成员
pm.expect({ a: 1, b: 2 }).to.have.any.keys("a", "b");
//断言不包含任何一个成员
pm.expect({ a: 1, b: 2 }).to.not.have.any.keys("c", "d");
//断言是否包含a属性
pm.expect({ a: 1 }).to.have.property("a");
//断言值是否为object对象,并且包含所有的key
pm.expect({ a: 1, b: 2 }).to.be.an("object").that.has.all.keys("a", "b");

//TV4校验

//定义校验模型,要求值为boolean类型
var schema = {
items: {
type: "boolean",
},
};
//定义测试数据
//满足要求
var data1 = [true, false];
//不满足要求
var data2 = [true, 123];
//校验TV4模型
pm.test("校验TV4模型", function () {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;
});

//JSON模型校验

//构建Ajv
var Ajv = require("ajv");
//初始化
var ajv = new Ajv({ logger: console });
//定义规则
var schema = {
properties: {
alpha: {
type: "boolean",
},
},
};
//定义测试数据
//符合规则
var test1 = { alpha: true };
//不符合规则
var test2 = { alpha: 123 };
//校验
pm.test("JSON模型校验", function () {
pm.expect(ajv.validate(schema, test1)).to.be.true;
pm.expect(ajv.validate(schema, test2)).to.be.false;
});

//将请求结果可视化
//数据样例
/**
[
{
"name": "Alice",
"email": "alice@example.com"
},
{
"name": "Jack",
"email": "jack@example.com"
},
// ... and so on
]
*/
//数据模板
var template = `
<table bgcolor="#FFFFFF">
<tr>
<th>Name</th>
<th>Email</th>
</tr>

{{#each response}}
<tr>
<td>{{name}}</td>
<td>{{email}}</td>
</tr>
{{/each}}
</table>
`;
//填充数据模板
pm.visualizer.set(template, {
response: pm.response.json(),
});

动态变量

获取方式

1
2
//动态变量获取
pm.variables.replaceIn("{{$randomFirstName}}");

值列表

变量名描述例子
$guid一个 uuid-v4 风格 GUID“611c2e81-2ccb-42d8-9ddc-2d0bfa65c1b4”
$timestamp当前 UNIX 时间戳(以秒为单位)1562757107
$isoTimestamp当前 ISO 时间戳(UTC 为零)2020-06-09T21:10:36.177Z
$randomUUID随机的 36 个字符的 UUID“6929bb52-3ab2-448a-9796-d6480ecad36b”
$randomAlphaNumeric随机字母数字字符6,”y”,”z”
$randomBoolean随机布尔值(真/假)true,false,false,true
$randomInt1 至 1000 之间的随机整数802,494,200
$randomColor随机颜色“red”,”fuchsia”,”grey”
$randomHexColor随机十六进制值“#47594a”,”#431e48”,”#106f21”
$randomAbbreviation随机缩写SQL,PCI,JSON
$randomIP随机的 IPv4 地址241.102.234.100, 216.7.27.38
$randomIPV6随机的 IPv6 地址dbe2:7ae6:119b:c161:1560:6dda:3a9b:90a9
$randomMACAddress随机 MAC 地址33:d4:68:5f:b4:c7, 1f:6e:db:3d:ed:fa
$randomPassword随机的 15 个字符的字母数字密码t9iXe7COoDKv8k3, QAzNFQtvR9cg2rq
$randomLocale随机的两个字母的语言代码(ISO 639-1)“ny”,”sr”,”si”
$randomUserAgent随机用户代理Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.9.8; rv:15.6) Gecko/20100101 Firefox/15.6.6 Opera/10.27 (Windows NT 5.3; U; AB Presto/2.9.177 Version/10.00)
$randomProtocol随机互联网协议“http”, “https”
$randomSemver随机语义版本号7.0.5,2.5.8,6.4.9
$randomFirstName随机名字Ethan,Chandler,Megane
$randomLastName随机姓氏Schaden,Schneider,Willms
$randomFullName随机的名字和姓氏Connie Runolfsdottir,Sylvan Fay,Jonathon Kunze
$randomNamePrefix随机名称前缀Dr.,Ms.,Mr.
$randomNameSuffix随机名称后缀I,MD,DDS
$randomCountryCode随机的 2 个字母的国家/地区代码(ISO 3166-1)CV,MD,TD
$randomLatitude随机纬度坐标55.2099,27.3644,-84.7514
$randomLongitude随机经度坐标40.6609,171.7139,-159.9757
$randomImage随机图像http://lorempixel.com/640/480/technics
$randomAvatarImage随机头像https://s3.amazonaws.com/uifaces/faces/twitter/johnsmithagency/128.jpg
$randomImageUrl随机图片的网址http://lorempixel.com/640/480
$randomAbstractImage随机抽象图片的网址http://lorempixel.com/640/480/abstract
$randomAnimalsImage随机动物图片的网址http://lorempixel.com/640/480/animals
$randomBusinessImage随机库存企业图片的网址http://lorempixel.com/640/480/business
$randomCatsImage随机猫图像的 URLhttp://lorempixel.com/640/480/cats
$randomCityImage随机城市图片的网址http://lorempixel.com/640/480/city
$randomFoodImage随机食物图片的网址http://lorempixel.com/640/480/food
$randomNightlifeImage随机夜生活图片的网址http://lorempixel.com/640/480/nightlife
$randomFashionImage随机时尚图片的网址http://lorempixel.com/640/480/fashion
$randomPeopleImage一个人的随机图像的 URLhttp://lorempixel.com/640/480/people
$randomNatureImag随机自然图像的 URLhttp://lorempixel.com/640/480/nature
$randomSportsImage随机运动图像的 URLhttp://lorempixel.com/640/480/sports
$randomTechnicsImage随机技术图片的网址http://lorempixel.com/640/480/technics
$randomTransportImage随机交通图片的网址http://lorempixel.com/640/480/transport
$randomImageDataUri随机图像数据 URIdata:image/svg+xml;charset=UTF-8,%3Csvg+xmlns%3D%22http%3A%2F%2Fwww……
$randomCurrencyCode随机的 3 个字母的货币代码(ISO-4217)CDF,ZMK,GNF
$randomBitcoin随机比特币地址3VB8JGT7Y4Z63U68KGGKDXMLLH5
$randomCompanyName随机公司名称Johns - Kassulke, Grady LLC
$randomBsNouninterfaces
$randomDatabaseType随机数据库类型tinyint, text
$randomDatabaseColumn随机数据库列名称updatedAt,token,group
$randomDatabaseCollation随机数据库排序cp1250_bin,utf8_general_ci,cp1250_general_ci
$randomDatabaseEngine随机数据库引擎MyISAM,InnoDB,Memory
$randomDateFuture未来的随机日期时间Tue Mar 17 2020 13:11:50 GMT+0530 (India Standard Time)
$randomDatePast随机过去的日期时间Sat Mar 02 2019 09:09:26 GMT+0530 (India Standard Time)
$randomDateRecent最近的随机日期时间Tue Jul 09 2019 23:12:37 GMT+0530 (India Standard Time)
$randomWeekday随机工作日Thursday,Friday,Monday
$randomMonth随机月份February,May,January
$randomDomainName随机域名gracie.biz,armando.biz,trevor.info
$randomDomainSuffix随机域后缀org,net,com
$randomDomainWord随机的不合格域名gwen,jaden,donnell
$randomEmail随机电子邮件地址Pablo62@gmail.com,Ruthe42@hotmail.com,Iva.Kovacek61@hotmail.com
$randomExampleEmail来自“示例”域的随机电子邮件地址Talon28@example.com,Quinten_Kerluke45@example.net,Casey81@example.net
$randomUserName随机用户名Jarrell.Gutkowski,Lottie.Smitham24,Alia99
$randomUrl随机网址https://anais.net,https://tristin.net,http://jakob.name
$randomFileName随机文件名(包括不常见的扩展名)neural_sri_lanka_rupee_gloves.gdoc
$randomFileType随机文件类型(包括不常见的文件类型)model,application,video
$randomFileExt随机文件扩展名(包括不常见的扩展名)war,book,fsc
$randomCommonFileName随机文件名well_modulated.mpg4
$randomCommonFileType随机的常见文件类型application, audio
$randomCommonFileExt随机的通用文件扩展名m2v,wav,png
$randomFilePath随机文件路径/home/programming_chicken.cpio
$randomDirectoryPath随机目录路径/usr/bin,/root,/usr/local/bin
$randomMimeType随机 MIME 类型audio/vnd.vmx.cvsd