Coberuturaが3年ぶりに更新!?

つい先日、

という内容を書きましたが、調べてみたところ、Coberuturaが、約3年ぶりに更新を再開したみたいですね。


christ66 / cobertura - GitHub


どうやら、Java7対応に向けて、動き出したようです。


2013/07/01 追記

既に、結構時間が経ってしまっていますが、coberturaの新バージョンがリリースされていますね。

<dependency>
    <groupId>net.sourceforge.cobertura</groupId>
    <artifactId>cobertura</artifactId>
    <version>2.0.1</version>
</dependency>

でも、試そうと思ったら、Mavenプラグインの方は更新されていませんでした...

Java7以降におけるMavenでのカバレッジレポート


photo: http://www.flickr.com/photos/zzpza/

Java6がEOLとなったこともあり、コンパイルバージョンもJava7以降を指定するようになったので、標準的に利用するMavenカバレッジプラグインを見直しています。

Javaカバレッジツールとして、今のところ有名なものとしては、以下のものがあります。


Coberturaは、Javaカバレッジツールとしては情報量も実績も多くあります。私も、これまではCoberturaを使っていたのですが、Java7を利用するようになってからは、いろいろとエラーが発生するようになってしまいました。
JaCoCoは、情報量は少ないのですが、別のカバレッジツールであるEmmaを置き換えるためのカバレッジライブラリとして、EclEmma(Emmaを利用したEclipseプラグイン)の開発チームが、開発を進めてきたものです。

Coberturaでも、設定変更で対応できる場合もあるのですが、Cobertura自体、2年以上開発がストップしてしまっている状況でもあるので、今後はJaCoCoを利用しようかな、と考えています。


今回、それぞれの設定方法について調べたので、その内容をまとめておきます。

Cobertura レポート

基本設定をしてみる

まず初めに、Mavenにおけるコンパイルバージョンを1.7にした状態で、CoberturaのMavenプラグインであるcobertura-maven-pluginを設定して実行してみます。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>example</groupId>
  <artifactId>maven-coverage</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

  <properties>
    <jdk.version>1.7</jdk.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <site.encoding>UTF-8</site.encoding>
  </properties>

  <dependencies>
  <!-- Test -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>${jdk.version}</source>
            <target>${jdk.version}</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.2</version>
          <configuration>
            <locales>ja</locales>
            <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
            <outputEncoding>${site.encoding}</outputEncoding>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-report-plugin</artifactId>
        <reportSets>
          <reportSet>
            <reports>
              <report>report-only</report>
            </reports>
          </reportSet>
        </reportSets>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <configuration>
          <formats>
            <format>html</format>
            <format>xml</format>
          </formats>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

</project>

以下のコマンドにより、Mavenレポートを出力します。

  mvn clean site

しかしながら、そのまま実行すると、以下のようなエラーが出力されてしまいます。
(Coberturaのレポートはカバレッジが0%で出力されしまうのですが、Surefireのレポートの方で、エラーが出力されています)

java.lang.VerifyError: Expecting a stackmap frame at branch target ...

Java7ビルドのエラーを回避する

先ほどのエラーを回避するためには、JUitを実行するmaven-surefire-pluginプラグインの設定を以下のように変更します。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <argLine>-XX:-UseSplitVerifier</argLine>
    </configuration>
  </plugin>

今度は、カバレッジがきちんと出力されました。

それでも回避できないエラー

ただ、上記の設定をした場合でも、以下のようなエラーが発生するケースがあります。

  • テストケース実行時に ArrayIndexOutOfBoundsException が発生する
Caused by: java.lang.ArrayIndexOutOfBoundsException: 54
    at org.springframework.asm.Type.a(Unknown Source)
    at org.springframework.asm.Type.getType(Unknown Source)

