Kotlin で CircleCI と Codecovを使う( JUnit + kotlin-test + knit )

2 回ほど C# でのコードカバレッジ表示サービスを使ってきましたが、今回は Kotlin で使ってみたいと思います。

調べてみると、 KotlinプロジェクトをTravis CIで回し、カバレッジをCoverallsで見る – Web系エンジニアのごはんブログという記事がすでに公開されていたため、使うサービスを違うものにして試しました。

JVM 界隈はさっぱり詳しくないので、かなり時間がかかってしまいました…

概要

今回使ったライブラリ・サービスは下のとおりです。


CircleCI
Node.js や Python 等、 Linux 系の Continuous Integration サービス。( AppVeyor みたいな Windows 系の方が珍しい)

Codecov
コードカバレッジを表示するサービス。 GitHub でこれのバッヂを見かける。

JUnit, kotlin-test, knit
JUnit はスタンダードな Java 用単体テストライブラリ。
kotlin-test は Kotlin 用の公式ライブラリ。
knit は Kotlin の記述法を上手く利用した実験段階の単体テストライブラリ。

JaCoCo
Java 系言語でコードカバレッジを測定するライブラリ。

実行手順は以下のようになります。

  1. GitHub に Push
  2. CircleCI でビルド
  3. 単体テストしてカバレッジ情報を出力
  4. Codecov へ情報の送信

処理のための記述

‘build.gradle’

方法を確認したところで、ビルドするためのスクリプトを作成します。 ‘build.gradle’ は、 Java 等でコンパイルやテストなどの動作を設定できるものです( Groovy で書く)。

Kotlin を使う際に必要な記述は他のドキュメントを見ていただくことにして、 JaCoCo の記述について紹介します。(こちらも情報は多いと思いますが念のため。)
‘build.gradle’ の全体

build.gradle
1
2
3
4
5
6
7
8
9
apply plugin: 'jacoco'

jacocoTestReport {
reports {
xml.enabled true
csv.enabled false
html.enabled true
}
}

Gradle では apply plugin: 'jacoco' として、 jacocoTestReport という名前のタスクを実行するだけでコードカバレッジの情報を出力してくれます。

あとは、すぐ上にある dependencies に単体テストで使いたいフレームワークについて( testCompile を)記述するくらいです。

‘circle.yml’

続いて、 ‘circle.yml’ にも書きます。ここでは結果のファイルをを CircleCI で確認できるようにしているので6行になっていますが、必須なのは 3 行目、 6 行目です。

3 行目の jacocoTestReportタスクは test タスクなどの後に実行することで、カバレッジの調査結果を出力します。 6 行目で、 Codecov にそれを送信します。
‘circle.yml’ の全体

1
2
3
4
5
6
mkdir -p $CIRCLE_TEST_REPORTS/junit/
find . -type f -regex ".*/build/test-results/TEST-.*xml" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \;
./gradlew jacocoTestReport
mkdir -p $CIRCLE_TEST_REPORTS/jacoco/
cp -r ./build/reports/jacoco/test/* $CIRCLE_TEST_REPORTS/jacoco
bash <(curl -s https://codecov.io/bash)

結果

このリポジトリこう処理されてこう表示される。

バッヂを GitHub の ‘readme.md’ に加えれば、コードカバレッジの自動測定と表示は完了です。

補足

とてもハマって辛かったのは、 JaCoCo の動作でした。 JaCoCo でコードを含むカバレッジ情報にするためには、 package に関してディレクトリとソースファイルの位置を同じにしなければならないようでした。 Java の場合は、そのような決まりがあるので問題にならなかったのですが、 Kotlin ではその制約が消えています。 JaCoCo を使う際には、制約のない Kotlin でも package に関してディレクトリとソースファイルの位置を一致させたほうがよさそうです。(今のところ)

参照記事