
# pm对象API参考
#### pm
**pm:Object**
pm对象，含有接口运行关联信息。可利用它获取或设置环境变量和全局变量，且访问请求信息和返回结果信息。
**pm:info:Object**
pm.info对象，含有接口运行关联信息。
- pm.info.eventName:String：获取当前执行的脚本类型：前置脚本（prerequest），后置脚本（test）。
- pm.info.iterationCount:Number：返回执行循环的总次数，仅集合测试有效。
- pm.info.iteration:Number：获取当前执行循环（iteration）次序，仅集合测试有效。
- pm.info.requestId:String：获取运行中接口用例的唯一ID。
- pm.info.requestName:String：获取运行中接口用例名称。
 
#### 对于变量的处理
**pm.variables**
临时变量，[Variable SDK 参考](https://www.postmanlabs.com/postman-collection/Variable.html)。
- pm.variables.toObject():function：获取所有临时变量，结果以对象形式返回。

- pm.variables.has(variableName:String):function：检查某个临时变量是否存在。
- pm.variables.get(variableName:String):function：获取某个临时变量。
- pm.variables.set(variableName:String, variableValue:String):function：设置某个临时变量的名称和值。
- pm.variables.replaceIn(variableName:String):function：用字符串替换指定变量的值，如{{variable_name}}。
**pm.environment​**
环境变量。
- pm.environment.name:String：获取环境名称。

- pm.environment.toObject():function：获取当前环境的所有的变量，结果以对象形式返回。
- pm.environment.clear():function：清除当前环境中所有变量。

- pm.environment.has(variableName:String):function：检查某个环境变量是否存在。
- pm.environment.get(variableName:String):function：获取某个环境变量。
- pm.environment.set(variableName:String, variableValue:String):function：设置某个环境变量的名称和值。
- pm.environment.replaceIn(variableName:String):function：用字符串替换指定变量的值，如{{variable_name}}。
- pm.environment.unset(variableName:String):function：删除某个环境变量。
对于不同类型变量的优先级顺序为： 临时变量 \> 环境变量。
![](https://support.huaweicloud.com/usermanual-apiarts/public_sys-resources/note_3.0-zh-cn.png)
以上所有操作都是对本地值进行读写，而不会访问远程值。
#### 对于请求的处理
**pm.request​**
pm.request对象可以在脚本中对请求数据进行访问，[Request SDK 参考](https://www.postmanlabs.com/postman-collection/Request.html)。在前置脚本中表示即将运行的请求，在后置脚本中，表示已经运行的请求。
pm.request包含了以下结构：
- pm.request.url:[Url](https://www.postmanlabs.com/postman-collection/Url.html)：获取当前请求的URL。
- pm.request.getBaseUrl()：获取运行中环境选择的前置URL。
- pm.request.method:String：获取当前请求的方法，如GET、POST等。
- pm.request.headers:[HeaderList](https://www.postmanlabs.com/postman-collection/HeaderList.html)：获取当前请求的headers列表。
- pm.request.body:[RequestBody](https://www.postmanlabs.com/postman-collection/RequestBody.html)：获取当前请求的body体。
- pm.request.headers.add({ key: headerName:String, value: headerValue:String}):function：为当前请求添加指定键和值的header。
- pm.request.headers.remove(headerName:String):function：删除当前请求里指定键的header。
- pm.request.headers.get(headerName:String):function：获取请求里指定名称的header。
- pm.request.headers.upsert({ key: headerName:String, value: headerValue:String}):function：插入指定键和值的header（如果header不存在则新增，如果header已存在则修改）。
- pm.request.auth：获取请求的身份验证信息。
 
#### 对于响应的处理
**pm.response​**
在后置脚本中pm.response接口请求完成后返回响应信息，[Response SDK 参考](https://www.postmanlabs.com/postman-collection/Response.html)。
response包含了以下结构：
- pm.response.code:Number：获取响应码。
- pm.response.status:String：获取响应状态。
- pm.response.headers:[HeaderList](https://www.postmanlabs.com/postman-collection/HeaderList.html)：获取响应头。
- pm.response.responseSize:Number：获取响应大小。
- pm.response.text():Function：以文本形式输出响应体。
- pm.response.json():Function：以json形式输出响应体。
- pm.response.setBody('')：设置响应体。
- pm.response.headers.get：从响应头中获取指定参数的值，[Response SDK 参考](https://www.postmanlabs.com/postman-collection/Request.html#getHeaders)。
后置脚本中使用"pm.response.headers.get"命令可以获取响应头中指定参数的值。例如想要获取响应Header中date参数的值，那么可以在后置操作中输入如下自定义脚本：
```
var test = pm.response.headers.get("date");
console.log(test);
```
![](https://support.huaweicloud.com/usermanual-apiarts/zh-cn_image_0000002483543936.png)
#### 对于断言的处理
**pm.test​**
- pm.test(testName:String, specFunction:Function):Function：断言某项结果是否符合预期。
以下示例检查返回响应是否正确：
```
pm.test("response should be OK to process", function() {
  pm.response.to.not.be.error;
  pm.response.to.have.jsonBody("");
  pm.response.to.not.have.jsonBody("error");
});
```
通过回调可选参数done，可用来测试异步方法：
```
pm.test("async test", function(done) {
  setTimeout(() => {
    pm.expect(pm.response.code).to.equal(200);
    done();
  }, 1500);
});
```
- pm.test.index():Function：获取特定位置的测试总数。
**pm.expect​**
- pm.expect(assertion:\*):Function：一个普通的断言方法，详细的说明请参照[ChaiJS expect BDD library](https://chaijs.com/api/bdd/)。该方法对于处理来自响应response或变量variables的数据断言非常有用，更多关于pm.expect断言的示例，请参见[Assertion library examples](https://learning.postman.com/docs/writing-scripts/script-references/test-examples/)。
**Response 对象的断言API列表​**
- pm.response.to.have.status(code:Number)：判断响应状态码是否为设置的(code:Number)。
- pm.response.to.have.status(reason:String)：判断响应状态码是否符合响应码描述。
- pm.response.to.have.header(key:String)：判断是否包含响应头中对应的键。
- pm.response.to.have.header(key:String, optionalValue:String)：判断是否包含响应头中对应的键、值。
- pm.response.to.have.body()：判断是否有响应体。
- pm.response.to.have.body(optionalValue:RegExp)：判断响应体中是否等于设置的正则表达式。
- pm.response.to.have.body(optionalValue:String)：判断响应体中是否等于设置的字符串。
- pm.response.to.have.jsonBody()：判断响应体是否是有效的json结构。
- pm.response.to.have.jsonBody(optionalExpectEqual:Object)：判断响应体是否等于json结构里设置的对象。
- pm.response.to.have.jsonBody(optionalExpectPath:String)：判断响应体是否包含json结构里设置的路径。
- pm.response.to.have.jsonBody(optionalExpectPath:String, optionalValue:\*)： 判断响应体是否包含json结构里设置的路径，且路径是否等于设置的值。
  
- pm.response.to.have.jsonSchema(schema:Object)：判断响应体是否满足定义的json模型。
- pm.response.to.have.jsonSchema(schema:Object, ajvOptions:Object):判断响应体是否满足定义的json模型、校验配置。
**pm.response.to.be​**
pm.response.to.be是一系列内置规则用于实现快速断言。
- pm.response.to.be.info：检查状态码是否为1XX。
- pm.response.to.be.success：检查状态码是否为2XX。
- pm.response.to.be.redirection：检查状态码是否为3XX。
- pm.response.to.be.clientError：检查状态码是否为4XX。
- pm.response.to.be.serverError：检查状态码是否为5XX。
- pm.response.to.be.error：检查状态码是否为4XX或5XX。
- pm.response.to.be.ok：检查状态码是否为200。
- pm.response.to.be.accepted：检查状态码是否为202。
- pm.response.to.be.badRequest：检查状态码是否为400。
- pm.response.to.be.unauthorized：检查状态码是否为401。
- pm.response.to.be.forbidden：检查状态码是否为403。
- pm.response.to.be.notFound：检查状态码是否为404。
- pm.response.to.be.rateLimited：检查状态码是否为429。
 
#### 对于发送请求的处理
**pm.sendRequest**
pm.sendRequest:Function用于脚本异步发送HTTP/HTTPS的请求。
- 更多参数信息请查阅[Collection SDK 文档](https://www.postmanlabs.com/postman-collection/Request.html#~definition) 。
- 在前置脚本和后置脚本都可以使用。
- 更多参考:
  - [Request JSON 结构](https://www.postmanlabs.com/postman-collection/Request.html#~definition)
  
  - [Response 结构](https://www.postmanlabs.com/postman-collection/Response.html)
   
```
// 使用字符串URL示例
pm.sendRequest("https://postman-echo.com/get", function(err, resq) {
  if (err) {
    console.log(err);
  } else {
    pm.variables.set("variable_name", "new_value");
  }
});
// 完整请求示例
const echoPostRequest = {
  url: "https://postman-echo.com/post",
  method: "POST",
  header: {
    header_name1: "value1",
    header_name2: "value2",
  },
  // body 为 x-www-form-urlencoded 格式
  body: {
    mode: "urlencoded", // 此处为 urlencoded
    // 此处为 urlencoded
    urlencoded: [
      { key: "account", value: "codeartsapi" },
      { key: "password", value: "123456" },
    ],
  },
  /*
  // body 为 form-data 格式
  body: {
    mode: 'formdata', // 此处为 formdata
    // 此处为 formdata
    formdata: [
      { key: 'account', value: 'codeartsapi' },
      { key: 'password', value: '123456' }
    ]
  }
  // body 为 json 格式
  header: {
    "Content-Type": "application/json", // 提醒：header中需要添加Content-Type
  },
  body: {
    mode: 'raw',
    raw: JSON.stringify({ account: 'codeartsapi', password:'123456' })
  }
  // body 为 raw 或 json 格式
  body: {
    mode: 'raw',
    raw: 'body内容'
  }
  */
};
pm.sendRequest(echoPostRequest, function(err, resq) {
  console.log(err ? err : resq.json());
});
// 对返回结果进行断言
pm.sendRequest("https://postman-echo.com/get", function(err, resq) {
  if (err) {
    console.log(err);
  }
  pm.test("response should be OK to process", function() {
    pm.expect(err).to.equal(null);
    pm.expect(resq).to.have.property("code", 200);
    pm.expect(resq).to.have.property("status", "OK");
  });
});
```
