0


postman变量和脚本功能介绍

1、基本概念——global、collection、environment

在postman中,为了更好的管理各类变量、测试环境以及脚本等,创建了一些概念,包括:globals、collection、environment。其实在postman中,最上层还有一个Workspaces的概念,不过大多数情况我们都使用一个workspace,这里就不多介绍了。

1.1)请求组(collection):

可以将多个请求保存到一个请求组(Collections)中, 好处是: 增加额外Collection变量作用域, 增加公共的PreRequest和Test脚本, 批量执行Collection下的请求, 定义Collection内请求的顺序。

上图中可以看到,左上角“+”可以创建新的collection;点击collection的右侧“。。。”可以Edit现有collection,以及Run、Add folder等功能。

说明:Collection下还可以建文件夹,对请求进一步划分,比如:用户模块、订单模块。

1.2)环境(environment):

通常一个系统具备多个环境,比如:测试、线上。

如上图,点击左上角“+”可以新建一个environment;鼠标指向现有environment,点击右侧“。。。”可以进行编辑。值得提醒的是,当运行时,需要在右上角选中我们想要的环境。

变量有两个value(不光是环境变量,其他变量也是一样的),二者的区别:

  • INITAL_VALUE:初始值是在定义变量的元素(集合、环境或全局变量)中设置的值。此值将同步到 Postman 的服务器,并在您共享该元素时与您的团队共享
  • CURRENT_VALUE:这些是本地值,不会同步到 Postman 的服务器。如果您更改当前值,它将不会保留在原始共享集合、环境或全局变量中。

1.3)golbal:

细心的朋友已经发现,在environment中,左上角出现了Golbals:

2、变量

变量,在postman中最常见的一个功能,包括设置、读取、作用域等。

2.1)变量作用域:

postman中变量有多个作用域, 越往内的作用域优先级越高(global < collection < environment < …), 举例来说, 如果global作用域和Environment作用域里都有一个变量叫username, 那么最终使用的是Environment作用域里的变量值。

不同作用域变量设置方法:

2.2)定义、使用变量

从上面图可以看到,在UI界面上可以管理globals变量,后面也会降到使用API方式设置、读取globes变量(会同步出现在UI界面上);同样的,对于environment变量也是一样的。(如上面1.2和1.3)

1)通过界面定义变量:

选中某个值,然后点击弹出的菜单点击"Set as new variable":

然后这只变量名、和作用域:

2)管理Collections变量:

选择某个Collection后,点击右侧的“。。。”,然后选择Edit,在右侧界面上会显示Variables。

3)使用变量:

在不同作用域定义好变量后, 然后在某个请求中引用该变量, 从而做到变量复用和统一管理。

使用"{{变量名}}"来引用变量。

2.3)在脚本中操作变量

  1. // 不同作用域设置变量
  2. pm.globals.set("username", "golbals_name");
  3. pm.globals.set("username1", "golbals_name1");
  4. pm.collectionVariables.set("username", "collection_name");
  5. pm.environment.set("username", "environment_name");
  6. pm.variables.set("username", "variable_username"); //临时覆盖, 优先级最高, 请求结束后失效
  7. // 获取变量值
  8. console.log(pm.globals.get("username")); //从globals作用域中查询变量
  9. console.log(pm.collectionVariables.get("username"));
  10. console.log(pm.environment.get("username"));
  11. var k = pm.variables.get("username1"); //依次从各个作用域查找
  12. console.log("username:" + k);
  13. // 判断
  14. pm.variables.has("username");
  15. pm.environment.has("username");
  16. pm.globals.has("username");
  17. // 清理
  18. pm.environment.unset("username");

2.4)data作用域的变量

在UI界面上,选择Collection的Run,在界面中可以选择一个文件

然后准备一个文件,内容如下:(必须是json或者csv格式)

  1. [{
  2. "path": "post",
  3. "value": "1"
  4. }, {
  5. "path": "post",
  6. "value": "2"
  7. }, {
  8. "path": "post",
  9. "value": "3"
  10. }, {
  11. "path": "post",
  12. "value": "4"
  13. }]

另外,在脚本里访问data文件可以使用如下AIP:

  1. pm.iterationData.get("value");

3、脚本

postman API文档:Home - Postman Documentation

3.1)脚本相关概念:

1)脚本执行顺序:

执行每个请求时会依次执行如下脚本:

  1. Collection级别的pre-request脚本
  2. Folder级别的pre-request脚本
  3. Request级别的pre-prequest脚本
  4. Request级别的test脚本
  5. Folder级别的test脚本
  6. Collection级别的test脚本

