runner-runtime 1.0.59 → 1.0.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/events/api.js CHANGED
@@ -2024,16 +2024,20 @@ const initRequestJson = (event, option) => {
2024
2024
  _.unset(cookieArr);
2025
2025
 
2026
2026
  // 前置URL
2027
- if (!_.isString(envServerID)) {
2027
+ if (!_.isString(envServerID) || _.toString(envServerID) === "0") {
2028
2028
  envServerID = "1";
2029
2029
  }
2030
2030
 
2031
2031
  const requestUrl = _.isString(_.get(requestJson, 'url')) ? _.get(requestJson, 'url') : _.get(requestJson, 'request.url');
2032
2032
  const { globals, env } = option;
2033
2033
 
2034
- let envPreUrl = _.trim(_.get(_.find(_.get(option, `env.env_pre_urls`), (server) => {
2035
- return server?.server_id == envServerID;
2036
- }), 'uri'));
2034
+ // 获取前置url
2035
+ let envPreUrl = _.trim(_.get(requestJson, 'pre_url', ''));
2036
+ if (envPreUrl != '') {
2037
+ envPreUrl = _.trim(_.get(_.find(_.get(option, `env.env_pre_urls`), (server) => {
2038
+ return server?.server_id == envServerID;
2039
+ }), 'uri'));
2040
+ }
2037
2041
 
2038
2042
  if (envPreUrl != '') {
2039
2043
  if (option?.env?.env_id == '2' && !_.endsWith(envPreUrl, '/')) {
@@ -2159,9 +2163,28 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2159
2163
  error_type: scriptType,
2160
2164
  message: err?.message
2161
2165
  })
2166
+
2167
+ if (_.includes(['prerequest', 'test'], scriptType)) {
2168
+ if (_.isUndefined(_.get(eventRuntimeData, [event?.event_id, "console"]))) {
2169
+ _.set(eventRuntimeData, [event?.event_id, "console"], []);
2170
+ }
2171
+
2172
+ const time = Date.now()
2173
+ eventRuntimeData[event?.event_id].console.push(
2174
+ {
2175
+ time,
2176
+ "level": "error",
2177
+ "args": [String(err)]
2178
+ }
2179
+ )
2180
+ }
2181
+
2162
2182
  if (scriptType === 'prerequest') {
2163
2183
  try {
2164
2184
  run.abort();
2185
+ if (_.isUndefined(_.get(eventRuntimeData, [event?.event_id, "request"]))) {
2186
+ _.set(eventRuntimeData, [event?.event_id, "request"], _.pick(requestJson, ['name', 'method', 'url']));
2187
+ }
2165
2188
  } catch (e) { }
2166
2189
  }
2167
2190
  }
@@ -2235,7 +2258,7 @@ module.exports = (event, option, callback, eventRuntimeData, eventResultList) =>
2235
2258
  })
2236
2259
  }
2237
2260
  }
2238
-
2261
+
2239
2262
  const requestOptions = convert2EchoRequest(request, requestJson, postmanJSON, history);
2240
2263
  _.set(eventRuntimeData, [event?.event_id, "request"], requestOptions);
2241
2264
 
package/events/index.js CHANGED
@@ -3,7 +3,7 @@ const atomicSleep = require("atomic-sleep"),
3
3
  aTools = require("apipost-tools"),
4
4
  JSON5 = require('json5'),
5
5
  _ = require('lodash'),
6
- { returnBoolean, variableReplaceForCondition, variableReplace, convertEndRuntimeState, repeatArrayToLength } = require('../libs/utils');
6
+ { returnBoolean, variableReplaceForCondition, variableReplace,getVariableActedUpon, convertEndRuntimeState, repeatArrayToLength } = require('../libs/utils');
7
7
  const executeApi = require('./api'),
8
8
  executeWait = require('./wait');
9
9
 
