junit2json

Crates.iojunit2json
lib.rsjunit2json
version
sourcesrc
created_at2023-08-19 00:42:59.036976
updated_at2024-12-10 12:36:22.429773
descriptionA tool convert JUnit XML format to JSON with Rust
homepagehttps://github.com/Kesin11/junit2json-rs
repositoryhttps://github.com/Kesin11/junit2json-rs
max_upload_size
id948437
Cargo.toml error:TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include`
size0
Kenta Kase (Kesin11)

documentation

README

junit2json-rs

CI Crates.io

junit2json-rs is a tool to convert JUnit XML format to JSON. From a library perspective, it provides a function to serialize Junit XML to Struct.

junit2json-rs is a reimplementation of ts-junit2json that is my previous work in TypeScript.

Purpose

junit2json-rs is designed for uploading test result data to BigQuery or any other DB that supports JSON.

Many languages and test frameworks support to output test result data as JUnit XML format, which is de fact standard in today. On the other hand, most DBs do not support to import XML but support JSON.

For this purpose, junit2json-rs provides a simple JUnit XML to JSON converter.

Install

cargo install junit2json

Usage

junit2json -p <junit_xml_file>

Output example

{
  "testsuites": {
    "name": "gcf_junit_xml_to_bq_dummy",
    "time": 8.018,
    "tests": 12,
    "failures": 2,
    "testsuite": [
      {
        "name": "__tests__/gen_dummy_junit/dummy1.test.js",
        "tests": 4,
        "failures": 1,
        "errors": 0,
        "time": 4.772,
        "skipped": 0,
        "timestamp": "2020-01-12T16:33:13",
        "testcase": [
          {
            "name": "dummy1 Always success tests should be wait 0-2sec",
            "classname": "dummy1 Always success tests should be wait 0-2sec",
            "time": 0.414
          },
          {
            "name": "dummy1 Always success tests should be wait 1-3sec",
            "classname": "dummy1 Always success tests should be wait 1-3sec",
            "time": 1.344
          },
          {
            "name": "dummy1 Randomly fail tests should be wait 0-1sec and fail 50%",
            "classname": "dummy1 Randomly fail tests should be wait 0-1sec and fail 50%",
            "time": 0.673,
            "failure": {
              "inner": "Error: expect(received).toBeGreaterThan(expected)\n\nExpected: > 50\nReceived:   4.897277513425746\n    at Object.it (/Users/kesin/github/gcf_junit_xml_to_bq/__tests__/gen_dummy_junit/dummy1.test.js:22:17)"
            }
          },
          {
            "name": "dummy1 Randomly fail tests should be wait 1-2sec and fail 30%",
            "classname": "dummy1 Randomly fail tests should be wait 1-2sec and fail 30%",
            "time": 1.604
          }
        ]
      },
      {
        "name": "__tests__/gen_dummy_junit/dummy3.test.js",
        "tests": 4,
        "failures": 1,
        "errors": 0,
        "time": 6.372,
        "skipped": 0,
        "timestamp": "2020-01-12T16:33:13",
        "testcase": [
          {
            "name": "dummy3 Always success tests should be wait 0-2sec",
            "classname": "dummy3 Always success tests should be wait 0-2sec",
            "time": 1.328
          },
          {
            "name": "dummy3 Always success tests should be wait 1-3sec",
            "classname": "dummy3 Always success tests should be wait 1-3sec",
            "time": 2.598
          },
          {
            "name": "dummy3 Randomly fail tests should be wait 0-1sec and fail 30%",
            "classname": "dummy3 Randomly fail tests should be wait 0-1sec and fail 30%",
            "time": 0.455,
            "failure": {
              "inner": "Error: expect(received).toBeGreaterThan(expected)\n\nExpected: > 30\nReceived:   12.15901879426653\n    at Object.it (/Users/kesin/github/gcf_junit_xml_to_bq/__tests__/gen_dummy_junit/dummy3.test.js:22:17)"
            }
          },
          {
            "name": "dummy3 Randomly fail tests should be wait 1-2sec and fail 20%",
            "classname": "dummy3 Randomly fail tests should be wait 1-2sec and fail 20%",
            "time": 1.228
          }
        ]
      }
    ]
  }
}

With jq examples

Show testsuites test count

junit2json <junit_xml_file> | jq .testsuites.tests

Show testsuite names

junit2json <junit_xml_file> | jq .testsuites.testsuite[].name

Show testcase classnames

junit2json <junit_xml_file> | jq .testsuites.testsuite[].testcase[].classname

Notice

[!IMPORTANT] junit2json-rs has some major changes from ts-junit2json. Most of the changes are to compliant with the JUnit XML Schema.

  • A testsuites or testsuite key appears in the root of JSON.
  • properties has property array. ts-junit2json has property array of object directly.
  • skipped, error, failure are object, not array of object.
  • If XML has undefined tag, it will be ignored. ts-junit2json will be converted to JSON if possible.

Referenced JUnit XML Schema:

CLI Options

A tool convert JUnit XML format to JSON with Rust

Usage: junit2json [OPTIONS] <PATH>

Arguments:
  <PATH>  JUnit XML path

Options:
  -p, --pretty                     Output pretty JSON
  -f, --filter-tags <FILTER_TAGS>  Filter XML tag names [possible values: system-out, system-err]
  -h, --help                       Print help
  -V, --version                    Print version

WASI

junit2json-rs also provides WASI executable.

If you have wasm runtime (ex. wasmtime), you can execute junit2json.wasm that can download from GitHub Releases instead of native binary.

wasmtime junit2json.wasm --dir=. -- -p <junit_xml_file>

Development

Setup

You can use DevContainer or Codespaces. Please see devcontainer.json.

Build

Build native binary

cargo build
cargo build --release

Build WASI

cargo wasi build --release

Test

# Run test
cargo nextest run

# Update snapshot
## Need to install cargo-insta first.
## `cargo install cargo-insta`
cargo insta review

License

MIT

Commit count: 196

cargo fmt