2)在界面上输入脚本信息:

最常见的就是request级别的脚本,可以在Scripts页签下输入,如下:

可以看到,脚本分两个:pre-request和post-reponse,分别对应请求前处理和请求后处理。

在Collection级别上也可以创建脚本,如下:

同样,如果在Collection下有folder,那么folder上也可以创建scripts。

3.2)常用脚本代码

1)操作变量:

  1. // 设置全局变量
  2. pm.globals.set('variable_key', 'variable_value');
  3. var variable_key = pm.globals.get('variable_key');// 获取全局变量
  4. pm.globals.unset('variable_key');// unset 全局变量
  5. // 设置环境变量
  6. pm.environment.set('variable_key', 'variable_value');
  7. var variable_key = pm.environment.get('variable_key');// 获取环境变量
  8. pm.environment.unset('variable_key');// unset 环境变量
  9. // 设置临时变量
  10. pm.variables.set('variable_key', 'variable_value');
  11. var variable_key = pm.variables.get('variable_key');// 获取临时变量
  12. pm.variables.unset('variable_key');// unset 临时变量
  13. // 将对象或数组(非字符串)写入环境变量
  14. var array = [1, 2, 3, 4];
  15. pm.environment.set('array', JSON.stringify(array));
  16. var obj = { a: [1, 2, 3, 4], b: { c: 'val' } };
  17. pm.environment.set('obj', JSON.stringify(obj));
  18. // 转换回来
  19. try {
  20. var array = JSON.parse(pm.environment.get('array'));
  21. var obj = JSON.parse(pm.environment.get('obj'));
  22. } catch (e) {
  23. // 处理异常
  24. }

2)前置读取/修改接口信息:

  1. // ================= URL ===================
  2. // 获取 url 对象
  3. var urlObject = pm.request.url;
  4. // 获取完整接口请求 URL,包含 query 参数
  5. var url = urlObj.toString();
  6. // 获取协议(http 或 https)
  7. var protocol = urlObj.protocol;
  8. // 获取 端口
  9. var port = urlObj.port;
  10. // ================= Header ===================
  11. // 获取 Header 参数对象
  12. var headers = pm.request.headers;
  13. // 获取 key 为 field1 的 header 参数的值
  14. var field1 = headers.get('field1');
  15. // 已键值对象方式获取所有 query 参数
  16. var headersObject = headers.toObject();
  17. // 遍历整个 query
  18. headers.each(item => {
  19. console.log(item.key); // 输出参数名
  20. console.log(item.value); // 输出参数值
  21. });
  22. // 增加 header 参数
  23. headers.add({
  24. key: 'field1',
  25. value: 'value1',
  26. });
  27. // 修改 query 参数(如不存在则新增)
  28. headers.upsert({
  29. key: 'field2',
  30. value: 'value2',
  31. });
  32. // ================= Query ===================
  33. // 获取 Query 参数对象
  34. var queryParams = pm.request.url.query;
  35. // 获取 key 为 field1 的 query 参数的值
  36. var field1 = queryParams.get('field1');
  37. // 已键值对象方式获取所有 query 参数
  38. var quertParamsObject = queryParams.toObject();
  39. // 遍历整个 query
  40. queryParams.each(item => {
  41. console.log(item.key); // 输出参数名
  42. console.log(item.value); // 输出参数值
  43. });
  44. // 增加 query 参数
  45. queryParams.add({
  46. key: 'field1',
  47. value: 'value1',
  48. });
  49. // 修改 query 参数(如不存在则新增)
  50. queryParams.upsert({
  51. key: 'field2',
  52. value: 'value2',
  53. });
  54. // ================= Body ===================
  55. // Body 参数来自pm.request.body,pm.request.body 是一个RequestBody 实例。
  56. // Body 参数在只能读取,不能直接修改。如需修改 Body 里的数据,请在 Body 里引用变量,然后在脚本里设置变量的值,以达到修改的目的。
  57. // --------------------- body 类型为 form-data ------------------
  58. // 当 body 类型为 form-data 时,从 pm.request.body.formdata 获取请求参数
  59. var formData = pm.request.body.formdata;
  60. // 获取 key 为 field1 的 form-data 参数的值
  61. var field1 = formData.get('field1');
  62. console.log(field1); // 控制台打印 field1
  63. // 已键值对象方式获取所有 formdata 参数
  64. var formdataObject = formData.toObject();
  65. console.log(formdataObject); // 控制台打印 formdataObject
  66. // 遍历整个 form-data 数据
  67. formData.each(item => {
  68. console.log(item.key); // 控制台打印参数名
  69. console.log(item.value); // 控制台打印参数值
  70. });
  71. // --------------------- body 类型为 x-www-form-urlencode ------------------
  72. // 当 body 类型为 x-www-form-urlencode** 时,从 pm.request.body.urlencoded 获取请求参数
  73. var formData = pm.request.body.urlencoded;
  74. // 获取 key 为 field1 的 form-data 参数的值
  75. var field1 = formData.get('field1');
  76. // 已键值对象方式获取所有 formdata 参数
  77. var formdataObject = formData.toObject();
  78. // 遍历整个 form 数据
  79. formData.each(item => {
  80. console.log(item.key); // 控制台打印参数名
  81. console.log(item.value); // 控制台打印参数值
  82. });
  83. // --------------------- body 类型为 JSON ------------------
  84. try {
  85. var jsonData = JSON.parse(pm.request.body.raw);
  86. console.log(jsonData); // 控制台打印参整个 json 数据
  87. } catch (e) {
  88. console.log(e);
  89. }
  90. // --------------------- body 类型为 raw ------------------
  91. var raw = pm.request.body.raw;
  92. console.log(raw); // 控制台打印参整个 raw 数据

