一、语法
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/
(完)