10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DeNAAdvent Calendar 2018

Day 12

コードカバレッジを見つつユニットテストを書く

Posted at

対象読者

Kotlinで開発しているAndroidエンジニア

はじめに

みなさん、ユニットテストは書いてますか?
コードカバレッジはどうでしょうか?

コードカバレッジとは?

ソースコードのテストされた割合です。
測定手法がいくつかありますが、今回は2つだけご紹介します。

命令網羅(C0)

ソースコードの 各文 が実行されているかどうか。

fun hoge(x: Int) {
    println("hoge")
    if (x > 0) {
        println("fuga")
    }
}

hoge(x = 1) だけで C0:100%

分岐網羅(C1)

ソースコードの 各条件 が実行されているかどうか。

fun hoge(x: Int) {
    println("hoge")
    if (x > 0) {
        println("fuga")
    }
}

hoge(x = 1)hoge(x = 0)C1:100%

コードカバレッジ、何か嬉しいことがあるの?

ユニットテストが充分か?の判断基準の一つとして使えます。
例として、既存コードのリファクタリングを考えてみます。

既存コード

fun hoge(x: Int): String {
    if (x >= 3) return "many"
    if (x == 2) return "two"
    if (x == 1) return "one"
    if (x == 0) return "zero"
	return "other"
}

ユニットテストを書く

@Test
fun hogeTest() {
    assert(hoge(3) == "many")
    assert(hoge(2) == "two")
    assert(hoge(1) == "one")
    assert(hoge(0) == "zero")
}

でも、このユニットテストで充分なのだろうか・・・?:thinking:

そこでコードカバレッジ!

コードカバレッジを計測する方法

  • Android Studio
  • JaCoCo :arrow_left: 今回はこちらをご紹介
  • Other...?

JaCoCoの準備

デフォルト設定だと、
Kotlinが計測対象になりません:scream:

arturdm/jacoco-android-gradle-plugin Issue 37JaCoCoの設定 を参考にすればOK :muscle:

※上記の設定は build variants も考慮されていてステキ :pray:

カバレッジ結果をみてみる:eyes:

$ gradlew jacocoDebugReport 実行後に、

app/build/reports/jacoco/jacocoDebugReport/html/index.html を開きましょう。

アプリ全体のレポート

report_index.png

クラスごとのレポート

report_all.png

クラス内の各関数ごとのレポート

report_hogeKt.png

ソースコードレベルのレポート

report_hoge1.png

緑:分岐網羅 OK
黄:分岐網羅 NG(片方の分岐しか実行されてない、など)
赤:一度も実行されていない

テストコードを足す

カバレッジレポートを見たところ、ユニットテストに不足があることがわかりました。
テストコードを追加しましょう。

@Test
fun hogeTest() {
    assert(hoge(3) == "many")
    assert(hoge(2) == "two")
    assert(hoge(1) == "one")
    assert(hoge(0) == "zero")
    assert(hoge(-1) == "other") // ★追加テストコード
}

無事、カバレッジ100% :tada:

report_hoge2.png

これで、ある程度信頼できるユニットテストができました。
なので、リファクタリングも怖くありません。

Kotlinっぽくしてみる

fun hoge(x: Int): String =
    when {
        x >= 3 -> "many"
        x == 2 -> "two"
        x == 1 -> "one"
        x == 0 -> "zero"
        else -> "other"
    }

report_hoge3.png

分岐網羅100%&ユニットテストも通っているので、大丈夫そうです。

補足

  • カバレッジ100%だからユニットテスト完璧、ではない
    • でも、判断基準の一つとして使えます
  • カバレッジ100%必達では無い
    • 例えばユニットテスト書きづらいところは、手動で確認しても良いと思います
10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?