After Run API
The after:run
event fires after a run is finished. When running cypress via
cypress open
, the event will fire when closing a project.
When running via cypress run
, the event will fire each time cypress run
executes. As a result, if running your specs in
parallel, the event will fire once for each
machine on which cypress run
is called.
Syntax
caution
⚠️ This code is part of the
setupNodeEvents function and
thus executes in the Node environment. You cannot call Cypress
or cy
commands in this function, but you do have the direct access to the file system
and the rest of the operating system.
caution
⚠️ When running via cypress open
, the after:run
event only fires if the
experimentalInteractiveRunEvents flag
is enabled.
- cypress.config.js
- cypress.config.ts
const { defineConfig } = require('cypress')
module.exports = defineConfig({
// setupNodeEvents can be defined in either
// the e2e or component configuration
e2e: {
setupNodeEvents(on, config) {
on('after:run', (results) => {
/* ... */
})
},
},
})
import { defineConfig } from 'cypress'
export default defineConfig({
// setupNodeEvents can be defined in either
// the e2e or component configuration
e2e: {
setupNodeEvents(on, config) {
on('after:run', (results) => {
/* ... */
})
},
},
})
results (Object)
Results of the run, including the total number of passes/failures/etc, the project config, and details about the browser and system. It is the same as the results object resolved by the Module API.
Results are only provided when running via cypress run
. When running via
cypress open
, the results will be undefined.
Usage
You can return a promise from the after:run
event handler and it will be
awaited before Cypress proceeds running your specs.
Log the number of passed tests of a run
- cypress.config.js
- cypress.config.ts
const { defineConfig } = require('cypress')
module.exports = defineConfig({
// setupNodeEvents can be defined in either
// the e2e or component configuration
e2e: {
setupNodeEvents(on, config) {
module.exports = (on, config) => {
on('after:run', (results) => {
// results will look something like this when run via `cypress run`:
// {
// totalDuration: 81,
// totalSuites: 0,
// totalTests: 1,
// totalFailed: 0,
// totalPassed: 1,
// totalPending: 0,
// totalSkipped: 0,
// browserName: 'electron',
// browserVersion: '59.0.3071.115',
// osName: 'darwin',
// osVersion: '16.7.0',
// cypressVersion: '3.1.0',
// config: {
// projectId: '1qv3w7',
// baseUrl: 'http://example.com',
// viewportWidth: 1000,
// viewportHeight: 660,
// // ... more properties...
// }
// // ... more properties...
// }
// }
if (results) {
// results will be undefined in interactive mode
console.log(
results.totalPassed,
'out of',
results.totalTests,
'passed'
)
}
})
}
},
},
})
import { defineConfig } from 'cypress'
export default defineConfig({
// setupNodeEvents can be defined in either
// the e2e or component configuration
e2e: {
setupNodeEvents(on, config) {
module.exports = (on, config) => {
on('after:run', (results) => {
// results will look something like this when run via `cypress run`:
// {
// totalDuration: 81,
// totalSuites: 0,
// totalTests: 1,
// totalFailed: 0,
// totalPassed: 1,
// totalPending: 0,
// totalSkipped: 0,
// browserName: 'electron',
// browserVersion: '59.0.3071.115',
// osName: 'darwin',
// osVersion: '16.7.0',
// cypressVersion: '3.1.0',
// config: {
// projectId: '1qv3w7',
// baseUrl: 'http://example.com',
// viewportWidth: 1000,
// viewportHeight: 660,
// // ... more properties...
// }
// // ... more properties...
// }
// }
if (results) {
// results will be undefined in interactive mode
console.log(
results.totalPassed,
'out of',
results.totalTests,
'passed'
)
}
})
}
},
},
})