victorolinasc / junit-formatter

A JUnit XML report exporter for Elixir's ExUnit
https://hexdocs.pm/junit_formatter/
Apache License 2.0
111 stars 37 forks source link
elixir junit-report testing

JUnitFormatter

Build Status Hex Version Documentation Downloads Coverage Status Last Updated

A simple ExUnit Formatter that collects test results and generates an XML report in JUnit format. This is intended to be used by tools that can produce a graphical report, mainly targeted at Jenkins and its support for JUnit.

The report is generated in Mix.Project.app_path folder with a default filename of test-junit-report.xml. It can be configured through application configuration on the key report_file (application :junit_formatter).

Versions 3+ require minimum Elixir version to be 1.5+. For older releases, please use version 2.2 of this library.

Usage

First, add JUnitFormatter to the dependencies in your mix.exs:

  defp deps do
    [
      {:junit_formatter, "~> 3.4", only: [:test]}
    ]
  end

Next, add JUnitFormatter to your ExUnit configuration in test/test_helper.exs file. It should look like this:

ExUnit.configure formatters: [JUnitFormatter]
ExUnit.start

If you want to keep using the default formatter alongside the JUnitFormatter your test/test_helper.exs file should look like this:

ExUnit.configure formatters: [JUnitFormatter, ExUnit.CLIFormatter]
ExUnit.start

Then run your tests like normal:

....

Finished in 0.1 seconds (0.07s on load, 0.08s on tests)
4 tests, 0 failures

Randomized with seed 600810

The JUnit style XML report for this project looks like this:

<?xml version="1.0"?>
<testsuites>
    <testsuite errors="0" failures="0" name="Elixir.FormatterTest" tests="4" time="82086">
        <testcase classname="Elixir.FormatterTest" name="test it counts raises as failures" time="16805"/>
        <testcase classname="Elixir.FormatterTest" name="test that an invalid test generates a proper report" time="16463"/>
        <testcase classname="Elixir.FormatterTest" name="test that a valid test generates a proper report" time="16328"/>
        <testcase classname="Elixir.FormatterTest" name="test valid and invalid tests generates a proper report" time="32490"/>
    </testsuite>
</testsuites>

Note: This example has been reformatted for readability.

Options

JUnitFormatter accepts 6 options that can be passed in config.exs (or equivalent environment configuration for tests):

Example configuration:

config :junit_formatter,
  report_file: "report_file_test.xml",
  report_dir: "/tmp",
  print_report_file: true,
  prepend_project_name?: true,
  include_filename?: true

This would generate the report at: /tmp/myapp-report_file_test.xml.

Umbrella projects

JUnitFormatter works with umbrella projects too. By default, it will generate the XML report on each sub-project build folder. So, as an example, if you have two apps (my-app and another) it will generate the following reports:

This works without any extra configuration. There are times, though, where you want to customize the directory where the reports are generated. Let's say you add this configuration:

config :junit_formatter,
  report_dir: "/tmp"

Then, while running in an umbrella project, the first sub-project will run and generate a report file the following path:

The next one will do the same OVERRIDING the first one. So, in order to avoid this, you can use the configuration option prepend_project_name? so that the result would be:

If you want to use a consistent report filename, and instead place the reports under a subdirectory per application, then set the use_project_subdirectory? configuration flag to true. Using this configuration would result in the following file layout:

If you want to specify the paths to the test files in the report relative to the root of the umbrella project, not the individual application, then set project_dir. In your umbrella configuration file, at config/test.exs, if you set the following configuration:

config :junit_formatter,
  project_dir: Path.expand("..", __DIR__)

Then in your report, a test file within your umbrella at apps/my_app/test/my_app_test.exs will be specified within the report as apps/my_app/test/my_app_test.exs. If you leave project_dir unset it would instead be specified as test/my_app_test.exs.

Integrating on CI systems

Most CIs have a way for uploading test reports. This is a nice way to understand what failed on your build. Most of them use the JUnit report file format to provide this feature.

LICENSE

This project is available under Apache Public License version 2.0. See LICENSE.