参考ます。https://docs.gradle.org/current/dsl/org.gradle.testing.jacoco.tasks.JacocoCoverageVerification.html
Gradleのライブラリをダウンロードします。https://maven.aliyun.com/mvn/view
ケース参考出典ます。https://www.jianshu.com/p/1a4a81f09526
https://www.jianshu.com/p/1a4a81f09526
その他ます。https://testerhome.com/topics/8329
これらの日は、長い時間のために、今、本体ケースであるがベースとgradle3.1.3バージョンを投げる、私はそれを使用することができ、彼はコードの下に変更され、いくつかの情報を確認し、古いバージョンを使用する必要はありません。
先行詞:
あなたはAndroidがjacoco +サルは、コードカバレッジテストを行う聞いて使用する前に、以前にのみスプリングユニット・テスト・カバレッジは、デモをjacoco Androidの機能とjacocoは、団結非常に忙しく、これらの日にすることができます思っていましたビットに従事。
準備:
メインプロジェクトのコアコードを変更せずに、Androidのプロジェクトのソースコードを持っているが、主にacitivityの末尾にコードカバレッジを記録する機器を使用して、いくつかのコードのjacocoを記述する必要があります。
2点の具体的な内容:
、Androidのプロジェクトユニットテストコード・カバレッジ:
状況下では、現在のユニット・テスト・カバレッジAndroidTestフォルダを表示するAndroidStudio自タスクを使用します
編集build.gradle
{アンドロイド ... defaultConfig { ... testInstrumentationRunnerArguments clearPackageData: '真の' //クリーンアップテスト計装キャッシュ実行 } buildTypesを{ デバッグ{ trueにtestCoverageEnabled = / **オープンカバレッジ統計が切り替え * / } }
デバッグパッケージをインストールします
AndroidTest実行カバレッジテストや出力レポート
実行ログはこれです:
ここで、フラグメント除去AndroidTest実行ユニットテストは、ダウンダウン電話からカバレッジデータを取得し、テストが行われ、電話ADB機器にコマンドを送信することにより、次のとおりです。
タスクの実行:[createDebugAndroidTestCoverageReport] ... >タスク:アプリ:connectedDebugAndroidTest ... 五時40分39秒V / DDMS:実行:実行中の午前楽器-w -r -e coverageFile /data/data/com.patech.testApp/ clearPackageData真com.patech.testApp.test / androidx.test.runner.AndroidJUnitRunner -e真coverage.ec -eカバレッジ ... 5時40分41秒V / InstrumentationResultParser:com.patech.testApp.EspressoTest: ... 05 :40:58 V / InstrumentationResultParser:タイム:17.669 5時40分58秒V / InstrumentationResultParser: 5時40分58秒V / InstrumentationResultParser:OK(5つのテスト) 5時40分58秒V / InstrumentationResultParser: 5時40分58秒V / InstrumentationResultParser: 午前5時40分58秒V / InstrumentationResultParser:/data/data/com.patech.testApp/coverage.ecに生成されたコードカバレッジデータ INSTRUMENTATION_CODE::午前5時40分58秒V / InstrumentationResultParser -1 ... 5時40分59秒I / XmlResultReporter:XML試験結果ファイルDで発生:\ androidStudio \ MyApplicationを\アプリ\ビルド\出力を\ androidTest-結果\ \ TEST-VOG-AL10接続- 9-APP-の.xml。総テスト5は、5を通過し、 午前5時40分59秒V / DDMSは:clearPackageData真コム-e -w -r -e coverageFile /data/data/com.patech.testApp/coverage.ec -eカバレッジ真の」午前の楽器を実行しますEOFヒット:.patech.testApp.test / androidx.test.runner.AndroidJUnitRunner APH0219430006864 '」'上。読む:-1 ... 午前5時40分59秒D / com.patech.testApp.coverage.ec:ダウンロードcom.patech.testApp.coverage.ecデバイスからの'APH0219430006864' ...
ビューには、実行の詳細を終えた後、ビルドに報告します
、機能テストを実行した後、ローカルに生成されたECファイルのコードを記述するII。Jacoco +器具、コードカバレッジ機能テスト動作の実装を表示するために、HTML形式にPC-解析さに広がっ
FinishListenerインタフェースの調製
パブリックインターフェイスFinishListener { )(onActivityFinishedボイド。 無効dumpIntermediateCoverage(文字列filePathに); }
ファイルの完全なカバレッジの実装後に生成を達成し、あなたの携帯電話にローカルに保存するために、このインターフェイス上でオンラインコピーを達成するためにjacocoInstrumentationメソッドを書きます:
パッケージcom.patech.test。 輸入android.app.Activity。 輸入android.app.Instrumentation。 輸入android.content.Intent。 輸入android.os.Bundle; 輸入android.os.Looper; 輸入android.util.Log; 輸入com.patech.testApp.InstrumentedActivity。 インポートのjava.io.File; 輸入java.io.FileNotFoundException。 輸入java.io.FileOutputStreamは、 インポートにjava.io.IOException; インポートにjava.io.OutputStream; インポートにjava.lang.reflect.InvocationTargetException; パブリッククラスJacocoInstrumentationは計測がFinishListener {実装延び パブリック静的文字列タグ=「JacocoInstrumentationました:」; プライベート静的な文字列DEFAULT_COVERAGE_FILE_PATH =「/mnt/sdcard/coverage.ec」。 民間最終バンドルmResults =新しいバンドル(); プライベートテントmIntent。 //のlogD调试用布尔 プライベート静的最終ブールのlogD =はtrue。 プライベートブールmCoverage =はtrue。 プライベート文字列mCoverageFilePath。 パブリックJacocoInstrumentation(){ } @Override 公共ボイドのonCreate(バンドル引数){ Log.d(TAG、 "のonCreate(" +引数+ ")")。 super.onCreate(引数); // DEFAULT_COVERAGE_FILE_PATH =のgetContext()getFilesDir()ある、getPath()+ "/coverage.ec"。。。 ファイルファイル=新しいファイル(DEFAULT_COVERAGE_FILE_PATH)。 (!file.exists())場合には{ {みてください )(file.createNewFileを。 }キャッチ(IOExceptionを電子){ Log.d(TAG、 "异常:" + E)。 e.printStackTrace(); } } (引数= NULL!){もし mCoverageFilePath = arguments.getString( "coverageFile")。 } mIntent =新しいテント(getTargetContext()、InstrumentedActivity.class)。 mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。 開始(); } 公共ボイドONSTART(){ IF(のlogD) Log.d(TAG、 "ONSTART()")。 super.onStart(); Looper.prepare(); / * InstrumentedActivity活性=(InstrumentedActivity)startActivitySync(mIntent)。 activity.setFinishListener(この); * / } プライベートブールgetBooleanArgument(バンドル引数、文字列タグ){ 文字列tagString = arguments.getString(タグ)。 tagStringを返す= NULL && Boolean.parseBoolean(tagString)!; } プライベート文字列getCoverageFilePath(){ IF(mCoverageFilePath == NULL){ DEFAULT_COVERAGE_FILE_PATHを返します。 }他{ mCoverageFilePathを返します。 } } プライベートボイドgenerateCoverageReport(){ Log.d(TAG、 "generateCoverageReport():" + getCoverageFilePath()); OutputStreamをアウト= NULL; 試す{ アウト=新しいのFileOutputStream(getCoverageFilePath()はfalse); オブジェクト剤= Class.forNameの( "org.jacoco.agent.rt.RT") .getMethod( "getAgent") .invoke(NULL)。 out.write((バイト[])agent.getClass()getMethod( "getExecutionData"、boolean.class)。 .invoke(エージェント、偽)); }キャッチ(にFileNotFoundException電子){ Log.d(TAG、e.toString()、E)。 }キャッチ(IOExceptionを電子){ e.printStackTrace(); e.printStackTrace(); }キャッチ(ないNoSuchMethodException電子){ e.printStackTrace(); }キャッチ(IllegalAccessExceptionが電子){ e.printStackTrace(); }キャッチ(ClassNotFoundExceptionが電子){ e.printStackTrace(); } {ついに (!アウト= null)の場合には{ {みてください )(out.close。 }キャッチ(IOExceptionを電子){ e.printStackTrace(); } } } } 公共ボイドUsegenerateCoverageReport(){ generateCoverageReport()。 } プライベートブールsetCoverageFilePath(文字列filePathに){ 場合(filePathに= NULL && filePath.length()> 0!){ mCoverageFilePath = filePathに。 } falseを返します。 } プライベートボイドreportEmmaError(例外e){ reportEmmaError(E); } プライベートボイドreportEmmaError(文字列ヒント、例外e){ 文字列MSG =「エマカバレッジを生成できませんでした。」+ヒント。 Log.e(TAG、MSG、E)。 mResults.putString(Instrumentation.REPORT_KEY_IDENTIFIER、 "\ nエラー:" + MSG)。 } @Override onActivityFinished公共ボイド(){ {(のlogD)場合 Log.d(TAG、 "onActivityFinished()"); } 仕上げ(Activity.RESULT_OK、mResults)。 } @Override 公共ボイドdumpIntermediateCoverage(文字列filePathに){ IF(のlogD){ Log.d(TAG、 "ファイル名で呼び出さIntermidateダンプ:" + filePathに)。 } IF(mCoverage){ IF(!setCoverageFilePath(filePathに)){ IF(のlogD){ Log.d(TAG、 "所定のファイルパスを設定できません:" + filePathに+ "ダンプ対象として。"); } } generateCoverageReport()。 setCoverageFilePath(DEFAULT_COVERAGE_FILE_PATH)。 } } }
2. [変更AndroidManifest.xmlファイル、携帯電話を読み書きする権限を追加するだけでなく、機器設定、および同じレベルのタグラベルの適用:
<使用許可アンドロイド:名= "android.permission.WRITE_EXTERNAL_STORAGE" /> <使用許可アンドロイド:名= "android.permission.READ_EXTERNAL_STORAGE" /> <! - Jacoco权限- > <はアンドロイド許可使用しています:名= "android.permission.USE_CREDENTIALS" /> <アンドロイド許可使用しています:名= "android.permission.GET_ACCOUNTS" /> <アンドロイド許可使用しています:名= "android.permission.READ_PROFILE" /> <アンドロイド許可使用しています:名前= "android.permission.READ_CONTACTS" /> <計装 アンドロイド:名= "com.patech.test.JacocoInstrumentation" アンドロイド:handleProfiling = "true"の アンドロイド:ラベル=」CoverageInstrumentation」 アンドロイド:targetPackage = "com.patech.testApp" />
3.書き込みjacoco.gradleは、ECを解析するために、または他の形式のHTMLレポートに変換します:
プラグインを適用する: 'jacoco' //https://docs.gradle.org/current/userguide/jacoco_plugin.html jacoco { toolVersion = "0.8.4" } タスクjacocoTestReport(タイプ:JacocoReport){ グループ= "レポート" DESCRIPTION = 「テストを実行した後Jacocoカバレッジレポートを生成します。」 DEF debugTree = fileTree(DIR: "$ {buildDir} /中間体/ javacの/デバッグ"、 //含む:[ "** / *プレゼンター*"]は、 除外:[ '** / R *の.class'、 ' ** / * $ InjectAdapter.class'、 '** / * $ ModuleAdapter.class'、 '** / * $のViewInjector * .classファイル' DEF coverageSourceDirs = "$ {project.projectDir} / srcに/メイン/ javaの" //指定源码目录 DEF reportDirs = "$ buildDir /出力/レポート/ jacoco / jacocoTestReport" レポート{ xml.enabled =真 html.enabled =真 } // destinationFile =ファイル(reportDirs) classDirectories =ファイル(debugTree) sourceDirectories =ファイル(coverageSourceDirs) executionData =ファイル( "$ buildDir /出力/コード・カバレッジ/接続/ coverage.ec") }
4.携帯電話を接続し、ADBの実施後の文は、APKをインストールし、jacocoして、アプリケーションを開きます。
adbのシェル午前機器-w -r com.patech.testApp / com.patech.testcoverage.test.JacocoInstrumentation
テストが完了した後5.あなたは、ECのエクスポートファイル、携帯電話の機能テストを行うために起動することができます。
ADBプルMNT / SDカード/ coverage.ec C:\ Users \ユーザーユーザー\デスクトップ\ testReport \ jacoco
接続されたビルド/出力/コード・カバレッジ/ 6. ECファイル
タスク実行jacocoTestReport
ビューは、ビルド/レポート/ jacoco / jacocoTestReport報告書で解決します
レポートを表示します。