3)常用后置脚本:

  1. pm.test("响应状态码为200", function () {
  2. pm.response.to.have.status(200);
  3. pm.expect(pm.response.code).to.eql(200);
  4. });
  5. // GET https://gank.io/api/v2/banners
  6. pm.test("成功响应且有数据", function() {
  7. pm.expect(pm.response.code).to.eql(200);
  8. const respJson = pm.response.json();
  9. pm.expect(respJson.data).to.length.gt(0);
  10. })
  11. // GET https://gank.io/api/v2/data/category/GanHuo/type/iOS/page/1/count/10
  12. pm.test("分页数据满页", function() {
  13. const respJson = pm.response.json();
  14. pm.expect(respJson.data.length).to.eq(10);
  15. pm.expect(respJson.data).to.have.lengthOf(10);
  16. })
  17. // 在脚本中发送请求
  18. pm.sendRequest("https://gank.io/api/v2/banners", function(err, resp) {
  19. console.log(resp.json())
  20. })
  21. // 响应数据转换
  22. // json
  23. const responseJson = pm.response.json();
  24. // xml
  25. const responseJson = xml2Json(pm.response.text());
  26. // csv
  27. const parse = require('csv-parse/lib/sync');
  28. const responseJson = parse(pm.response.text());
  29. // html https://cheerio.js.org
  30. const $ = cheerio.load(pm.response.text());
  31. console.log($.html());
  32. console.log($(".header"));
  33. // 纯文本
  34. pm.expect(pm.response.text()).to.include("customer_id");
  35. pm.response.to.have.body("whole-body-text");
  36. // 将 jsonData.token 的值写入环境变量
  37. pm.environment.set('token', jsonData.token);

