cypress-xray-junit-reporter
Version:
Cypress Reporter | Enhances your Cypress test suite with the cypress-xray-junit-reporter a specialized custom reporter designed to seamlessly generating comprehensive XRay-compatible JUnit-style XML reports, complete with embedded screenshots on test fail
47 lines (40 loc) • 2.37 kB
JavaScript
const sanitize = require('sanitize-filename');
const path = require('path');
function addParentsTitle(runnable) {
const titles = [];
let currentRunnable = runnable;
while (currentRunnable?.parent?.title) {
titles.unshift(sanitize(currentRunnable.parent.title));
currentRunnable = currentRunnable.parent;
}
return titles.join(' -- ');
}
function getRelativeFolderArray(Cypress) {
return `${Cypress.spec.relative.replace(/\\/g, path.sep)}`.split(path.sep).slice(2);
}
function getScreenshotName(test, runnable) {
return `${addParentsTitle(runnable)} -- ${sanitize(test.title)} (failed)`.slice(0, 250) + '.png';
}
function support(Cypress, cy, afterEach) {
Cypress.on('test:after:run', (test, runnable) => {
if (test.state === 'failed' && Cypress.config('screenshotOnRunFailure') === true) {
const screenshotsFolder = Cypress.config('screenshotsFolder').replace(/\\/g, path.sep);
const relativeFoldersArray = getRelativeFolderArray(Cypress);
const screenshotName = getScreenshotName(test, runnable);
test.screenshot = test.screenshot || {}; // Ensure test.screenshot is an object
if (screenshotsFolder) test.screenshot.screenshotsFolder = screenshotsFolder; else throw new Error(`Failed to retrieve screenshotFolder for test ${test.title}`);
if (relativeFoldersArray) test.screenshot.relativeFoldersArray = relativeFoldersArray; else throw new Error(`Failed to build relative screenshot path for test ${test.title}`);
if (screenshotName) test.screenshot.screenshotName = screenshotName; else throw new Error(`Failed to screenshot name for test ${test.title}`);
}
});
if (!Cypress.config().isInteractive && Cypress.config().reporter !== 'spec' && Cypress.config().betterRetries) {
afterEach(() => {
const test = cy.state('runnable').ctx.currentTest;
if (test.state === 'failed' && Cypress.currentRetry < test._retries) {
cy.task('logColoredText', { color: 'yellow', text: ` ${test.title} (Attempt ${Cypress.currentRetry + 1} of ${test._retries + 1})` }, { log: false });
cy.task('logColoredText', { color: 'red', text: ` ${test.err.parsedStack[0].message}` }, { log: false });
}
});
}
}
module.exports = support;