これは、クラスパスに複数バージョンのasm.jarが存在するためのようです。
私の場合は、SpringFrameworkが依存関係に存在する場合に発生しました。
cobertura-maven-pluginのasm.jarを除外しようと思ったのですが、pom.xmlのreporting設定では、依存関係のjarを除外できないため、回避することができなさそうです。
また、このエラーも発生したり、しなかったりします。

  • テストクラスのコンパイル時に 「XxxXxx(クラス名)にアクセスできません」というエラーが発生する

Coberturaがテストクラスのコンパイルを行うときに発生します。
これも、Coberturaが行うコンパイル時の相性によって発生するようです。

JaCoCo レポート

基本設定をしてみる

JaCoCoのMavenプラグインである、jacoco-maven-pluginの設定を行います。
build設定の部分と、reporting設定の部分とで、2箇所に設定を行う必要があります。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>example</groupId>
  <artifactId>maven-coverage</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

  <properties>
    <jdk.version>1.7</jdk.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <site.encoding>UTF-8</site.encoding>
    <jacoco.include.package>example.*</jacoco.include.package>
  </properties>

  <dependencies>
  <!-- Test -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <source>${jdk.version}</source>
            <target>${jdk.version}</target>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.2</version>
          <configuration>
            <locales>ja</locales>
            <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
            <outputEncoding>${site.encoding}</outputEncoding>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <argLine>${jacocoArgs}</argLine>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>prepare-agent</id>
            <phase>test-compile</phase>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <configuration>
              <propertyName>jacocoArgs</propertyName>
              <includes>
                <include>${jacoco.include.package}</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-report-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>

</project>

JaCoCoに対して、カバレッジを出力したいパッケージのルートを指定するようにしてください。そうしないと、余計なjarを読み込もうとして、エラーが発生することがあります。
また、Coberturaの場合と違い、maven-surefire-report-pluginでは、「report-only」の設定を除外しています。JaCoCoでは、自動でテストが行われないため、レポートの出力と同時に、JUnitが実行されるようにしておく必要があります。

Mavenを実行すると、以下のようなHTMLレポートが出力されます。

日本語のディレクトリに注意

JaCoCoは、カバレッジデータを以下のファイルに出力します。

  <basedir>/target/jacoco.exec

このファイルは、の途中に日本語を含むディレクトリがあると、適切な場所に出力されません。
自分でも、ちょっとハマりました(汗)

今後に向けて

詳細は確認できていないのですが、CoberturaとJaCoCoでは、カバレッジの値が一部異なるようです。
この辺りは、差分が生じる理由を確認する必要がありそうです。

ただ、JaCoCoは、Jenkinsプラグインもあるようなので、通常利用する分には問題無さそうです。

また、試してはいませんが、JaCoCoは、ScalaやKotlin、Xtendなどのカバレッジにも対応するようなので、有用性は高そうですね。
ということで、今後は、JaCoCoを利用していこうと思います。

FindBugs2.0.2 バグパターンの日本語訳を公開

以前に、FindBugsのバグパターンの一覧を公開しました(このときは、バージョン1.3.4でした)。


今回、新たに、ウチの会社で、バージョン2.0.2の日本語訳を公開しました。

2013/1/21 FindBugs2.0.2に対応して、24件のルールを日本語訳し追加しました。

FindBugs version2.0.2 バグパターン詳細

何やら、エラーの詳細が分からない、というケースもあると思いますが、
そのようなときに、ぜひ活用してみてください!

本来、仕事とは楽しいモノである

今日は、いろいろなところで、新しいスーツを着た新入社員を見かけました。
当然ながら、ウチの会社でも入社式があり、新しい社員が入ってきました。


本日が社会人最初の日、ということで、一緒にランチに行ったのですが、そこで伝えたのが、

 『仕事は楽しいモノ』

という話。

#彼らの頭に残っているかどうかは、分かりませんがw


周りから良く聞こえて来る話で、社会人になると「大変だ」とか「自由が無くなる」とか、最初からネガティブな感じ満載な人がいる。

バイトなどで、楽しく仕事の経験をしてきた人でも、そのように言う人は多い。

