Android 使用 JaCoco 分析單元代碼測試覆蓋率

Android UI 單元測試

首先看一下Android UI單元測試的Demo

布局文件 activity_main.xml

待測試代碼 MainActivity.java

說明

頁面中有兩個按鈕,點擊第一個按鈕會顯示一個Toast,點擊第二個按鈕則會拋出一個 Error

現在 我們需要判斷通過 測試代碼 判斷出點擊那個按鈕將會出現 Error

單元測試編寫 MainActivityTest.java

找到AndroidTest 文件夾,在里面新建 MainActivityTest 測試類.

編寫代碼如下:

運行測試用例

找到Android Studio 右側 Gradle 工具欄

點擊 connectedDebugAndroidTest 按鈕

查詢測試結果

找到module 里面的build/reports/androidTest/connected/index.html 文件通過瀏覽器打開

里面的內容是這樣的:

數據告訴我們通過率是 80%,一共有5 個測試用例,ApplicationTest 有2個用例,MainActivityTest 有3個用例,并且失敗了一個.

點擊MainActivityTest,里面的頁面會告訴我們 測試沒通過的原因.

Android UI 單元測試的 不足之處

Android UI的測試用例不僅能幫助開發者找到 代碼中會出現的Error,而且整個過程 不用像傳統需要 測試人員親自用手觸發功能 .

局限性: 項目中可能有很多頁面的功能都需要進行測試,但 普通的測試用例只能檢測是開發者編寫的測試用例是否正確,并不能知道 項目中總歸有多少功能需要測試,以及 我們編寫的測試用例到底完成了多少.

覆蓋率

代碼覆蓋率=單元測試用例數量/總共待測功能數量

JaCoCo 檢查代碼覆蓋率

介紹

隨著敏捷開發的流行,編寫單元測試已經成為業界共識。

但如何來衡量單元測試的質量呢?有些管理者片面追求單元測試的數量,導致底下的開發人員投機取巧,編寫出大量的重復測試,數量上去了,質量卻依然原地踏步。

相比單純追求單元測試的數量,分析單元測試的代碼覆蓋率是一種更為可行的方式。

JaCoCo(Java Code Coverage)就是一種分析單元測試覆蓋率的工具,使用它運行單元測試后,可以給出代碼中哪些部分被單元測試測到,哪些部分沒有沒測到,并且給出整個項目的單元測試覆蓋情況百分比,看上去一目了然。

gradle 集成

在 module 的 gradle中 項目如下配置

apply plugin: 'com.android.application'
apply plugin: 'jacoco'

android { compileSdkVersion 24 buildToolsVersion "24.0.1"

defaultConfig {
    applicationId "com.example.plu_rn.myapplication"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
}
buildTypes {
    debug {
        testCoverageEnabled = true

    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

}

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:24.1.1' androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1' } jacoco { toolVersion = "0.7.1.201405082137" }</code></pre>

配置后gradle的工具欄就多了一個功能: createDebugCoverageReport

運行Jacoco

現在把MainActivityTest.java 改成如下:

public class MainActivityTest extends ActivityInstrumentationTestCase2 {

private Solo solo;
public MainActivityTest() {
    super(MainActivity.class);
}

@Override
public void setUp() throws Exception {
    super.setUp();
    solo = new Solo(getInstrumentation(), getActivity());
}

public void testcase001() throws Exception{
    solo.clickOnButton("tips");
    solo.sleep(3000);
}

public void testStartClose() throws Exception {
    Thread.sleep(1000);
}
@Override
public void tearDown() throws Exception {
    super.tearDown();
}

}</code></pre>

刪掉了第二個測試用例

運行 createDebugCoverageReport 功能

查看分析結果

找到 build/reports/coverage/debug/index.html 文件并用瀏覽器打開

這里的信息告訴我們 覆蓋率為 62%

進入里面的詳情 ,里面的數據詳細的告訴 我們哪些功能點 已經測試,以及 還沒有測試的功能點;

因為剛剛把MainActivityTest.java 里面testcase002這個方法去掉了,所以 這里顯示 showError 這個方法沒有被測試到.

 

來自:http://www.jianshu.com/p/959716683c53

 

 本文由用戶 ttdz7152 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!