A Jest reporter that creates compatible junit xml files
Note: as of jest-junit 11.0.0 NodeJS >= 10.12.0 is required.
yarn add --dev jest-junitIn your jest config add the following entry:
{
  "reporters": [ "default", "jest-junit" ]
}Then simply run:
jestFor your Continuous Integration you can simply do:
jest --ci --reporters=default --reporters=jest-junitThe support for testResultsProcessor is only kept for legacy reasons and might be removed in the future.
You should therefore prefer to configure jest-junit as a reporter.
Should you still want to, add the following entry to your jest config:
{
  "testResultsProcessor": "jest-junit"
}Then simply run:
jestFor your Continuous Integration you can simply do:
jest --ci --testResultsProcessor="jest-junit"jest-junit offers several configurations based on environment variables or a jest-junit key defined in package.json or a reporter option.
Environment variable and package.json configuration should be strings.
Reporter options should also be strings exception for suiteNameTemplate, classNameTemplate, titleNameTemplate that can also accept a function returning a string.
| Environment Variable Name | Reporter Config Name | Description | Default | Possible Injection Values | 
|---|---|---|---|---|
| JEST_SUITE_NAME | suiteName | nameattribute of<testsuites> | "jest tests" | N/A | 
| JEST_JUNIT_OUTPUT_DIR | outputDirectory | Directory to save the output. Relative path outside of project root (e.g. in monorepos) has to be prefixed with <rootDir>literal, e.g.<rootDir>/../coverage | process.cwd() | N/A | 
| JEST_JUNIT_OUTPUT_NAME | outputName | File name for the output. | "junit.xml" | N/A | 
| JEST_JUNIT_OUTPUT_FILE | outputFile | Fullpath for the output. If defined, outputDirectoryandoutputNamewill be overridden | undefined | N/A | 
| JEST_JUNIT_UNIQUE_OUTPUT_NAME | uniqueOutputName | Create unique file name for the output leveraging the outputNameas a prefix if given${outputName}-${uuid}.xmlor a default ofjunit.xml-${uuid}.xmlifoutputNameis not specified, overridesoutputName | false | N/A | 
| JEST_JUNIT_SUITE_NAME | suiteNameTemplate | Template string for nameattribute of the<testsuite>. | "{title}" | {title},{filepath},{filename},{displayName} | 
| JEST_JUNIT_CLASSNAME | classNameTemplate | Template string for the classnameattribute of<testcase>. | "{classname} {title}" | {classname},{title},{suitename},{filepath},{filename},{displayName} | 
| JEST_JUNIT_TITLE | titleTemplate | Template string for the nameattribute of<testcase>. | "{classname} {title}" | {classname},{title},{filepath},{filename},{displayName} | 
| JEST_JUNIT_ANCESTOR_SEPARATOR | ancestorSeparator | Character(s) used to join the describeblocks. | " " | N/A | 
| JEST_JUNIT_ADD_FILE_ATTRIBUTE | addFileAttribute | Add file attribute to the output (validated on CIRCLE CI and GitLab CI). Must be a string. | "false" | N/A | 
| JEST_JUNIT_FILE_PATH_PREFIX | filePathPrefix | Prefix to add to the test suite file path. The value will be prefixed using path.join. Useful in case of monorepo | "" | N/A | 
| JEST_JUNIT_INCLUDE_CONSOLE_OUTPUT | includeConsoleOutput | Adds console output to any testSuite that generates stdout during a test run. | false | N/A | 
| JEST_JUNIT_INCLUDE_SHORT_CONSOLE_OUTPUT | includeShortConsoleOutput | Adds short console output (only message value) to any testSuite that generates stdout during a test run. | false | N/A | 
| JEST_JUNIT_REPORT_TEST_SUITE_ERRORS | reportTestSuiteErrors | Reports test suites that failed to execute altogether as error. Note: since the suite name cannot be determined from files that fail to load, it will default to file path. | false | N/A | 
| JEST_JUNIT_NO_STACK_TRACE | noStackTrace | Omit stack traces from test failure reports, similar to jest --noStackTrace | false | N/A | 
| JEST_USE_PATH_FOR_SUITE_NAME | usePathForSuiteName | DEPRECATED. Use suiteNameTemplateinstead. Use file path as thenameattribute of<testsuite> | "false" | N/A | 
| JEST_JUNIT_TEST_CASE_PROPERTIES_JSON_FILE | testCasePropertiesFile | Name of the custom testcase properties file | "junitProperties.js" | N/A | 
| JEST_JUNIT_TEST_CASE_PROPERTIES_DIR | testCasePropertiesDirectory | Location of the custom testcase properties file | process.cwd() | N/A | 
| JEST_JUNIT_TEST_SUITE_PROPERTIES_JSON_FILE | testSuitePropertiesFile | Name of the custom testsuite properties file | "junitTestCaseProperties.js" | N/A | 
| JEST_JUNIT_TEST_SUITE_PROPERTIES_DIR | testSuitePropertiesDirectory | Location of the custom testsuite properties file | process.cwd() | N/A | 
You can configure these options via the command line as seen below:
JEST_SUITE_NAME="Jest JUnit Unit Tests" JEST_JUNIT_OUTPUT_DIR="./artifacts" jestOr you can also define a jest-junit key in your package.json.  All are string values.
{
  ...
  "jest-junit": {
    "suiteName": "jest tests",
    "outputDirectory": ".",
    "outputName": "junit.xml",
    "uniqueOutputName": "false",
    "classNameTemplate": "{classname}-{title}",
    "titleTemplate": "{classname}-{title}",
    "ancestorSeparator": " › ",
    "usePathForSuiteName": "true"
  }
}
Or you can define your options in your reporter configuration.
// jest.config.js
{
  reporters: [
    "default",
    [ "jest-junit", { suiteName: "jest tests" } ]
  ]
}If using the usePathForSuiteName and suiteNameTemplate, the usePathForSuiteName value will take precedence. ie: if usePathForSuiteName=true and suiteNameTemplate="{filename}", the filepath will be used as the name attribute of the <testsuite> in the rendered jest-junit.xml).
Below are some example configuration values and the rendered .xml to created by jest-junit.
The following test defined in the file /__tests__/addition.test.js will be used for all examples:
describe('addition', () => {
  describe('positive numbers', () => {
    it('should add up', () => {
      expect(1 + 2).toBe(3);
    });
  });
});The default output:
<testsuites name="jest tests">
  <testsuite name="addition" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:42:28" time="0.161">
    <testcase classname="addition positive numbers should add up" name="addition positive numbers should add up" time="0.004">
    </testcase>
  </testsuite>
