原文链接:https://learning.getpostman.com/docs/postman/scripts/test-examples/
Test scripts are run after a request is sent and a response has been received from the server.
Let’s look at some examples of Postman tests. Most of these are available as snippets inside Postman. You can run as many tests as you want for a request.
Environments
Setting an environment variable
pm.environment.set("variable_key", "variable_value");
Setting a nested object as an environment variable
var array = [1, 2, 3, 4];
pm.environment.set("array", JSON.stringify(array, null, 2));
var obj = { a: [1, 2, 3, 4], b: { c: 'val' } };
pm.environment.set("obj", JSON.stringify(obj));
Getting an environment variable
var value = pm.environment.get("variable_key");
If the value is a stringified JSON:
// These statements should be wrapped in a try-catch block if the data is coming from an unknown source.
var array = JSON.parse(pm.environment.get("array"));
var obj = JSON.parse(pm.environment.get("obj"));
Clear an environment variable
pm.environment.unset("variable_key");
Collection
Setting an collection variable
pm.collectionVariables.set(variableName:String, variableValue:String);
Get a collection variable
pm.collectionVariables.get(variableName:String);
Clear a collection variable
pm.collectionVariables.unset(variableName:String);
Globals
Set a global variable
pm.globals.set("variable_key", "variable_value");
Get a global variable
pm.globals.get("variable_key");
Clear a global variable
pm.globals.unset("variable_key");
Variables
This function searches for the variable across globals and the active environment.
var value = pm.variables.get("variable_key");
Response handling
Check if response body contains a string
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
Check if response body is equal to a string
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
Check for a JSON value
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
Content-Type header is present
pm.test("Content-Type header is present", function () {
pm.response.to.have.header("Content-Type");
});
Response time is less than 200ms
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
Status code is 200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
Code name contains a string
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
Successful POST request status code
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
Validate response structure
JSON schema validation with tv4
var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
pm.test('Schema is valid', function() {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;
});
JSON schema validation with ajv
var Ajv = require('ajv'),
ajv = new Ajv({logger: console}),
schema = {
"properties": {
"alpha": {
"type": "boolean"
}
}
};
pm.test('Schema is valid', function() {
pm.expect(ajv.validate(schema, {alpha: true})).to.be.true;
pm.expect(ajv.validate(schema, {alpha: 123})).to.be.false;
});
Encode/decode
Decode base64 data
// Assume `base64Content` has a base64 encoded value
var rawContent = base64Content.slice('data:application/octet-stream;base64,'.length);
// CryptoJS is an inbuilt object, documented here: https://www.npmjs.com/package/crypto-js
var intermediate = CryptoJS.enc.Base64.parse(base64content);
pm.test('Contents are valid', function() {
pm.expect(CryptoJS.enc.Utf8.stringify(intermediate)).to.be.true; // a check for non-emptiness
});
Convert XML body to a JSON object
var jsonObject = xml2Json(responseBody);
Send an asynchronous request
This function is available as both a pre-request and test script.
pm.sendRequest("https://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
Sample data files
JSON files are composed of key/value pairs.
For CSV files, the top row needs to contain variable names.
Assertion library examples
Following is a list of some of the most common assertion tests used in the Postman test scripts.
Note that this list is not exhaustive. For the complete reference, see the documentation at: ChaiJS expect BDD library
Assert if substring exists in target
pm.test("Check if pattern is in target string",function () {
pm.expect('foobar').to.have.string('bar');
});
Strict Comparison
const TEN = 10;
pm.test('Check if number is equal to 10', function () {
pm.expect(TEN).to.equal(10);
});
Loose comparison
pm.test("Our JSON is loosely equal to the provided JSON", function () {
pm.expect(data1).to.deep.equal(data2);
});
Note:
-
.deep
causes all.equal
,.include
,.members
,.keys
, and.property
assertions that follow in the chain to use deep equality(loose equality) instead of strict (===) equality. - While the
.eql
also compares loosely,.deep.equal
causes deep equality comparisons to also be used for any other assertions that follow in the chain while.eql
does not.
Assert the value of response
pm.test("Check response value", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
Assert the current environment
pm.test("Check if environment is production", function () {
pm.expect(pm.environment.get('env')).to.equal('production');
});
Assert the type of the target is equal to the given string type
pm.test("Check if target is string", function () {
pm.expect('Postman').to.be.a('string');
});
pm.test("Check if target is an object", function () {
pm.expect({a: 1}).to.be.an('object');
});
pm.test("Check if target is undefined", function () {
pm.expect(undefined).to.be.an('undefined');
});
Note:
- It’s often best to use
.a
to check a target’stype
before making more assertions on the same target. - Types are case insensitive.
Assert if the target is empty
pm.test("Check if array is empty", function () {
expect([]).to.be.empty;
});
pm.test("Check if string is empty", function () {
pm.expect('').to.be.empty;
});
This can be combined with .a
to check if the target is empty but has a type
, say for example an array
or an object
.
Example:
pm.test("Check if array is empty", function () {
pm.expect([]).to.be.an('array').that.is.empty;
});
Assert that the target contains the keys passed
pm.test("Check if object contains all provided keys", function () {
pm.expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
});
pm.test("Checking if object contains any ONE of the keys", function () {
pm.expect({a: 1, b: 2}).to.have.any.keys('a', 'b');
});
pm.test("Check if object contains any NONE of the provided keys", function () {
pm.expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');
});
Assert that the target contains said property
pm.test("Check if object contains the property", function () {
pm.expect({a: 1}).to.have.property('a');
});
Note:
- Target can be an
object
,set
,array
ormap
. - If
.keys
is run without.all
or.any
, the expression defaults to.all
. - As
.keys
does different things based on the target’stype
, it’s recommended to check the target’stype
before using.keys
using.a
.
pm.test("Check if object contains all the keys", function () {
pm.expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b');
});
Assert the length of target
pm.test("Check the length of the target", function () {
pm.expect('foo').to.have.lengthOf(3);
});
pm.test("Check the size of the target", function () {
pm.expect([1, 2, 3]).to.have.lengthOf(2);
});
Assert that the target array has the same members as the given array set
pm.test("Check if the target has same members as the array set", function () {
pm.expect([1, 2, 3]).to.have.members([2, 1, 3]);
});
Note:
- By default,
.members
makes strict comparison. - The order of members is irrelevant.
Assert that the target contains the provided item
pm.test("Check if the target array includes the number provided", function () {
pm.expect([1, 2, 3]).to.include(2);
});
pm.test("Check if the target object includes the properties provided", function () {
pm.expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2});
});
Note:
It is advised to first assert the type of target, as .include
operates on various types. Hence it is advised
to chain .a
when using .include
.
Example:
pm.test("Check if the target is an array that includes the number specified", function () {
pm.expect([1, 2, 3]).to.be.an('array').that.includes(2);
});
Older style of writing Postman tests (deprecated)
Note: This section refers to deprecated script syntax used in older versions of Postman. If you are writing scripts now, please use the syntax mentioned above.
The older style of writing Postman tests relies on setting values for the special tests
object. You can set a descriptive key for an element in the object and then say if it's true or false. For example, tests["Body contains user_id"] = responsebody.has("user_id");
will check whether the response body contains the user_id
string.
You can add as many keys as needed, depending on how many things you want to test for. You can view your test results in the response viewer under the Tests tab. The tab header shows how many tests passed, and the keys that you set in the tests variable are listed here. If the value evaluates to true, the test passed.
Setting an environment variable (deprecated)
postman.setEnvironmentVariable("key", "value");
Setting a nested object as an environment variable (deprecated)
var array = [1, 2, 3, 4];
postman.setEnvironmentVariable("array", JSON.stringify(array, null, 2));
var obj = { a: [1, 2, 3, 4], b: { c: 'val' } };
postman.setEnvironmentVariable("obj", JSON.stringify(obj));
Getting an environment variable (deprecated)
postman.getEnvironmentVariable("key");
Getting an environment variable (whose value is a stringified object) (deprecated)
// These statements should be wrapped in a try-catch block if the data is coming from an unknown source.
var array = JSON.parse(postman.getEnvironmentVariable("array"));
var obj = JSON.parse(postman.getEnvironmentVariable("obj"));
Clear an environment variable (deprecated)
postman.clearEnvironmentVariable("key");
Set a global variable (deprecated)
postman.setGlobalVariable("key", "value");
Get a global variable (deprecated)
postman.getGlobalVariable("key");
Clear a global variable (deprecated)
postman.clearGlobalVariable("key");
Check if response body contains a string (deprecated)
tests["Body matches string"] = responseBody.has("string_you_want_to_search");
Convert XML body to a JSON object (deprecated)
var jsonObject = xml2Json(responseBody);
Check if response body is equal to a string (deprecated)
tests["Body is correct"] = responseBody === "response_body_string";
Check for a JSON value (deprecated)
var data = JSON.parse(responseBody);
tests["Your test name"] = data.value === 100;
Content-Type is present (Case-insensitive checking) (deprecated)
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type"); //Note: the getResponseHeader() method returns the header value, if it exists.
Content-Type is present (Case-sensitive) (deprecated)
tests["Content-Type is present"] = responseHeaders.hasOwnProperty("Content-Type");
Response time is less than 200ms (deprecated)
tests["Response time is less than 200ms"] = responseTime < 200;
Response time is within a specific range (lower bound inclusive, upper bound exclusive) (deprecated)
tests["Response time is acceptable"] = _.inRange(responseTime, 100, 1001); // _ is the inbuilt Lodash v3.10.1 object, documented at https://lodash.com/docs/3.10.1
Status code is 200 (deprecated)
tests["Status code is 200"] = responseCode.code === 200;
Code name contains a string (deprecated)
tests["Status code name has string"] = responseCode.name.has("Created");
Successful POST request status code (deprecated)
tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;
Use TinyValidator for JSON data (deprecated)
var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
tests["Valid Data1"] = tv4.validate(data1, schema);
tests["Valid Data2"] = tv4.validate(data2, schema);
console.log("Validation failed: ", tv4.error);
Decode base64 encoded data (deprecated)
var intermediate,
base64Content, // assume this has a base64 encoded value
rawContent = base64Content.slice('data:application/octet-stream;base64,'.length);
intermediate = CryptoJS.enc.Base64.parse(base64content); // CryptoJS is an inbuilt object, documented here: https://www.npmjs.com/package/crypto-js
tests["Contents are valid"] = CryptoJS.enc.Utf8.stringify(intermediate); // a check for non-emptiness