web-dev-qa-db-ja.com

Kotlinデータクラスのテストカバレッジを取得する方法、またはJacocoで無視する方法

Jacocoは、Kotlinのデータクラスに対して0%のカバレッジを示しています。カバレッジを測定するか、データクラスをまったく無視するように構成するにはどうすればよいですか?

7
tse

私はデータモデルクラスの自動生成されたコードで同じテストカバレッジの問題の解決策を探していましたが、次のことに遭遇しました:
Kotlin + JaCoCo:生成されたコードをスキップするようにコンパイラを調整する

解決策:JaCoCoプラグインを0.8.2に更新すると、問題が解決します。

JaCoCoは0.8.2リリースでこの問題を解決しました。変更ログをお読みください-

  • 単純な名前がGeneratedである、実行時の表示および非表示のアノテーションが付けられたクラスとメソッドは、レポートの生成中に除外されます(GitHub#731)。
  • Kotlinコンパイラによって追加された、行番号のないメソッドは、レポートの生成中に除外されます。 Nikolay Krasko(GitHub#689)によるアイデアと実装。
8
Arpit Rastogi

データクラスを特定のパッケージまたは特定のファイルに配置した場合は、それらをclassDirectoriesから除外できます。以下の例では、データクラスを**/model/**の下に配置しています。

task kotlinJacocoTestReport(type: JacocoReport, dependsOn: 'test') {

    reports {
        html.enabled = true
        html.destination = "${buildDir}/reports/jacoco"
    }

    sourceDirectories = files(["${project.projectDir}/src/main/kotlin"])
    classDirectories = fileTree(dir: "${buildDir}/classes/kotlin/main", excludes: ['**/model/**'])
    executionData = files("${buildDir}/jacoco/test.exec")
}
3
Bertrand Martel

それについては未解決の問題があります ここ 、したがって自動カバレッジフィルタリングは進行中の作業のようです。

[〜#〜] edit [〜#〜]生成されたkotlinのフィルタリングを導入する プルリクエスト (承認済み)がありましたコード。それはまだリリースへの道を見つけていませんでした。しかし、これまでのところ、SNAPSHOTバージョンでテストされており、すべてが機能しているようです。

現在、最善の策はSNAPSHOTリリースを使用することです。

2

実際にはあなたの質問に答えているわけではありませんが、データクラスによって生成される関数をカバーするテストを作成することで、jacocoのデータクラスをかなり完全にカバーすることができます。

たとえば、1つのvarと1つのvalを持つデータクラスがあるとします。

_data class MyDataClass(var s1: String, val s2: String)
_

Jacocoを実行すると、MyDataClassによって生成された次のもののカバレッジを測定していることがわかります。

  • hashCode()
  • equals(Object)
  • toString()
  • MyDataClass(String, String)
  • copy(String, String)
  • setS1(String)
  • getS1()
  • getS2()
  • component1()
  • component2()

そのほとんどをカバーする単体テストは次のようになります。

_ @Test
 fun testCodeCoverageForMyDataClass() {
     // call the constructor
     val tested = MyDataClass("original s1", "original s2").apply {
         // call the setters
         s1 = "new s1"

         // call the getters
         assertEquals("new s1 original s2", "$s1 $s2")

         // call toString()
         assertEquals("MyDataClass(s1=new s1, s2=original s2)", "$this")

         // call componentN() functions
         val (res1, res2) = this
         assertEquals("new s1 original s2", "$res1 $res2")
    }

    // call copy()
    val testedCopy = tested.copy(s2 = "new s2").apply {
        // call equals()
        assertNotEquals(this, tested)

        // call hashCode()
        assertNotEquals(this.hashCode(), tested.hashCode())
    }
}
_

それは苦痛だと私は知っていますが、サポートがあるまで、これは私が報道をやり遂げるのに役立ちます。

2
Hank D

次の場所に記載されているプラ​​グインを使用してください: Kotlinプラグインが生成されました

プラグインは、@ lombok.Generatedアノテーションをバックグラウンドで追加することにより、Kotlinで生成されたすべての合成コード(自動ゲッターとセッターであり、データクラスがどこにあってもきれいにカバーする必要があります)をコードカバレッジから削除します。

動作させるには、Jacoco0.8以降を使用する必要があることに注意してください。

1
ucsunil