</testsuites>Using the classNameTemplate and titleTemplate:
JEST_JUNIT_CLASSNAME="{classname}" JEST_JUNIT_TITLE="{title}" jestrenders
<testsuites name="jest tests">
  <testsuite name="addition" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:45:42" time="0.154">
    <testcase classname="addition positive numbers" name="should add up" time="0.005">
    </testcase>
  </testsuite>
</testsuites>Using the ancestorSeparator:
JEST_JUNIT_ANCESTOR_SEPARATOR=" › " jestrenders
<testsuites name="jest tests">
  <testsuite name="addition" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:47:12" time="0.162">
    <testcase classname="addition › positive numbers should add up" name="addition › positive numbers should add up" time="0.004">
    </testcase>
  </testsuite>
</testsuites>Using the suiteNameTemplate:
JEST_JUNIT_SUITE_NAME ="{filename}" jest<testsuites name="jest tests">
  <testsuite name="addition.test.js" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:42:28" time="0.161">
    <testcase classname="addition positive numbers should add up" name="addition positive numbers should add up" time="0.004">
    </testcase>
  </testsuite>
</testsuites>Using classNameTemplate as a function in reporter options
// jest.config.js
{
  reporters: [
    "default",
      [
        "jest-junit",
        {
          classNameTemplate: (vars) => {
            return vars.classname.toUpperCase();
          }
        }
      ]
  ]
}renders
<testsuites name="jest tests">
  <testsuite name="addition" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:42:28" time="0.161">
    <testcase classname="ADDITION POSITIVE NUMBERS" name="addition positive numbers should add up" time="0.004">
    </testcase>
  </testsuite>
</testsuites>New feature as of jest-junit 11.0.0!
Create a file in your project root directory named junitProperties.js:
module.exports = () => {
  return {
    key: "value",
  };
};Will render
<testsuites name="jest tests">
  <testsuite name="addition" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:42:28" time="0.161">
    <properties>
      <property name="key" value="value" />
    </properties>
    <testcase classname="addition positive numbers should add up" name="addition positive numbers should add up" time="0.004">
    </testcase>
  </testsuite>
</testsuites>Create a file in your project root directory named junitTestCaseProperties.js:
module.exports = (testResult) => {
  return {
    "dd_tags[test.invocations]": testResult.invocations,
  };
};Will render
<testsuites name="jest tests">
  <testsuite name="addition" tests="1" errors="0" failures="0" skipped="0" timestamp="2017-07-13T09:42:28" time="0.161">
    <testcase classname="addition positive numbers should add up" name="addition positive numbers should add up" time="0.004">
      <properties>
        <property name="dd_tags[test.invocations]" value="1" />
      </properties>
    </testcase>
  </testsuite>
</testsuites>WARNING: Properties for testcases is not following standard JUnit XML schema.
However, other consumers may support properties for testcases like DataDog metadata through <property> elements