カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

IntelliJでJUnitの設定をする

IntelliJでJUnit周りの環境を揃えたときの備忘録。自分が使ってるのはIntelliJ IDEA12。13では試せてないけど、多分そんな変わらないはず。

pom

Mavenでプロジェクト管理してるのでまずpom.xmlに以下が設定されてることを確認する。IntelliJはデフォルトで設定されてた。

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
(長いので省略)
    <build>
        <finalName>SpringApp</finalName>
        <plugins>
(長いので省略)
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/*Test.java</include>
                    </includes>
                </configuration>
            </plugin>

これで普通にテストは動くけど、「containsInAnyOrder」なども使いたいので、以下を加える。

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>

Travis CI

次にGithubにpushしたらテストが走るようにする。Travis CIではアカウントの登録をしておいて、実行したいレポジトリを「ON」にして実行対象にしておく。 プロジェクトディレクトリの直下に.travis.ymlを配置。以下の内容にする。jdkのバージョンは適宜変えておく。

language: java

jdk:
  - oraclejdk7
  - oraclejdk8
  - openjdk7

以下のようなマークアップをREADME.mdに書いておくとビルドステータスが表示されるようになる。リンクはレポジトリに合わせて変える。

[Build Status](https://secure.travis-ci.org/masudaK/sampleJava.png?branch=master)](http://travis-ci.org/masudaK/sampleJava)

Coveralls

次に、Coveallsでカバレッジを計測するようにする。アカウント登録をしておく。 そして、pom.xmlを修正する。ひとまずcoberturajacocoの両方が使えるようにしている。 Mavenレポジトリからは見つからなかったので、File -> Project Structure -> Librariesで該当のライブラリをローカルにも落としておく。

            <plugin>
                <groupId>org.eluder.coveralls</groupId>
                <artifactId>coveralls-maven-plugin</artifactId>
                <version>2.2.0</version>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <format>xml</format>
                    <maxmem>256m</maxmem>
                    <!-- aggregated reports for multi-module projects -->
                    <aggregate>true</aggregate>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.1.201405082137</version>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

また、cobertura実行時にsource encodingを指定するよう怒られたので、以下のようにproject.build.sourceEncodingを設定しておく。

    <properties>
        <spring.version>3.2.0.RELEASE</spring.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

そして、.travis.ymlに以下を加える。現状coberturaで困ってないので、coberturaを指定している。 ちなみに、コメントで日本語使ったらジョブが実行されたなかったので、日本語は使わないようにしよう。

after_success:
  - mvn clean cobertura:cobertura coveralls:cobertura # if you want use "cobertura", uncomment this line.
  #- mvn clean test jacoco:report coveralls:jacoco  # if you want use "Jacoco", uncomment this line.

そして、README.mdに以下を加える。

[![Coverage Status](https://img.shields.io/coveralls/masudaK/testJava.svg)](https://coveralls.io/r/masudaK/testJava?branch=master)

上記のリンクをBADGE URLSと言うらしいが、SVG MarkdownやMarkdownなどがあり、上記ではSVGを選択してる。Markdownと比較すると最新の情報が反映されるまで時間がかかったが、そこまでリアルタイムにする必要もなく、SVGのほうが綺麗なので、SVGにした。

書く

あとは淡々とテストを書く。

package com.example;

public class Calc {

    public Calc(){
    }

    public int sum(int a, int b){
        return a+b;
    }
}
package com.example;

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;


public class CalcTest {

    @Before
    public void setup() throws Exception {
    }

    @Test
    public void 二つの値を合計する() throws Exception {

        Calc calc = new Calc();
        assertThat(calc.sum(2,3), is(5));
    }

    @After
    public void tearDown() {
    }
}

こういう環境があったほうがモチベーションあがるし、自己満足な部分も多いけど、自分としてはないよりはマシということで。 とりあえず、こんな感じで設定してるので、書いてみた。