4)常用断言:

  1. // response assertions 示例
  2. pm.test('返回结果没有错误', function() {
  3. pm.response.to.not.be.error;
  4. pm.response.to.have.jsonBody('');
  5. pm.response.to.not.have.jsonBody('error');
  6. });
  7. // pm.response.to.be* 示例
  8. pm.test('返回结果没有错', function() {
  9. // assert that the status code is 200
  10. pm.response.to.be.ok; // info, success, redirection, clientError, serverError, are other variants
  11. // assert that the response has a valid JSON body
  12. pm.response.to.be.withBody;
  13. pm.response.to.be.json; // this assertion also checks if a body exists, so the above check is not needed
  14. });
  15. // ----------- 状态码 -------------
  16. pm.test('Status code is 200', function() {
  17. pm.response.to.have.status(200);
  18. });
  19. // 检查 HTTP 状态码名称是否包含某个字符串
  20. pm.test('Status code name has string', function() {
  21. pm.response.to.have.status('Created');
  22. });
  23. // 是否正确的 POST 请求状态码
  24. pm.test('Successful POST request', function() {
  25. pm.expect(pm.response.code).to.be.oneOf([201, 202]);
  26. });
  27. // --------- 请求头 ---------
  28. pm.expect(pm.response.headers.get('Content-Type')).to.eql('application/json');
  29. pm.test('Content-Type header is present', function() {
  30. pm.response.to.have.header('Content-Type');
  31. });
  32. // --------- cookie ---------
  33. pm.expect(pm.cookies.has('JSESSIONID')).to.be.true;
  34. pm.expect(pm.cookies.get('isLoggedIn')).to.eql('1');
  35. // --------- 响应时间 ms ---------
  36. pm.test('Response time is less than 200ms', function() {
  37. pm.expect(pm.response.responseTime).to.be.below(200);
  38. });
  39. // --------------- 请求体验证 -----------------
  40. const jsonData = pm.response.json();
  41. pm.expect(jsonData.name).to.eql("Jane");
  42. // 响应值等于某个预先定义的变量值
  43. pm.expect(jsonData.name).to.eql(pm.environment.get("name"));
  44. // 检查 response body 是否包含某个字符串
  45. pm.test('Body matches string', function() {
  46. pm.expect(pm.response.text()).to.include('string_you_want_to_search');
  47. });
  48. // 检查 response body 是否包含等于字符串
  49. pm.test('Body is correct', function() {
  50. pm.response.to.have.body('response_body_string');
  51. });
  52. // 检查 json 值
  53. pm.test('Your test name', function() {
  54. var jsonData = pm.response.json();
  55. pm.expect(jsonData.value).to.eql(100);
  56. });
  57. // 断言数据类型
  58. pm.expect(jsonData).to.be.an("object");
  59. pm.expect(jsonData.name).to.be.a("string");
  60. pm.expect(jsonData.age).to.be.a("number");
  61. pm.expect(jsonData.hobbies).to.be.an("array");
  62. pm.expect(jsonData.website).to.be.undefined;
  63. pm.expect(jsonData.email).to.be.null;
  64. // 数组属性
  65. pm.expect(jsonData.errors).to.be.empty;
  66. pm.expect(jsonData.errors).to.be.an('array').that.is.empty;
  67. pm.expect(jsonData.areas).to.include("goods");
  68. const contactSettings = jsonData.settings.find(m => m.type === "contact");
  69. pm.expect(contactSettings).to.be.an("object", "找不到联系方式配置信息");
  70. pm.expect(contactSettings.detail).to.have.members(["email", "sms"]);
  71. // 对象
  72. pm.expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
  73. pm.expect({a: 1, b: 2}).to.have.any.keys('a', 'b');
  74. pm.expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');
  75. pm.expect({a: 1}).to.have.property('a');
  76. pm.expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b');
  77. pm.expect({a: 1, b: 2}).to.deep.include({a:1}); // 包含部分属性
  78. // 集合
  79. pm.expect({"a": 1, "b": 123}.a).to.be.oneOf([1, 123]);
  80. // 字符串
  81. pm.expect('').to.be.empty;

5)脚本里发送请求:

  1. pm.sendRequest('https://postman-echo.com/get', (error, response) => {
  2. if (error) {
  3. console.log(error);
  4. } else {
  5. console.log(response);
  6. pm.environment.set('variable_key', 'new_value');
  7. }
  8. });
  9. // 完整的 request 参数示例
  10. const echoPostRequest = {
  11. url: 'https://postman-echo.com/post',
  12. method: 'POST',
  13. header: {
  14. headername1: 'value1',
  15. headername2: 'value2',
  16. },
  17. body: {
  18. mode: 'raw',
  19. raw: JSON.stringify({ key: 'this is json' }),
  20. },
  21. };
  22. pm.sendRequest(echoPostRequest, function(err, res) {
  23. console.log(err ? err : res.json());
  24. });
  25. // 对返回结果进行断言
  26. pm.sendRequest('https://postman-echo.com/get', function(err, res) {
  27. if (err) {
  28. console.log(err);
  29. }
  30. pm.test('response should be okay to process', function() {
  31. pm.expect(err).to.equal(null);
  32. pm.expect(res).to.have.property('code', 200);
  33. pm.expect(res).to.have.property('status', 'OK');
  34. });
  35. });

在Runner中运行collection下的请求时, 可以通过postman.setNextRequest(请求名) 或者 postman.setNextRequest(请求id)来指定下一个请求, 这样可以构建起一个调用工作流, 比如先请求数据列表接口, 然后从响应中获取数据id, 再请求数据详情接口.

原文:postman | Tonny's Blog

标签: postman 测试工具

本文转载自: https://blog.csdn.net/liuxiao723846/article/details/143695185
版权归原作者 赶路人儿 所有, 如有侵权,请联系我们删除。

“postman变量和脚本功能介绍”的评论:

还没有评论