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