web-dev-qa-db-ja.com

Dagger2クラスをテストカバレッジから除外する方法

Android StudioのテストカバレッジレポートからDagger2クラスを除外するオプションはありますか?

18
Mladen Rakonjac

JaCoCoは除外します

JaCoCoを使用している場合、たとえばAndroid Instrumentationconnected testsを使用している場合は、excludes(またはインクルード)、 documentation によると...

レポートから除外するクラスファイルのリスト。ワイルドカード文字(*および?)を使用できます。指定しない場合、何も除外されません。

つまり、生成された短剣クラス名を一致させる必要があります。次のルールは、dagger-compilerによって生成された実質的にすべてのクラスをカバーしますが、生成されていないクラスとは一致しません(クラスにdaggerと同じ名前を付けない限り...):

excludes = [
    '**/*_MembersInjector.class',
    '**/Dagger*Component.class', // covers component implementations
    '**/Dagger*Component$Builder.class', // covers component builders
    '**/*Module_*Factory.class'
]

ビルドを実行した後、app/build/generated/source/aptディレクトリで生成された短剣クラスをチェックして、除外と一致させたい生成クラスが他にあるかどうかを確認できます。

このexcludes配列は、jacocoプラグインの構成プロパティです。ここで、このexcludes配列をどこに配置するかは、jacocoプラグインに基づいて独自のタスクを定義するか、これを実行する「高レベルのプラグイン」を使用するかによって異なります。たとえば this plugin を使用します(除外が実際に適用される場所を確認するには、プラグインソースを確認できます)。

jacocoAndroidUnitTestReport {
  excludes +=  [
        '**/*_MembersInjector.class',
        '**/Dagger*Component.class',
        '**/Dagger*Component$Builder.class',
        '**/*Module_*Factory.class'
    ]
}

接続テスト

buildTypetestCoverageEnabled trueを設定してAndroid接続テストカバレッジを実行している場合、残念ながら宣言する慣用的な方法はありませんexcludes-- Android gradle plugin はそのようなオプションを提供せず、事前定義された jacocoレポートタスク には除外がハードコーディングされているため。この場合、独自のタスクをexcludesでスクリプト化する必要があります。


IntelliJテストランナー

IntelliJテストランナーを使用している場合、カバレッジがIntelliJとJaCoCoのどちらで行われているかにかかわらず、テスト構成にincludesを指定する必要があります。

  1. Edit Configurationsウィンドウを開きます。

Edit Configurations

  1. テスト構成を選択し、インクルード(クラスまたはパッケージ全体)を定義します。この場合、例として、com.google.Android.gmsパッケージ全体を含めました。

Test coverage includes

Daggerで生成されたファイルをexclude除外するには、すべてのdagger依存関係を1つのルートパッケージに入れ、includeallテスト構成のその他パッケージ。

16
maciekjanusz

Daggerの最近のバージョンでは、わずかに異なるパターンの追加ファイルが生成されます。 Dagger 2.15を使用すると、以下の除外で成功しました

'**/*_MembersInjector.class',
'**/Dagger*Component*.class',
'**/Dagger*Subcomponent*.class',
'**/*Subcomponent$Builder.class',
'**/*Module_*Factory.class',
4
friederbluemle