编写 Postman 测试

一、语法

1、语法简介

pm.test("测试名称", function () {
  // 测试代码
});

// 或 使用 ES6 语法

pm.test("测试名称", () => {
  // 测试代码
});

说明:使用 pm.test() 方法,来定义一个测试。包含两个参数:

  • 参数一:字符串,表示测试名称,
  • 参数二:函数,用于测试的 function,可以在函数体中编写自己的测试代码。

2、测试规则说明

参数二传入的测试函数中,函数体中抛出异常,则测试失败,否则测试成功。
举例:这个例子会导致测试失败,但只会显示测试名称,不会显示额外信息

pm.test("My Test", function () {
    throw 'MyException'
});

如果需要输出详细信息:

pm.test("My Test", function () {
    throw {
        name: "异常名称",
        message: "需要显示的详细异常消息"
    }
});

二、测试的编写

上面抛出异常的方式,理论上没问题,但由于这种方式编写过于繁琐,所以实际场景中不采用这种方式。
Postman 测试可以使用 Chai Assertion Library BDD 语法,它提供了优化测试,提供了更好的可读性选项。
这种方式能够让代码更明确地表示测试目标,并且能够抛出具备更明确信息的异常,异常类型为 AssertionError

1、最简单的规则判断

pm.test("使用 expect 测试", function () {
    pm.expect(true).to.eql(false);
    pm.expect('abc').to.eql('xyz');
    pm.expect(200).to.eql(300);
});

2、其他测试

如:测试状态码是否为 200

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

三、常见断言样例

1、返回值断言

判断 Response 中的属性与环境变量值是否一致

pm.test("Response property matches environment variable", function () {
  pm.expect(pm.response.json().name).to.eql(pm.environment.get("name"));
});

2、值类型断言

判断值类型

/* response has this structure:
{
  "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;
});

3、数组属性断言

/*
response has this structure:
{
  "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", () => {
    //errors array is empty
  pm.expect(jsonData.errors).to.be.empty;
    //areas includes "goods"
  pm.expect(jsonData.areas).to.include("goods");
    //get the notification settings object
  const notificationSettings = jsonData.settings.find
      (m => m.type === "notification");
  pm.expect(notificationSettings)
    .to.be.an("object", "Could not find the setting");
    //detail array must include "sms"
  pm.expect(notificationSettings.detail).to.include("sms");
    //detail array must include all listed
  pm.expect(notificationSettings.detail)
    .to.have.members(["email", "sms"]);
});

4、对象属性断言

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');
pm.expect({a: 1}).to.have.property('a');
pm.expect({a: 1, b: 2}).to.be.an('object')
  .that.has.all.keys('a', 'b');

5、值包含在 Set 中的断言

pm.test("Value is in valid list", () => {
  pm.expect(pm.response.json().type)
    .to.be.oneOf(["Subscriber", "Customer", "User"]);
});

6、对象包含断言

/*
response has the following structure:
{
  "id": "d8893057-3e91-4cdd-a36f-a0af460b6373",
  "created": true,
  "errors": []
}
*/

pm.test("Object is contained", () => {
  const expectedObject = {
    "created": true,
    "errors": []
  };
  pm.expect(pm.response.json()).to.deep.include(expectedObject);
});

四、HTTP 响应断言

1、测试响应 Body

判断响应体中的值:

pm.test("Person is Jane", () => {
  const responseJson = pm.response.json();
  pm.expect(responseJson.name).to.eql("Jane");
  pm.expect(responseJson.age).to.eql(23);
});

2、测试状态码

测试响应状态码:

pm.test("Status code is 201", () => {
  pm.response.to.have.status(201);
});

判断响应状态码是多值中的一个:

pm.test("Successful POST request", () => {
  pm.expect(pm.response.code).to.be.oneOf([201,202]);
});

判断状态码文本:

pm.test("Status code name has string", () => {
  pm.response.to.have.status("Created");
});

3、测试响应头

判断指定响应头是否存在:

pm.test("Content-Type header is present", () => {
  pm.response.to.have.header("Content-Type");
});

判断响应头指定字段值:

pm.test("Content-Type header is application/json", () => {
  pm.expect(pm.response.headers.get('Content-Type')).to.eql('application/json');
});

4、测试 Cookie

判断 Cookie 存在

pm.test("Cookie JSESSIONID is present", () => {
  pm.expect(pm.cookies.has('JSESSIONID')).to.be.true;
});

判断 Cookie 值

pm.test("Cookie isLoggedIn has value 1", () => {
  pm.expect(pm.cookies.get('isLoggedIn')).to.eql('1');
});

5、测试响应时间

判断响应时间在指定范围:

pm.test("Response time is less than 200ms", () => {
  pm.expect(pm.response.responseTime).to.be.below(200);
});

五、参考

  • Test script examples

https://learning.postman.com/docs/writing-scripts/script-references/test-examples/

  • Chai Assertion Library - BDD

https://www.chaijs.com/api/bdd/

(完)

你可能感兴趣的:(编写 Postman 测试)