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の全体

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の全体

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に関してディレクトリとソースファイルの位置を一致させたほうがよさそうです。(今のところ)

参考記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です