Skip to content

Instantly share code, notes, and snippets.

@dopry
Last active April 13, 2023 11:25
Show Gist options
  • Save dopry/691e6b21170b55c41768d02dc059c48b to your computer and use it in GitHub Desktop.
Save dopry/691e6b21170b55c41768d02dc059c48b to your computer and use it in GitHub Desktop.
jest-mochawesome-reporter
// based on https://gist.github.com/Prophet32j/05a2ceda3743b9fd93e98e56a9227309
const fs = require('fs');
const uuid = require('uuid-v4');
const buildMargeInput = (testResults) => {
let elapsed = buildElapsedTime(testResults.testResults);
let testSuites = testResults.testResults.map(createSuite);
var input = {};
input.stats = {
suites: testResults.numTotalTestSuites,
tests: testResults.numTotalTests,
testsRegistered: testResults.numTotalTests,
passes: testResults.numPassedTests,
pending: testResults.numPendingTests,
failures: testResults.numFailedTests,
start: new Date(testResults.startTime), // Jest does epochs
end: new Date(testResults.startTime + elapsed),
duration: elapsed,
passPercent: testResults.numPassedTests / testResults.numTotalTests * 100,
pendingPercent: testResults.numPendingTests / testResults.numTotalTests * 100,
other: 0,
hasOther: false,
skipped: 0,
hasSkipped: false,
};
input.results = testSuites;
return input;
}
function createSuite(suite) {
let id = uuid();
let tests = suite.testResults.map((test) => {
return createTest(test, id);
});
let passes = tests.filter(test => test.pass).map(test => test.uuid);
let failures = tests.filter(test => test.fail).map(test => test.uuid);
let pending = tests.filter(test => test.pending).map(test => test.uuid);
return {
title: suite.testResults[0].ancestorTitles[0],
suites: [],
tests: tests,
pending: pending,
root: false,
uuid: id,
_timeout: 5000,
fullFile: suite.testFilePath,
file: suite.testFilePath.split('/').pop(),
beforeHooks: [],
afterHooks: [],
passes: passes,
failures: failures,
skipped: [],
duration: suite.perfStats.end - suite.perfStats.start
}
}
function createTest(test, parentId) {
return {
title: test.title,
fullTitle: fullTitle(test),
timedOut: false,
duration: test.duration,
pass: passed(test),
fail: failed(test),
pending: pending(test),
code: '',
// isRoot: false,
uuid: uuid(),
parentUUID: parentId,
skipped: false,
isHook: false,
err: {}
}
}
function passed(test) {
return test.status === 'passed';
}
function failed(test) {
return test.status === 'failed';
}
function pending(test) {
return test.status === 'pending';
}
function fullTitle(test) {
if (test.fullName) {
return test.fullName;
}
return test.ancestorTitles.reduce((sum, val) => {
sum + val + ' ';
}, '');
}
function buildElapsedTime(suites) {
return suites.reduce((sum, suite) => {
return sum + suite.testResults.reduce((_sum, test) => {
return _sum + test.duration;
}, 0);
}, 0);
}
function writeOutput(payload, filepath) {
const json = JSON.stringify(payload);
fs.writeFile(filepath, json, 'utf8', (err) => {
if (err) { throw err; }
console.log('file saved');
});
}
/**
* TODO: Extend BaseReporter
*/
class JestMochawesomeReporter { // extends BaseReporter {
constructor(globalConfig, options) {
this._globalConfig = globalConfig
this._options = options
}
onRunComplete(contexts, results) {
const report = buildMargeInput(results);
writeOutput(report, `${this._globalConfig.rootDir}/jest-mochawesome.json`)
}
}
module.exports = JestMochawesomeReporter
module.exports = {
reporters: [
["./jest-mochawesome.js", {}]
]
};
@dopry
Copy link
Author

dopry commented Dec 31, 2020

This only outputs the mochawesome.json, you need to run marge separately. I'm pretty sure it doesn't fully adapt the jest results to mocha, but it seems to produce at least basic output in marge.

@AdiSchwartz869
Copy link

Hi,
This is great!
Is there an option to get the test code/failureMessages as well?

@DevDengChao
Copy link

This dose not works with @jest/reporters 29.0.3.
As it does not have the method execute(ReporteContext).

        _istanbulReports()
          .default.create(reporter, {
            maxCols: process.stdout.columns || Infinity,
            ...additionalOptions
          })
          .execute(reportContext); // ERROR: TypeError: _istanbulReports(...).default.create(...).execute is not a function

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment