#junit #xml-format #format-json #convert #serialization

bin+lib junit2json

一个使用 Rust 将 JUnit XML 格式转换为 JSON 的工具

14 个版本

0.2.7 2024 年 5 月 4 日
0.2.6 2024 年 3 月 3 日
0.2.5 2024 年 2 月 3 日
0.2.4 2024 年 1 月 27 日
0.1.0 2023 年 8 月 20 日

#133 in 测试

MIT 许可证

27KB
274

junit2json-rs

CI Crates.io

junit2json-rs 是一个将 JUnit XML 格式转换为 JSON 的工具。从库的角度来看,它提供了一个将 Junit XML 序列化为 Struct 的函数。

junit2json-rs 是对我之前在 TypeScript 中工作的 ts-junit2json 的重写。

目的

junit2json-rs 设计用于将测试结果数据上传到 BigQuery 或任何支持 JSON 的数据库。

许多语言和测试框架支持以 JUnit XML 格式输出测试结果数据,这在今天实际上是标准格式。另一方面,大多数数据库不支持导入 XML,但支持 JSON。

为此,junit2json-rs 提供了一个简单的 JUnit XML 到 JSON 转换器。

安装

cargo install junit2json

用法

junit2json -p <junit_xml_file>

输出示例

{
  "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
          }
        ]
      }
    ]
  }
}

使用 jq 示例

显示测试套件测试计数

junit2json <junit_xml_file> | jq .testsuites.tests

显示测试套件名称

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

显示测试用例类名

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

注意

[!IMPORTANT] 与 ts-junit2json 相比,junit2json-rs 有一些重大变化。其中大部分变化是为了符合 JUnit XML Schema。

  • JSON 的根中出现了 testsuitestestsuite 键。
  • propertiesproperty 数组。ts-junit2json 直接有 property 对象数组。
  • skippederrorfailure 是对象,不是对象数组。
  • 如果 XML 有未定义的标签,它将被忽略。ts-junit2json 尽可能地转换为 JSON。

参考 JUnit XML Schema

命令行选项

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 也提供了 WASI 可执行文件。

如果您有 wasm 运行时(例如 wasmtime),您可以执行从 GitHub 发布 下载的 junit2json.wasm,而不是本地二进制文件。

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

开发

设置

您可以使用 DevContainer 或 Codespaces。请参阅 devcontainer.json

构建

构建本地二进制文件

cargo build
cargo build --release

构建WASI

cargo wasi build --release

测试

# Run test
cargo nextest run

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

许可

MIT

依赖项

~4.5MB
~82K SLoC