Testing
Write post-response scripts to automatically validate API responses. Scripts use a Postman-compatible syntax, so if you have used Postman before, you will feel right at home.
Examples
Check the status code
pm.test("Status code is 200", () => {
pm.response.to.have.status(200)
})
Check JSON response
pm.test("Response is valid JSON", () => {
const responseData = pm.response.json()
pm.expect(responseData).to.be.an('object')
})
Check response headers
pm.test("Content-Type header is present", () => {
pm.response.to.have.header('Content-Type')
})
Validate JSON schema
pm.test("Response matches schema", () => {
const schema = {
type: 'object',
required: ['id', 'name'],
properties: {
id: { type: 'number' },
name: { type: 'string' }
}
}
pm.response.to.have.jsonSchema(schema)
})
Check response body
pm.test("Response body contains string", () => {
pm.expect(pm.response.text()).to.include('success')
})
Successful POST request
pm.test("Successful POST request", () => {
pm.expect(pm.response.code).to.be.oneOf([201, 202])
})
Negate an assertion
pm.test("Response is not an error", () => {
pm.expect(pm.response.code).to.not.be.oneOf([400, 500])
pm.expect(pm.response.json()).to.not.have.property('error')
})
Check header value
pm.test("Content-Type is JSON", () => {
pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json')
})
Multiple assertions
pm.test("Response has all properties", () => {
const data = pm.response.json()
pm.expect(data.type).to.eql('vip')
pm.expect(data.name).to.be.a('string')
pm.expect(data.id).to.have.lengthOf(1)
})
Assert data types
pm.test("Response data types are correct", () => {
const data = pm.response.json()
pm.expect(data).to.be.an('object')
pm.expect(data.name).to.be.a('string')
pm.expect(data.age).to.be.a('number')
pm.expect(data.hobbies).to.be.an('array')
})
Check object containment
pm.test("Response contains expected object", () => {
const expected = { created: true, errors: [] }
pm.expect(pm.response.json()).to.deep.include(expected)
})
Adding Scripts to OpenAPI Documents
You can add post-response scripts directly to your OpenAPI description using the x-post-response extension. When the API Client imports the document, scripts are automatically attached to the corresponding operations.
openapi: 3.1.0
info:
title: Example
version: 1.0
paths:
'/planets':
get:
summary: Get all planets
x-post-response: |-
pm.test("Status code is 200", () => {
pm.response.to.have.status(200)
})
See the OpenAPI extensions reference for more examples.
Reference
Scripts run in the official Postman Sandbox runtime, so the full pm API is available.
pm.test(name, callback)
Define a named test. The test passes if the callback executes without throwing an error. Returns the pm object, so calls can be chained.
pm.test("response is okay to process", () => {
pm.response.to.not.be.error
pm.response.to.have.jsonBody('data')
})
Async tests are supported by accepting a done callback:
pm.test("async test", (done) => {
setTimeout(() => {
pm.expect(pm.response.code).to.equal(200)
done()
}, 1500)
})
Skip a test with pm.test.skip:
pm.test.skip("not yet implemented", () => {
// this test will not run
})
pm.expect(value)
Create an assertion on a value. Uses Chai BDD syntax, so all Chai chains are supported.
Equality
pm.expect(value).to.equal('exact match') // strict equality (===)
pm.expect(value).to.eql({ id: 1 }) // deep equality
Type checks
pm.expect(value).to.be.a('string')
pm.expect(value).to.be.an('object')
pm.expect(value).to.be.true
pm.expect(value).to.be.false
pm.expect(value).to.be.null
pm.expect(value).to.be.undefined
pm.expect(value).to.be.empty
pm.expect(value).to.be.ok // truthy
Numbers
pm.expect(count).to.be.above(5)
pm.expect(count).to.be.below(100)
pm.expect(count).to.be.at.least(1)
pm.expect(count).to.be.at.most(50)
pm.expect(count).to.be.within(1, 100)
Strings and arrays
pm.expect(text).to.include('success')
pm.expect(text).to.match(/^hello/)
pm.expect(list).to.have.lengthOf(3)
pm.expect(list).to.have.members([1, 2, 3])
pm.expect(value).to.be.oneOf([200, 201])
Objects
pm.expect(obj).to.have.property('name')
pm.expect(obj).to.have.property('name', 'Earth')
pm.expect(obj).to.have.keys(['id', 'name'])
pm.expect(obj).to.have.nested.property('data.items[0].id')
pm.expect(obj).to.deep.include({ id: 1 })
Negation
Add .not to negate any assertion:
pm.expect(value).to.not.equal('error')
pm.expect(list).to.not.be.empty
pm.response
Access the response object inside your scripts.
Properties
| Property | Type | Description |
|---|---|---|
pm.response.code |
number | HTTP status code |
pm.response.status |
string | HTTP status text |
pm.response.headers |
HeaderList | Response headers |
pm.response.responseTime |
number | Time to receive the response in milliseconds |
pm.response.responseSize |
number | Size of the response in bytes |
Methods
| Method | Returns | Description |
|---|---|---|
pm.response.text() |
string | Response body as a string |
pm.response.json() |
object | Parse the response body as JSON |
Response assertions
Assert directly on pm.response using .to.have and .to.be chains:
// Status
pm.response.to.have.status(200)
pm.response.to.have.status('OK')
// Headers
pm.response.to.have.header('Content-Type')
pm.response.to.have.header('Content-Type', 'application/json')
// Body
pm.response.to.have.jsonBody('data')
pm.response.to.have.jsonBody('data', { id: 1 })
// JSON Schema validation
pm.response.to.have.jsonSchema({
type: 'object',
required: ['id'],
properties: { id: { type: 'number' } }
})
// Status classes
pm.response.to.be.ok // 2xx
pm.response.to.be.error // 4xx or 5xx
pm.response.to.not.be.error
// Negation
pm.response.to.not.have.status(404)
Variables
Read and write variables at different scopes. All scopes support .get(name) and .set(name, value).
| Scope | Description |
|---|---|
pm.variables |
Local to the current script |
pm.environment |
Tied to the active environment |
pm.collectionVariables |
Shared across the collection |
pm.globals |
Available everywhere |
// Read a variable
const token = pm.environment.get('auth_token')
// Write a variable
pm.environment.set('auth_token', 'new-value')
Variables resolve in order: local > environment > collection > global.