RuboCop に JUnit フォーマッタを組み込んだ

JUnitXML フォーマッタが CircleCI 利用時に有用だけれど gem の方がメンテナンスされていなくて、コアで巻き取ってもらえないかというイシューに対応した。

github.com

次にリリースされる予定の RuboCop 0.80 から --format junit オプション (あるいは --format ju) で使えるようになる。

% rubocop --format junit
<?xml version='1.0'?>
<testsuites>
  <testsuite name='rubocop'>
    <testcase classname='example' name='Style/FrozenStringLiteralComment'>
      <failure type='Style/FrozenStringLiteralComment' message='Style/FrozenStringLiteralComment: Missing frozen string literal comment.'>
        /tmp/src/example.rb:1:1
      </failure>
    </testcase>
    <testcase classname='example' name='Naming/MethodName'>
      <failure type='Naming/MethodName' message='Naming/MethodName: Use snake_case for method names.'>
        /tmp/src/example.rb:1:5
      </failure>
    </testcase>
    <testcase classname='example' name='Lint/DeprecatedClassMethods'>
      <failure type='Lint/DeprecatedClassMethods' message='Lint/DeprecatedClassMethods: `File.exists?` is deprecated in favor of `File.exist?`.'>
        /tmp/src/example.rb:2:8
      </failure>
    </testcase>
  </testsuite>
</testsuites>

これまでの JUnit フォーマットプラグインを見たところでは以下のふたつがあり、今回は報告のあったのと利用量が多そうだった前者をベースに組み込んでいる。

master ブランチにマージされているので、次の RuboCop のリリースで入る予定。個人的には JUnit という古来からのフォーマットの活用事例ということは、コアでメンテナンスして良いという大きな判断要素だった。

本体でサポートすることになったので、gem 依存で使っているアプリケーションでは Gemfile 記載の依存を減らせるかなと思います。一方で実装としては Ruby 2.8.0-dev (Ruby 3.0) で添付から外された REXML に依存するので、以降内部的には REXML への依存が入ります。