junit-report-merger

Merges multiple JUnit XML reports into one.

Usage no npm install needed!

<script type="module">
  import junitReportMerger from 'https://cdn.skypack.dev/junit-report-merger';
</script>

README

junit-report-merger

NPM version NPM downloads codecov MIT License

Merges multiple JUnit XML reports into one.

Reporters of many testing frameworks generate JUnit XML reports. mocha-junit-reporter, karma-junit-reporter to name a few. Sometimes there is a need to combine multiple reports together in a single file. This is what junit-report-merger does.

junit-report-merger creates a new test results report in JUnit XML format by collecting all <testsuite> elements from all XML reports and putting them together.

CLI

Package provides a jrm binary, which you can use to merge multiple xml reports into one.
In a nutshell it is a tiny wrapper around mergeFiles api.

Installing

Globally

npm install -g junit-report-merger

In this case you'll be able to execute jrm binary from within your shell.

Locally

npm install junit-report-merger --save-dev

In this case jrm binary will be available only inside package.json scripts:

scripts: {
    "merge-reports": "jrm combined.xml \"results/*.xml\""
}

Usage

Assuming your JUnit test results are in ./results/units/ folder, and you want to get a combined test result file in ./results/combined.xml:

jrm ./results/combined.xml "./results/units/*.xml"

You can also specify multiple glob patterns:

jrm ./results/combined.xml "./results/units/*.xml" "./results/e2e/*.xml"

NOTE
Make sure to wrap each pattern with double quotes ("), otherwise your shell may try to expand it instead of passing to Node.js.

API

Package exports a single object with the following methods.

mergeFiles - Merges contents of multiple XML report files into a single XML report file.

mergeStreams - Merges contents of multiple XML report streams into a single XML report stream.

mergeToString - Merges multiple XML report strings into a single XML report string.

Usage

const path = require('path')
const { mergeFiles } = require('junit-report-merger')

const outputFile = path.join(__dirname, 'results', 'combined.xml')

const inputFiles = ['./results/units/*.xml', './results/e2e/*.xml']

try {
  await mergeFiles(outputFile, inputFiles)
  console.log('Merged, check ./results/combined.xml')
} catch (err) {
  console.error(error)
}

mergeFiles

Signature:

mergeFiles(
    destFilePath: string,
    srcFilePathsOrGlobPatterns: string[],
    options?: MergeFilesOptions
) => Promise<void>

mergeFiles(
    destFilePath: string,
    srcFilePathsOrGlobPatterns: string[],
    options: MergeFilesOptions,
    cb: (err?: Error) => void
) => void

Reads multiple files, merges their contents and write into the given file.

Param Type Description
destFilePath string Where the output should be stored. Denotes a path to file. If file already exists, it will be overwritten.
srcFilePathsOrGlobPatterns string[] Paths to the files which should be merged. You can also specify glob patterns, such as results/**/report-*.xml
[options] MergeFilesOptions Merge options.
[cb] (err?: Error) => void Callback function which will be called at completion. Will receive error as first argument if any.

Last argument - cb is a Node.js style callback function. If callback function is not passed, function will return a promise. That is, all the following variants will work:

// options passed, callback style
mergeFiles(destFilePath, srcFilePaths, {}, (err) => {})

// options missing, callback style
mergeFiles(destFilePath, srcFilePaths, (err) => {})

// options passed, promise style
await mergeFiles(destFilePath, srcFilePaths, {})

// options missing, promise style
await mergeFiles(destFilePath, srcFilePaths)

MergeFilesOptions

These are the options accepted by mergeFiles.

Signature:

type MergeFilesOptions = {
    onFileMatched? (matchInfo: {
        filePath: string
    }) => void
}

onFileMatched

mergeFiles calls function specified by the onFileMatched option once for each file matched by srcFilePaths, right before file processing begins.

mergeStreams

Signature:

mergeStreams(
    destStream: WritableStream,
    srcStreams: ReadableStream[],
    options?: {}
) => Promise<void>

mergeStreams(
    destStream: WritableStream,
    srcStreams: ReadableStream[],
    options: {},
    cb: (err?: Error) => void
) => void

Reads multiple streams, merges their contents and write into the given stream.

Param Type Description
destStream WritableStream A stream which will be used to write the merge result.
srcStreams ReadableStream[] Streams which will be used to read data from.
[options] object Merge options. Currently unused.
[cb] (err?: Error) => void Callback function which will be called at completion. Will receive error as first argument if any.

Last argument - cb is a Node.js style callback function. If callback function is not passed, function will return a promise. That is, all the following variants will work:

// options passed, callback style
mergeStreams(destStream, srcStreams, {}, (err) => {})

// options missing, callback style
mergeStreams(destStream, srcStreams, (err) => {})

// options passed, promise style
await mergeStreams(destStream, srcStreams, {})

// options missing, promise style
await mergeStreams(destStream, srcStreams)

mergeToString

Signature:

mergeToString(
    srcStrings: string[],
    options?: {}
) => string

Merges given XML strings and returns the result.

Param Type Description
srcStrings string[] Array of strings to merge together.
[options] object Merge options. Currently unused.

License

MIT (http://www.opensource.org/licenses/mit-license.php)