サークルと部活の違い、みたないモノかもしれないが、サークルでちょっとやるぐらいなら楽しいけど、部活で本格的にやるとしたら大変なので嫌になる、ってことかな、と思っている。


でも、それって悲しいことだよね。

途中で、会社(場合によっては仕事自体)を変える人もいるけど、それでも人生40年は仕事を続ける人がほとんど。
それをネガティブに捉えていたら、もったいない。


仕事をしていけば、困難な壁にぶつかることも多いし、失敗もたくさんする。
確かに「楽」ではないと思うけど、自分の手で世の中に何かを生み出したり、人にサービスしたりすることって、「楽しい」ことだと思う。


私自身も、社会人となって10年が経ったが、幸いにも、自分なりに面白い仕事がやれてきているな、と思えている。

現在も、プロジェクトを同時に6個ぐらい抱えていて、大変ではあるのだが、

  • 先進的技術の調査・FW開発
  • 社内プロダクトの開発
  • 組織横断的なプロジェクト改善
  • 8年ぐらい付き合って頂いている、良い顧客に恵まれた案件
  • 自分で提案した内容が採択された案件

など、どれもやりがいがある仕事である。

それに加えて、勉強会を企画したり、海外のカンファレンスにチャレンジしたり、時には技術系雑誌の取材などを受けたりと、入社当時には全く想像していなかったこともやれている。

あれこれ悩みつつも行動してきたからこそ、得られたモノも多いし、それで結果が出たときは、やはり仕事は楽しいと思えるのである。


また、勉強会に参加したり、OSSの開発に関わったりする人は、それ自体でお金が稼げるわけではないのに、モチベーションは高い人が多い。
話を聞いてみると、「会社ではできないから、このような場でやりたいことをやる」という人が驚くほど多い。
私にとっては、やりたり仕事ができる環境に入れたことも、大きいのだろう。


ただ、そのような話をしていて、私の先輩から出た言葉は、

 『最終的には、楽しいと思えるかどうかは、自分自身にかかっている』

同じことをしていても、楽しいと思えるかどうかは、それに取り組む本人の意識次第。
最初からネガティブに捉えていたら、どんな仕事もつまらないモノにしかならない。


確かに、そうだよね。

自分の選択に、自信と責任を持って、ポジティブに取り組んで欲しい。

私自身も、今年1年は更なるチャレンジが待っているので、気持ち新たにがんばろう!

Technology Radar 2012年3月版

Technology Radar の2012年3月版が発表されていますね。

http://thoughtworks.fileburst.com/assets/thoughtworks-tech-radar-march-2012-us-color.pdf (PDF)
http://www.thoughtworks.com/articles/technology-radar-march-2012 (HTML)

定期的に見ているんですが、前回(2011年7月)のものと比べて、自分的に興味をひいたところを上げてみます。

Technique

  • Continuous Deliver(CD)
    • ポジションが大幅UP!日本ではまだまだこれから感があるけど、海外では大分メジャーになっているということか。
  • Agile analytic
    • 新規登場しているけど、なんだろう?良く分からない。
  • Acceptance test of journey
    • よく分かっていない。具体例が知りたいな。
  • Scrum certification(Scrum認定)
    • あまり変わっていないな。

Tool

  • Git, GitHub
    • Subversionが無くなって「Git」がトップに。SVNはもう普及した技術になった、ってことかな。
  • Maven
    • Holdに新規登場(いまさら!?)。OSSでは良く使われているけど、実際の開発の現場では、なかなか使われていないのと感覚的には一致する。

Platforms

  • Communication between those responsible for hardware and software
    • 長いな。ハードウェアだけでも、ソフトウェアだけでもダメってことだけど、最近はモバイル、クラウド等、確かに両方の連携は大事。

Language

  • Clojure
    • もう少しでAdopt、というポジションにいきなりきたな。何がキッカケだろう?


全ての項目が適切かというと、微妙だな、と思うモノもあるのですが、
このような動向を見て、自分のプロジェクトで活かせそうなモノにチャンレンジするのも良いですよね♪