@@ -26,16 +26,6 @@ const events = {
26
26
  const exp = variableReplaceForCondition(data?.var, eventRuntimeData?.variables, option),
27
27
  compare = data?.compare, value = variableReplaceForCondition(data?.value, eventRuntimeData?.variables, option);
28
28
  const isMatched = returnBoolean(exp, compare, value);
29
-
30
- if (isMatched && _.isArray(finalChildren) && !_.isEmpty(finalChildren)) {
31
- const { iterationData } = option, iterationDataArr = [iterationData];
32
-
33
- // if (!_.isEmpty(iterationData) && _.isObject(iterationData)) {
34
- // iterationDataArr = _.flatMap([iterationData], (element) => _.times(_.size(finalChildren), () => element));
35
- // }
36
- await iterationEvent(finalChildren, _.assign(_.cloneDeep(option), { iterationDataArr }), callback, eventRuntimeData, eventResultList)
37
- }
38
-
39
29
  const runtimeState = convertEndRuntimeState(eventRuntimeData, event?.event_id) || {}
40
30
  const finalIfData = {
41
31
  action: 'request',
@@ -46,12 +36,14 @@ const events = {
46
36
  condition: {
47
37
  leftValue: {
48
38
  variable: data?.var,
49
- value: exp
39
+ value: exp,
40
+ actedUpon: getVariableActedUpon(eventRuntimeData, _.trim(data?.var, "{}")) || 'Fixed'
50
41
  },
51
42
  compare,
52
43
  rightValue: {
53
44
  variable: data?.value,
54
- value: value
45
+ value: value,
46
+ actedUpon: getVariableActedUpon(eventRuntimeData, _.trim(data?.value, "{}")) || 'Fixed'
55
47
  }
56
48
  }
57
49
  }
@@ -64,6 +56,16 @@ const events = {
64
56
 
65
57
  eventResultList.push(finalIfData?.data)
66
58
  callback(finalIfData);
59
+
60
+ if (isMatched && _.isArray(finalChildren) && !_.isEmpty(finalChildren)) {
61
+ const { iterationData } = option, iterationDataArr = [iterationData];
62
+
63
+ // if (!_.isEmpty(iterationData) && _.isObject(iterationData)) {
64
+ // iterationDataArr = _.flatMap([iterationData], (element) => _.times(_.size(finalChildren), () => element));
65
+ // }
66
+ await iterationEvent(finalChildren, _.assign(_.cloneDeep(option), { iterationDataArr }), callback, eventRuntimeData, eventResultList)
67
+ }
68
+
67
69
  } catch (e) {
68
70
  throw ({
69
71
  action: 'systemError',
@@ -147,17 +149,18 @@ const events = {
147
149
  };
148
150
  const dataSourceType = _.toInteger(_.get(data, 'loop_extract.var'));
149
151
  const responseData = _.get(eventRuntimeData, `${previousEventId}.${dataTypeMap[dataSourceType] || "response.body"}`);
150
-
151
152
  const dataJsonPath = _.trim(String(_.get(data, 'loop_extract.value', '$')));
152
153
 
154
+ // 获取前置接口的数据
155
+ let preRequestData = undefined;
153
156
  switch (dataSourceType) {
154
157
  case 1:
155
158
  case 8:
156
159
  try {
157
160
  if (_.isString(responseData)) {
158
- _.assign(iterationData, _.values(jsonpath.value(JSON5.parse(responseData), dataJsonPath)));
161
+ preRequestData = jsonpath.value(JSON5.parse(responseData), dataJsonPath);
159
162
  } else {
160
- _.assign(iterationData, _.values(jsonpath.value(responseData, dataJsonPath)));
163
+ preRequestData = jsonpath.value(responseData, dataJsonPath);
161
164
  }
162
165
  } catch (e) { }
163
166
  break;
@@ -166,14 +169,56 @@ const events = {
166
169
  case 7:
167
170
  case 9:
168
171
  case 10:
169
- _.assign(iterationData, _.values(_.get(responseData, dataJsonPath)));
172
+ preRequestData = _.get(responseData, dataJsonPath);
170
173
  break;
171
174
  case 4:
172
175
  case 5:
173
176
  case 6:
174
- _.assign(iterationData, _.values(responseData));
177
+ preRequestData = _.cloneDeep(responseData);
175
178
  break;
176
179
  }
180
+
181
+ if (_.isString(preRequestData)) {
182
+ try {
183
+ preRequestData = JSON5.parse(preRequestData)
184
+ } catch (e) { }
185
+ }
186
+
187
+ if (_.isNumber(preRequestData)) {
188
+ preRequestData = String(preRequestData);
189
+ }
190
+
191
+ let loopVariableArr = [];
192
+
193
+ if (_.isArray(preRequestData)) {
194
+ loopVariableArr = _.map(preRequestData, (arr) => {
195
+ if (_.isObject(arr)) {
196
+ return _.pickBy(arr, (o) => {
197
+ return !_.isObject(o)
198
+ })
199
+ } else {
200
+ return {
201
+ "0": arr
202
+ }
203
+ }
204
+ })
205
+ } else if (_.isObject(preRequestData)) {
206
+ _.forEach(preRequestData, (val, key) => {
207
+ if (!_.isObject(val)) {
208
+ const tempObj = {};
209
+ _.set(tempObj, key, val);
210
+ loopVariableArr.push(tempObj)
211
+ }
212
+ })
213
+ } else if (_.isString(preRequestData)) {
214
+ loopVariableArr = _.map(_.values(preRequestData), (val, key) => {
215
+ const tempObj = {};
216
+ tempObj[String(key)] = val;
217
+ return tempObj;
218
+ })
219
+ }
220
+
221
+ _.assign(iterationData, loopVariableArr);
177
222
  }
178
223
 
179
224
  break;
@@ -181,26 +226,44 @@ const events = {
181
226
  {
182
227
  let loopVariable = variableReplace(_.get(data, 'loop_variable', ''), eventRuntimeData?.variables, option);
183
228
 
184
- let loopVariableArr = [];
185
-
186
- if (_.isObject(loopVariable)) {
187
- loopVariable = _.values(loopVariable);
188
- } else {
229
+ if (_.isString(loopVariable)) {
189
230
  try {
190
- loopVariable = JSON5.parse(loopVariable);
231
+ loopVariable = JSON5.parse(loopVariable)
191
232
  } catch (e) { }
192
233
  }
193
234
 
194
- _.forEach(loopVariable, (val, key) => {
195
- if (!_.isObject(val)) {
196
- loopVariableArr.push(
197
- {
198
- "$key": key,
199
- "$item": val
235
+ if (_.isNumber(loopVariable)) {
236
+ loopVariable = String(loopVariable);
237
+ }
238
+
239
+ let loopVariableArr = [];
240
+ if (_.isArray(loopVariable)) {
241
+ loopVariableArr = _.map(loopVariable, (arr) => {
242
+ if (_.isObject(arr)) {
243
+ return _.pickBy(arr, (o) => {
244
+ return !_.isObject(o)
245
+ })
246
+ } else {
247
+ return {
248
+ "0": arr
200
249
  }
201
- )
202
- }
203
- })
250
+ }
251
+ })
252
+ } else if (_.isObject(loopVariable)) {
253
+ _.forEach(loopVariable, (val, key) => {
254
+ if (!_.isObject(val)) {
255
+ const tempObj = {};
256
+ _.set(tempObj, key, val);
257
+ loopVariableArr.push(tempObj)
258
+ }
259
+ })
260
+ } else if (_.isString(loopVariable)) {
261
+ loopVariableArr = _.map(_.values(loopVariable), (val, key) => {
262
+ const tempObj = {};
263
+ tempObj[String(key)] = val;
264
+ return tempObj;
265
+ })
266
+ }
204
267
 
205
268
  _.assign(iterationData, loopVariableArr);
206
269
  }
package/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  const { repeatArrayToLength, formatAutotestReport, formatAutotestReportList } = require('./libs/utils');
2
2
  const _ = require('lodash');
3
- const moment = require('moment');
4
3
  const aTools = require("apipost-tools");
5
4
  const { executeEvent, iterationEvent } = require('./events');
6
5
  const ABORT_RECURSION_ERROR = ['systemError']; //需要跳出递归的错误
@@ -42,7 +41,7 @@ const run = async (events, option, callback) => {
42
41
  }
43
42
  })
44
43
  })
45
-
44
+
46
45
  const eventResultList = [];
47
46
  const startTimeAt = Date.now();
48
47
 
@@ -93,7 +92,7 @@ const run = async (events, option, callback) => {
93
92
  },
94
93
  _.pick(_.get(option, 'env', {}), ['env_id', 'env_name']),
95
94
  { testing_id: _.get(_.first(eventResultList), 'test_id') },
96
- { report_name: `${moment().format('YYYY-MM-DD HH:mm:ss')}` },
95
+ { report_name: `${option?.name}` },
97
96
  { report_id: aTools.snowflakeId() }
98
97
  )
99
98
  })
package/libs/utils.js CHANGED
@@ -292,7 +292,7 @@ const returnBoolean = (exp, compare, value) => {
292
292
  const getCaseInsensitive = (object, keyToFind) => {
293
293
  try {
294
294
  // 先将要查找的键转换成小写
295
- const lowerKey = keyToFind.toLowerCase();
295
+ const lowerKey = _.toLower(keyToFind);
296
296
 
297
297
  if (!_.isObject(object)) {
298
298
  return undefined;
@@ -300,7 +300,7 @@ const getCaseInsensitive = (object, keyToFind) => {
300
300
 
301
301
  // 在对象的所有键中查找
302
302
  for (const key in object) {
303
- if (key.toLowerCase() === lowerKey) {
303
+ if (_.toLower(key) === lowerKey) {
304
304
  return object[key];
305
305
  }
306
306
  }
@@ -430,19 +430,19 @@ const formatAutotestReport = (startTimeAt, eventResultList) => {
430
430
  totalResponseSize = totalResponseSize + _.toInteger(item?.response?.response_size);
431
431
  totalResponseTime = totalResponseTime + _.toInteger(item?.response?.response_time);
432
432
 
433
- if (!_.isEmpty(item?.status?.assert) && _.isArray(item?.status?.assert)) {
434
- const assertFailure = _.map(item?.status?.assert, (assertItem) => {
435
- return assertItem?.passed === false
436
- })
437
-
438
- report.assert.total = report.assert.total + _.size(item?.status?.assert);
439
- report.assert.error = report.assert.error + _.size(assertFailure);
440
- }
441
-
442
433
  if (_.toLower(item?.status?.http) != 'ok') {
443
434
  report.http.error++;
444
435
  }
445
436
  }
437
+
438
+ if (_.includes(['api', 'sample', 'assert', 'assert_visual'], item?.type) && !_.isEmpty(item?.status?.assert) && _.isArray(item?.status?.assert)) {
439
+ const assertFailure = _.map(item?.status?.assert, (assertItem) => {
440
+ return assertItem?.passed === false
441
+ })
442
+
443
+ report.assert.total = report.assert.total + _.size(item?.status?.assert);
444
+ report.assert.error = report.assert.error + _.size(assertFailure);
445
+ }
446
446
  })
447
447
 
448
448
  report.http.success = report.http.total - report.http.error;
@@ -506,6 +506,18 @@ const jsfGenerate = (schema, mockRules = [], lang) => {
506
506
  }
507
507
  }
508
508
 
509
+ const getVariableActedUpon = (eventRuntimeData, varName) => {
510
+ let actedUpon = undefined;
511
+ ["variables", "iterationData", "environment", "globals"].some((type) => {
512
+ if (_.includes(_.keys(_.get(eventRuntimeData, `variables.${type}`)), varName)) {
513
+ actedUpon = type;
514
+ return true;
515
+ }
516
+ })
517
+
518
+ return actedUpon;
519
+ }
520
+
509
521
  const convertEndRuntimeState = (eventRuntimeData, event_id) => {
510
522
  try {
511
523
  const { startTime, startVariables } = _.get(eventRuntimeData, [event_id, 'iteration'], {});
@@ -532,7 +544,7 @@ const convertEndRuntimeState = (eventRuntimeData, event_id) => {
532
544
  }
533
545
  _.set(startAllActedUponVars, [key, 'actedUpon'], startActedUpon);
534
546
  })
535
-
547
+
536
548
  // 当前变量
537
549
  const { environment = {}, variables = {}, _globals = {}, iterationData = {} } = _.get(eventRuntimeData, 'variables', {});
538
550
  const endVariables = { environment, variables, iterationData, globals: _globals };
@@ -579,6 +591,7 @@ module.exports = {
579
591
  getCaseInsensitive,
580
592
  camelCaseToSnakeCase,
581
593
  formatAutotestReportList,
594
+ getVariableActedUpon,
582
595
  variableReplace,
583
596
  // createPipeServer,
584
597
  formatAutotestReport,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runner-runtime",
3
- "version": "1.0.59",
3
+ "version": "1.0.62",
4
4
  "description": "runner-runtime.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -29,18 +29,17 @@
29
29
  "is-image": "^3.0.0",
30
30
  "is-svg": "^4.3.2",
31
31
  "json-bigint": "^1.0.0",
32
- "json-schema-faker-pro": "^0.5.19",
32
+ "json-schema-faker-pro": "^0.5.22",
33
33
  "json5": "^2.2.3",
34
34
  "jsonpath": "^1.1.1",
35
35
  "lodash": "^4.17.21",
36
36
  "mime": "^3.0.0",
37
37
  "minimatch": "^9.0.4",
38
38
  "mockjs5-pro": "^1.0.3",
39
- "moment": "^2.30.1",
40
39
  "msgpack5": "^6.0.2",
41
40
  "net": "^1.0.2",
42
41
  "postman-collection": "^5.0.2",
43
- "postman-runtime-pro": "^7.43.15",
42
+ "postman-runtime-pro": "^7.43.16",
44
43
  "request-har": "^1.0.0",
45
44
  "strip-json-comments": "^3.1.1",
46
45
  "tough": "^0.6.0",
package/tmp/request.js CHANGED
@@ -68,11 +68,17 @@ module.exports = {
68
68
  "name": "默认服务",
69
69
  "sort": 1000,
70
70
  "uri": ""
71
+ },
72
+ "44e76996a401000": {
73
+ "server_id": "44e76996a401000",
74
+ "name": "222",
75
+ "sort": 2000,
76
+ "uri": ""
71
77
  }
72
78
  },
73
79
  "environment": {
74
- "code": 201,
75
- "key": "value"
80
+ "code": "0",
81
+ "key": 1
76
82
  }
77
83
  },
78
84
  "cookies": {
@@ -86,10 +92,10 @@ module.exports = {
86
92
  "path": "/",
87
93
  "secure": true,
88
94
  "httpOnly": true,
89
- "creation": "2025-04-23T18:21:01.716Z",
95
+ "creation": "2025-04-24T21:16:40.033Z",
90
96
  "name": "liveCookie",
91
- "cookie_id": "cfbb441f1704b",
92
- "expires": "Wed, 23 Apr 2025 18:23:04 GMT",
97
+ "cookie_id": "e70e48b7d6003",
98
+ "expires": "Thu, 24 Apr 2025 21:18:40 GMT",
93
99
  "project_id": "2adc267c9064000"
94
100
  },
95
101
  {
@@ -100,10 +106,10 @@ module.exports = {
100
106
  "path": "/",
101
107
  "secure": true,
102
108
  "httpOnly": true,
103
- "creation": "2025-04-23T18:21:01.716Z",
109
+ "creation": "2025-04-24T21:16:40.033Z",
104
110
  "name": "loseCookie",
105
- "cookie_id": "cfbb441f1704c",
106
- "expires": "Wed, 23 Apr 2025 18:21:04 GMT",
111
+ "cookie_id": "e70e48b7d6004",
112
+ "expires": "Thu, 24 Apr 2025 21:16:40 GMT",
107
113
  "project_id": "2adc267c9064000"
108
114
  }
109
115
  ]
@@ -138,6 +144,11 @@ module.exports = {
138
144
  },
139
145
  "client_cert": {
140
146
  "https://*:443": {
147
+ "pfx": {
148
+ "file_base64": "",
149
+ "file_name": "",
150
+ "file_url": ""
151
+ },
141
152
  "crt": {
142
153
  "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuVENDQW9VQ0ZFcDd4Z3J2VVhteWEzTEdmcEFpenRNUkJvN3ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0sKTVFzd0NRWURWUVFHRXdKRFRqRVFNQTRHQTFVRUNBd0hRbVZwYW1sdVp6RVFNQTRHQTFVRUJ3d0hRbVZwYW1sdQpaekVRTUE0R0ExVUVDZ3dIWVhCcGNHOXpkREVNTUFvR0ExVUVDd3dEWVhCME1SWXdGQVlEVlFRRERBMWpZeTVoCmNHbHdiM04wTG1Oak1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFpHMXBia0JoY0dsd2IzTjBMbU5qTUI0WERUSXoKTVRJeE1UQTVOREl4TmxvWERUTXpNVEl3T0RBNU5ESXhObG93Z1lveEN6QUpCZ05WQkFZVEFrTk9NUkF3RGdZRApWUVFJREFkQ1pXbHFhVzVuTVJBd0RnWURWUVFIREFkQ1pXbHFhVzVuTVE4d0RRWURWUVFLREFaaGNHbHZjM1F4CkREQUtCZ05WQkFzTUEyRndkREVXTUJRR0ExVUVBd3dOWTJNdVlYQnBjRzl6ZEM1all6RWdNQjRHQ1NxR1NJYjMKRFFFSkFSWVJZMnhwWlc1MFFHRndhWEJ2YzNRdVkyTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRG5DalNwV2MvVEovcXg2ZHRCRUlKeHhpME0wTWc1M091U0lNK2dMVnNseTl4SVFTTndGWGhrCi8vRzhTOVl0d2lnMHpwZVNLUlhyNi9tdklQcjlsY3RBakRrZzQ4Q1BQSk5YYVo1RTdQVkRYbThtTXhhS2RBeXEKZVBkT2w2bGJ0a0pWRTB0cElWTFo4UkhEOWU4VFdiNENMNFBUSzkrNFhVSElEUU1FTUdNbWFnRUVRd3ordDdSTQpMZDVvcVAxdHVUdlhBbmlUbmU4TnZhYVQ3NDlqcFhYb3lnV29FaVcwOGJ3NmI2TmZwVVEyeFBsSkdrc2tiblRhCisyTWVqb1ZrSlpDbDFlOUhOYXV2a085WjhQamRYMG9nZTM0OE5pZW83amNDWWhBUmttanVJanhiMU1kU3dPdjcKMTVWS3EwcFFwbjNzVHJrWTVqdjZEeis3dWhSaXVnN2pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRGFCdG10NHVPaVpoVlpHdmo1Tko2RUhUUFNGZGxBaVd6U2tiSWllV2RIY1NhK0J3K2xBM1kyalJsYnZNUVVaCndiL21jaFRtNjFJRmlKbnYvN1h2MGtmMkJxUzkyMURXenJHa3FWQk5zRUdIMEdhWGVHMVMwL1pkNXg1RE4zMlEKRW9IRE95K2lOeDlwRzA2cy8ybUlGY1E3eXQ0cW9acXFQZUg4U3VIamZOanlnZnZFUGxiYUJHb0Y4V1dneFluLwp3TzlFK2pYN3VvdlZDWXVrY3NyaEprZzJwK3o5MUFVU3p2NlpTbHlnK3pGM2kyM1Q0ZXA5VDhwRTV2eXE3UlFnClNPT3BQd25uN0d5UWd2UzREbU5LMHkyazc5ZUdGb3VnTWxnS3g1Um5nMUQxNEd0ZFcvMlE0WGxNa2tHZ1ZsR2IKRVRkcGlES1JKWjNTTDJPZ1RsSFpibWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
143
154
  "file_name": "client (1).crt",
@@ -149,19 +160,9 @@ module.exports = {
149
160
  "file_url": ""
150
161
  },
151
162
  "password": "",
152
- "pfx": {
153
- "file_base64": "",
154
- "file_name": "",
155
- "file_url": ""
156
- },
157
163
  "HOST": "https://*:443"
158
164
  },
159
165
  "https://apipost.cn:443": {
160
- "crt": {
161
- "file_url": "",
162
- "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuVENDQW9VQ0ZFcDd4Z3J2VVhteWEzTEdmcEFpenRNUkJvN3ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0sKTVFzd0NRWURWUVFHRXdKRFRqRVFNQTRHQTFVRUNBd0hRbVZwYW1sdVp6RVFNQTRHQTFVRUJ3d0hRbVZwYW1sdQpaekVRTUE0R0ExVUVDZ3dIWVhCcGNHOXpkREVNTUFvR0ExVUVDd3dEWVhCME1SWXdGQVlEVlFRRERBMWpZeTVoCmNHbHdiM04wTG1Oak1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFpHMXBia0JoY0dsd2IzTjBMbU5qTUI0WERUSXoKTVRJeE1UQTVOREl4TmxvWERUTXpNVEl3T0RBNU5ESXhObG93Z1lveEN6QUpCZ05WQkFZVEFrTk9NUkF3RGdZRApWUVFJREFkQ1pXbHFhVzVuTVJBd0RnWURWUVFIREFkQ1pXbHFhVzVuTVE4d0RRWURWUVFLREFaaGNHbHZjM1F4CkREQUtCZ05WQkFzTUEyRndkREVXTUJRR0ExVUVBd3dOWTJNdVlYQnBjRzl6ZEM1all6RWdNQjRHQ1NxR1NJYjMKRFFFSkFSWVJZMnhwWlc1MFFHRndhWEJ2YzNRdVkyTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRG5DalNwV2MvVEovcXg2ZHRCRUlKeHhpME0wTWc1M091U0lNK2dMVnNseTl4SVFTTndGWGhrCi8vRzhTOVl0d2lnMHpwZVNLUlhyNi9tdklQcjlsY3RBakRrZzQ4Q1BQSk5YYVo1RTdQVkRYbThtTXhhS2RBeXEKZVBkT2w2bGJ0a0pWRTB0cElWTFo4UkhEOWU4VFdiNENMNFBUSzkrNFhVSElEUU1FTUdNbWFnRUVRd3ordDdSTQpMZDVvcVAxdHVUdlhBbmlUbmU4TnZhYVQ3NDlqcFhYb3lnV29FaVcwOGJ3NmI2TmZwVVEyeFBsSkdrc2tiblRhCisyTWVqb1ZrSlpDbDFlOUhOYXV2a085WjhQamRYMG9nZTM0OE5pZW83amNDWWhBUmttanVJanhiMU1kU3dPdjcKMTVWS3EwcFFwbjNzVHJrWTVqdjZEeis3dWhSaXVnN2pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRGFCdG10NHVPaVpoVlpHdmo1Tko2RUhUUFNGZGxBaVd6U2tiSWllV2RIY1NhK0J3K2xBM1kyalJsYnZNUVVaCndiL21jaFRtNjFJRmlKbnYvN1h2MGtmMkJxUzkyMURXenJHa3FWQk5zRUdIMEdhWGVHMVMwL1pkNXg1RE4zMlEKRW9IRE95K2lOeDlwRzA2cy8ybUlGY1E3eXQ0cW9acXFQZUg4U3VIamZOanlnZnZFUGxiYUJHb0Y4V1dneFluLwp3TzlFK2pYN3VvdlZDWXVrY3NyaEprZzJwK3o5MUFVU3p2NlpTbHlnK3pGM2kyM1Q0ZXA5VDhwRTV2eXE3UlFnClNPT3BQd25uN0d5UWd2UzREbU5LMHkyazc5ZUdGb3VnTWxnS3g1Um5nMUQxNEd0ZFcvMlE0WGxNa2tHZ1ZsR2IKRVRkcGlES1JKWjNTTDJPZ1RsSFpibWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
163
- "file_name": "client (1).crt"
164
- },
165
166
  "key": {
166
167
  "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lKQU9ueUNxV09FeCtsTUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BUYjIxbExWTjBZWFJsTVNFd0h3WURWUVFLRXhoSmJuUmxjbTVsZENCWAphV1JuYVhSeklGQjBlU0JNZEdRd0hoY05NVFV3TnpFek1UUTFNRE16V2hjTk1UVXdPREV5TVRRMU1ETXpXakJGCk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQk1LVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTAKWlhKdVpYUWdWMmxrWjJsMGN5QlFkSGtnVEhSa01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQTB1cVdPWUF1ZmgxSHZkNUw0WE8zUEZOZituZE8vVGczUGJEcWl4UTZEYUpqcUw2ZWh6eFJYeHJyCmR6U0N6RlN2b2FPRzFNaUpyazlIdUYvYUVyZ0ExdHFnb0crSmx1VVlKOG9VNzRtVFk3Zmt3dHhPUnpoT2JkSmoKbFoxNm5jNGVEaXBjVWtjUFluY0tQSGxsbnR1MXVDSUNNMkl5TmprcUFNd3lPSERrTGNFY0VyQ1F3YVdlSi80VgpGS3NVdndwbTR0cmRwWVcrelUwWkhUdWtuWkhybERrY1l2ZlE2VSt5bjI3ZEZBUWRwb3A5Q0FyNjdsL2Ftd01RCm9ZT1hqVGx6bWFZOURvRHRVazlCY0tGSUhhVDQwbGJFSDV2OTlXeDNaNE1MQ2JhNHRuQ2oyRTFzZ2UrUWFWcEEKck1aazNDTjN0amM5VUlWa2JGdUZmeUNaK1owSlpRSURBUUFCbzRHbk1JR2tNQjBHQTFVZERnUVdCQlNzandwVAp6Q2YzOGhUQmNsRFNvWEFNSkp6Q1NEQjFCZ05WSFNNRWJqQnNnQlNzandwVHpDZjM4aFRCY2xEU29YQU1KSnpDClNLRkpwRWN3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbE52YldVdFUzUmhkR1V4SVRBZkJnTlYKQkFvVEdFbHVkR1Z5Ym1WMElGZHBaR2RwZEhNZ1VIUjVJRXgwWklJSkFPbnlDcVdPRXgrbE1Bd0dBMVVkRXdRRgpNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJSk52M3cza0VqSGt5QkNiaURwcFFBczdDU2s1SGJzCisrV0EyZm9sdzZaM3I2SUxHWEpVYmhwaitQZ0V1YTVUTW5ja2VEL0lvMXViYnNqaWZ2eHo1UUJrTDIySHQwdkIKTFJpR1FkMGt2TTFUUkFTUyt2UFk1L096Q2hkUVFPamh0UG5Vc0h2dEVwTHV5SkRlV2QyZTV5cFoveDdmMTZRVApwRG16ajRLNG00YkZPUitSWlQxUkN2SjFDclU1VWR0UzBpWVoyczJmVVJJclQ3Qmo5dDhhdmpReTFxQnNzd1E1CkdFUERTRWVoRC96QzkzMlJsSUw4cGhja05kTHRvZGlMaVlSRU8rTGt6MHdDeWpVTG0vYXVMeWlrNzZ1WlZaR3gKTEJwRUp4WU81bmQvYVViYjNsS3liSXJZYXlkSWJBVk5CcWR1SWxaV3M1cmgwclJFOUZNaDcrbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=",
167
168
  "file_name": "cert.pem",
@@ -173,6 +174,11 @@ module.exports = {
173
174
  "file_name": "client (1).key",
174
175
  "file_url": ""
175
176
  },
177
+ "crt": {
178
+ "file_base64": "data:application/x-x509-ca-cert;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuVENDQW9VQ0ZFcDd4Z3J2VVhteWEzTEdmcEFpenRNUkJvN3ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0sKTVFzd0NRWURWUVFHRXdKRFRqRVFNQTRHQTFVRUNBd0hRbVZwYW1sdVp6RVFNQTRHQTFVRUJ3d0hRbVZwYW1sdQpaekVRTUE0R0ExVUVDZ3dIWVhCcGNHOXpkREVNTUFvR0ExVUVDd3dEWVhCME1SWXdGQVlEVlFRRERBMWpZeTVoCmNHbHdiM04wTG1Oak1SOHdIUVlKS29aSWh2Y05BUWtCRmhCaFpHMXBia0JoY0dsd2IzTjBMbU5qTUI0WERUSXoKTVRJeE1UQTVOREl4TmxvWERUTXpNVEl3T0RBNU5ESXhObG93Z1lveEN6QUpCZ05WQkFZVEFrTk9NUkF3RGdZRApWUVFJREFkQ1pXbHFhVzVuTVJBd0RnWURWUVFIREFkQ1pXbHFhVzVuTVE4d0RRWURWUVFLREFaaGNHbHZjM1F4CkREQUtCZ05WQkFzTUEyRndkREVXTUJRR0ExVUVBd3dOWTJNdVlYQnBjRzl6ZEM1all6RWdNQjRHQ1NxR1NJYjMKRFFFSkFSWVJZMnhwWlc1MFFHRndhWEJ2YzNRdVkyTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRG5DalNwV2MvVEovcXg2ZHRCRUlKeHhpME0wTWc1M091U0lNK2dMVnNseTl4SVFTTndGWGhrCi8vRzhTOVl0d2lnMHpwZVNLUlhyNi9tdklQcjlsY3RBakRrZzQ4Q1BQSk5YYVo1RTdQVkRYbThtTXhhS2RBeXEKZVBkT2w2bGJ0a0pWRTB0cElWTFo4UkhEOWU4VFdiNENMNFBUSzkrNFhVSElEUU1FTUdNbWFnRUVRd3ordDdSTQpMZDVvcVAxdHVUdlhBbmlUbmU4TnZhYVQ3NDlqcFhYb3lnV29FaVcwOGJ3NmI2TmZwVVEyeFBsSkdrc2tiblRhCisyTWVqb1ZrSlpDbDFlOUhOYXV2a085WjhQamRYMG9nZTM0OE5pZW83amNDWWhBUmttanVJanhiMU1kU3dPdjcKMTVWS3EwcFFwbjNzVHJrWTVqdjZEeis3dWhSaXVnN2pBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQgpBRGFCdG10NHVPaVpoVlpHdmo1Tko2RUhUUFNGZGxBaVd6U2tiSWllV2RIY1NhK0J3K2xBM1kyalJsYnZNUVVaCndiL21jaFRtNjFJRmlKbnYvN1h2MGtmMkJxUzkyMURXenJHa3FWQk5zRUdIMEdhWGVHMVMwL1pkNXg1RE4zMlEKRW9IRE95K2lOeDlwRzA2cy8ybUlGY1E3eXQ0cW9acXFQZUg4U3VIamZOanlnZnZFUGxiYUJHb0Y4V1dneFluLwp3TzlFK2pYN3VvdlZDWXVrY3NyaEprZzJwK3o5MUFVU3p2NlpTbHlnK3pGM2kyM1Q0ZXA5VDhwRTV2eXE3UlFnClNPT3BQd25uN0d5UWd2UzREbU5LMHkyazc5ZUdGb3VnTWxnS3g1Um5nMUQxNEd0ZFcvMlE0WGxNa2tHZ1ZsR2IKRVRkcGlES1JKWjNTTDJPZ1RsSFpibWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
179
+ "file_name": "client (1).crt",
180
+ "file_url": ""
181
+ },
176
182
  "HOST": "https://apipost.cn:443"
177
183
  }
178
184
  }
@@ -189,53 +195,8 @@ module.exports = {
189
195
  "type": "inherit"
190
196
  },
191
197
  "body": {
192
- "mode": "urlencoded",
198
+ "mode": "json",
193
199
  "parameter": [
194
- {
195
- "param_id": "a82580771003",
196
- "description": "",
197
- "field_type": "string",
198
- "is_checked": 1,
199
- "key": "",
200
- "not_null": 1,
201
- "value": "",
202
- "content_type": "",
203
- "file_name": "",
204
- "file_base64": "",
205
- "schema": {
206
- "type": "string"
207
- }
208
- },
209
- {
210
- "param_id": "dcc7d2b71005",
211
- "description": "",
212
- "field_type": "string",
213
- "is_checked": 1,
214
- "key": "",
215
- "not_null": 1,
216
- "value": "",
217
- "content_type": "",
218
- "file_name": "",
219
- "file_base64": "",
220
- "schema": {
221
- "type": "string"
222
- }
223
- },
224
- {
225
- "param_id": "10bbfac371004",
226
- "description": "",
227
- "field_type": "string",
228
- "is_checked": 1,
229
- "key": "",
230
- "not_null": 1,
231
- "value": "",
232
- "content_type": "",
233
- "file_name": "",
234
- "file_base64": "",
235
- "schema": {
236
- "type": "string"
237
- }
238
- },
239
200
  {
240
201
  "param_id": "12a8a25771004",
241
202
  "description": "",
@@ -250,21 +211,6 @@ module.exports = {
250
211
  "schema": {
251
212
  "type": "string"
252
213
  }
253
- },
254
- {
255
- "param_id": "12adf05771009",
256
- "description": "",
257
- "field_type": "string",
258
- "is_checked": 1,
259
- "key": "",
260
- "not_null": 1,
261
- "value": "",
262
- "content_type": "",
263
- "file_name": "",
264
- "file_base64": "",
265
- "schema": {
266
- "type": "string"
267
- }
268
214
  }
269
215
  ],
270
216
  "raw": "{\n \"id\": 1,\n \"name\": \"\"\n}",
@@ -301,13 +247,20 @@ module.exports = {
301
247
  "type": "database",
302
248
  "enabled": -1,
303
249
  "data": {
250
+ "variables": [],
304
251
  "connectionId": "2b9e0de71864000",
305
252
  "isConsoleOutput": 1,
306
- "query": "select * from user limit 0,2",
307
- "variables": []
253
+ "query": "select * from user limit 0,2"
308
254
  },
309
255
  "name": "数据库",
310
256
  "id": "3d59fd65bd6066"
257
+ },
258
+ {
259
+ "type": "customScript",
260
+ "enabled": -1,
261
+ "data": "// console.log(a)",
262
+ "name": "自定义脚本",
263
+ "id": "e7e75273d602e"
311
264
  }
312
265
  ],
313
266
  "post_tasks": [
@@ -317,6 +270,23 @@ module.exports = {
317
270
  "data": "pm.environment.set(\"code\", 201);\napt.test(\"成功的POST请求\", function () {\n apt.expect(apt.response.code).to.be.oneOf([201, 202]);\n});\npm.environment.set(\"code\", 201);\napt.test(\"成功的POST请求\", function () {\n apt.expect(apt.response.code).to.be.oneOf([201, 202]);\n});\n\napt.test(\"响应时间小于 200ms\", function () {\n apt.expect(apt.response.responseTime).to.be.below(200);\n });\napt.test(\"存在响应头 Content-Type\", function () {\n apt.response.to.have.header(\"Content-Type\");\n });\napt.test(\"状态码包含字符串\", function () {\n apt.response.to.have.status(\"Created\");\n });\nvar jsonObject = xml2Json(responseBody);\nvar schema = {\n \"items\": {\n \"type\": \"boolean\"\n }\n };\n\n var data1 = [true, false];\n var data2 = [true, 123];\n\n apt.test('Schema is valid', function () {\n apt.expect(tv4.validate(data1, schema)).to.be.true;\n apt.expect(tv4.validate(data2, schema)).to.be.true;\n });",
318
271
  "name": "自定义脚本",
319
272
  "id": "3d53b40ffd6022"
273
+ },
274
+ {
275
+ "type": "pickVars",
276
+ "id": "e91b563fd601a",
277
+ "name": "提取变量",
278
+ "enabled": 1,
279
+ "data": {
280
+ "source": "responseJson",
281
+ "variables": [
282
+ {
283
+ "param_id": "e91b5723d601c",
284
+ "name": "aaa",
285
+ "expression": "$.proto",
286
+ "type": "tempVars"
287
+ }
288
+ ]
289
+ }
320
290
  }
321
291
  ],
322
292
  "header": {
@@ -388,39 +358,14 @@ module.exports = {
388
358
  }
389
359
  ],
390
360
  "database_configs": {},
391
- "name": "if",
361
+ "name": "pre_url",
392
362
  "ignore_error": -1,
393
363
  "enable_sandbox": -1,
394
- "iterationCount": 2,
364
+ "iterationCount": 1,
395
365
  "sleep": 0,
396
- "testing_id": "d1bfa1f7d603c",
397
- "iterates_data_id": "d1fdbdfbd60ac",
398
- "iterationData": [
399
- {
400
- "code": "201",
401
- "name": "name201"
402
- },
403
- {
404
- "code": "202",
405
- "name": "name202"
406
- },
407
- {
408
- "code": "203",
409
- "name": "name203"
410
- },
411
- {
412
- "name": "name204",
413
- "code": "204"
414
- },
415
- {
416
- "code": "205",
417
- "name": "name205"
418
- },
419
- {
420
- "code": "206",
421
- "name": "name206"
422
- }
423
- ]
366
+ "testing_id": "e775c94fd600b",
367
+ "iterates_data_id": "0",
368
+ "iterationData": []
424
369
  },
425
370
  "test_events": [
426
371
  {
@@ -428,20 +373,20 @@ module.exports = {
428
373
  "enabled": 1,
429
374
  "type": "if",
430
375
  "data": {
431
- "var": "1",
432
- "compare": "eq",
433
- "value": "1"
376
+ "var": "{{code}}",
377
+ "compare": "notexist",
378
+ "value": ""
434
379
  },
435
380
  "project_id": "2adc267c9064000",
436
- "test_id": "d1bfa1f7d603c",
437
- "event_id": "d1c5f603d606d",
438
- "sort": 1,
381
+ "test_id": "e775c94fd600b",
382
+ "event_id": "e929fdbbd6032",
383
+ "sort": 0,
439
384
  "children": [
440
385
  {
441
386
  "type": "api",
442
387
  "auto_sync": true,
443
- "test_id": "d1bfa1f7d603c",
444
- "event_id": "d1c6a65bd6072",
388
+ "test_id": "e775c94fd600b",
389
+ "event_id": "e919aca3d600c",
445
390
  "enabled": 1,
446
391
  "data": {
447
392
  "target_id": "2b835ab23069000",
@@ -449,19 +394,6 @@ module.exports = {
449
394
  "parent_id": "ac6c2b71700a",
450
395
  "target_type": "api"
451
396
  }
452
- },
453
- {
454
- "parent_event_id": "d1c5f603d606d",
455
- "enabled": 1,
456
- "type": "script",
457
- "data": {
458
- "name": "脚本",
459
- "content": "pm.variables.set(\"code\",400)"
460
- },
461
- "project_id": "2adc267c9064000",
462
- "test_id": "d1bfa1f7d603c",
463
- "event_id": "d1c77c1fd6077",
464
- "sort": 3
465
397
  }
466
398
  ]
467
399
  }