アンドロイドjacocoコードカバレッジ:機能テストユニットテストカバレッジカバレッジ+

参考ます。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報告書で解決します

 

レポートを表示します。

 

 

 

 

 

 

  

 

おすすめ

転載: www.cnblogs.com/zhizhiyin/p/11493392.html