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
80 lines (68 loc) • 3.27 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 getScreenshotArray(screenshotName, retry) {
const screenshots = []
const extension = ".png"
const baseNameWithoutExt = screenshotName.slice(0, -extension.length)
// Add the first screenshot (attempt 1)
screenshots.push(screenshotName)
// Add screenshots for each retry
for (let i = 1; i <= retry; i++) {
if (screenshotName.length >= 250) {
// For long names, use numbered format: "abc....abcd (1).png", "abc....abcd (2).png"
screenshots.push(`${baseNameWithoutExt} (${i})${extension}`)
} else {
// For normal names, add attempt number: "fail -- fail testCase 1.1 (failed) (attempt 2).png"
screenshots.push(`${baseNameWithoutExt} (attempt ${i + 1})${extension}`)
}
}
return screenshots
}
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)
const screenshotArray = getScreenshotArray(screenshotName, test.currentRetry)
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 (screenshotArray) test.screenshot.screenshotArray = screenshotArray
else throw new Error(`Failed to screenshot array 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