Gradle for Android 第六篇( 測試)

這一系列暫不更新,相關技術討論,請移步微信羣,謝謝,但願你們多多支持!html

圖片描述

這會是一個系列,因此若是你看完這篇文章,請看下列文章:java

Gradle for Android 第一篇( 從 Gradle 和 AS 開始 )android

Gradle for Android 第二篇( Build.gradle入門 )segmentfault

Gradle for Android 第三篇( 依賴管理 )微信

Gradle for Android 第四篇( 構建變體 )app

Gradle for Android 第五篇( 多模塊構建 )框架

Gradle for Android 第七篇( Groovy入門 )jvm

因爲現階段Android開發趨於敏捷開發,再加上國內大大小小的互聯網公司都在作app,致使不少開發人員對單元測試沒有基本的概念,可是本篇博文不會爲你們講解什麼是單元測試,功能測試,而是講解如何在Android studio上利用gradle使用現階段流行的測試框架等。工具

爲了確保app或者library庫的質量,有一個完整的測試很是重要。很長一段時間,Android開發工具都缺少針對完整性測試的支持,可是最近,google爲之作了大量的工做,其讓開發者作測試變得更加容易了,一些舊的框架更新了版本,新的框架也被加入進來。咱們如今不只能夠在Android studio中運行這些測試,甚至能夠用gradle經過命令行直接執行。單元測試

因此基於此,咱們這一章,將會爲你們介紹幾種測試Android app的方式,咱們也會深究之爲什麼gradle能夠幫助測試自動化。

這一章節我將遵循如下內容:

  • 單元測試

  • 功能測試

  • 測試覆蓋率

單元測試

相信你們都有了單元測試的概念,那麼好的單元測試不只僅可以確保app的質量,同時還可讓新代碼開發更加容易。Android studio和gradle android插件默認支持單元測試,可是在你使用它以前,你仍需配置一下。

JUnit

JUnit測試界很是流行,其使得測試代碼容易編寫和維護,可是記住,JUnit只能測試邏輯代碼,針對和Android SDK相關的代碼其會報相應的錯誤。

在你開始編寫junit測試以前,你須要爲其新建一個目錄。一般呢,這個會被叫作test,其會和你的main文件夾平級。

app
└─── src
     ├─── main
          ├─── java
          │    └─── com.example.app
          └─── res
     └─── test
          └─── java
               └─── com.example.app

你能夠在test目錄下建立測試類。

我建議你使用JUnit 4,你能夠將其做爲依賴添加到你的依賴庫。

dependencies {
       testCompile 'junit:junit:4.12'
}

注意到你使用了testCompile,這意味着該jar包只會在你測試的時候導入apk。

若是你有其餘的構建版本呢,而你又只是想爲特定版本添加該jar,你只須要這麼作:

dependencies {
       testPaidCompile 'junit:junit:4.12'
 }

當全部的事情都OK了,就是時候開始寫測試代碼了。下面是簡單的測試代碼:

import org.junit.Test;
   import static org.junit.Assert.assertEquals;
   public class LogicTest {
       @Test
       public void addingNegativeNumberShouldSubtract() {
           Logic logic = new Logic();
           assertEquals("6 + -2 must be 4", 4, logic.add(6, -2));
           assertEquals("2 + -5 must be -3", -3, logic.add(2, -5));
       }
}

那麼如何跑起來呢,也很簡單,運行gradlew test。若是你只是想再特定版本中跑呢,那就加一個唄gradlew testDebug。若是測試失敗,gradle將會打印相關錯誤,若是全部測試成功經過,那麼會顯示BUILD SUCCESSFUL 。

可能你會說,單個測試用例致使整個測試失敗,這樣很差,若是你想把整個測試案例都跑一遍,那也很簡單啊:

$ gradlew test --continue

執行測試任務不只僅是跑完全部的測試,並且其還會爲你建立一份測試報告,你能夠找到它app/build/reports/tests/debug/index.html。這份報告讓你可以更快的發現問題,我以爲最重要的是當你將你的測試自動化後,這會很是有用,gradle會爲每一個構建版本都建立一份測試報告。若是你執行測試成功,你的測試報告會是這個樣子:

圖片描述

說了這麼多原始的作法,那麼看看Android studio怎麼運行測試的吧。右鍵項目或者選擇開始按鈕。。這個太基礎很少說了,運行成功是這個樣子:

圖片描述

好了,junit測試講完了,是否是很簡單。

若是你想測試你的關聯Android sdk代碼怎麼辦,單元測試不是一個好主意,幸運的是,有多個依賴包供你選擇,其中最出名的是Robolectric,其可讓你更方便的測試Android功能,而且還不用在設備或者模擬器上運行。

Robolectric

經過使用Robolectrie,你能夠編寫測試類,這些類可使用Android SDK和資源文件,固然其仍是跑在jvm上,這會讓你測試app更加迅速。

在開始使用Robolectrie以前,你須要添加依賴。注意除了Robolectric依賴,你須要添加JUnit包。

apply plugin: 'org.robolectric'
   dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
       compile 'com.android.support:appcompat-v7:22.2.0'
       testCompile 'junit:junit:4.12'
       testCompile'org.robolectric:robolectric:3.0'
       testCompile'org.robolectric:shadows-support:3.0'
}

Robolectrie測試類也須要寫在test文件夾下,舉個例子:

@RunWith(RobolectricTestRunner.class)
   @Config(manifest = "app/src/main/AndroidManifest.xml", sdk = 18)
   public class MainActivityTest {
       @Test
       public void clickingButtonShouldChangeText() {
           AppCompatActivity activity = Robolectric.buildActivity
             (MainActivity.class).create().get();
           Button button = (Button)
             activity.findViewById(R.id.button);
           TextView textView = (TextView)
             activity.findViewById(R.id.label);
           button.performClick();
           assertThat(textView.getText().toString(), equalTo
             (activity.getString(R.string.hello_robolectric)));
        } 
    }

功能測試

神馬是功能測試,其是用來測試一個app的多個模塊是否可以正常工做。舉個栗子,你能夠建立一個功能測試來確保你點擊某一按鈕後是否會有一個新的activity。依然,咱們會有不少框架。可是在這裏,我推薦Espresso。

Espresso

google建立Espresso的目的就是在於簡化開發人員編寫功能測試用例。這個包是由Android support repository提供,因此你能夠經過SDK Manager使用它。

在運行測試用例以前,你須要定義一個runner。google提供了AndroidJUnitRunner測試runner,這將幫助你在手機上運行Unit測試。測試runner能夠幫你安裝apk以及一個測試apk,執行全部測試,生成測試報告。

假設你下載了support library包,那麼你須要這麼定義:

defaultConfig {
       testInstrumentationRunner
         "android.support.test.runner.AndroidJUnitRunner"
   }

固然你須要添加一些依賴包:

dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
       compile 'com.android.support:appcompat-v7:22.2.0'
       androidTestCompile 'com.android.support.test:runner:0.3'
       androidTestCompile 'com.android.support.test:rules:0.3'
       androidTestCompile
         'com.android.support.test.espresso:espresso-core:2.2'
       androidTestCompile
         'com.android.support.test.espresso:espresso-contrib:2.2'
   }

注意到這些依賴包使用了androidTestCompile,其不一樣於testCompile。當你直接運行時,會報錯:

Error: duplicate files during packaging of APK app-androidTest.apk
     Path in archive: LICENSE.txt
     Origin 1: ...\hamcrest-library-1.1.jar
     Origin 2: ...\junit-dep-4.10.jar

其意思也很清楚,由於多個文件致使,你能夠簡單處理下:

android {
     packagingOptions {
     exclude 'LICENSE.txt'
  }
}

注意:功能測試須要放在AndroidTest目錄下,下面是測試用例:

@RunWith(AndroidJUnit4.class)
   @SmallTest
   public class TestingEspressoMainActivityTest {
       @Rule
       public ActivityTestRule<MainActivity> mActivityRule = new
         ActivityTestRule<>(MainActivity.class);
       @Test
       public void testHelloWorldIsShown() {
           onView(withText("Hello world!")).check
             (matches(isDisplayed()));
        } 
    }

功能測試也有測試報告,當正確執行後,應該是這樣的:

圖片描述

最後可能有朋友問,在Android studio中執行測試,那就附圖吧:

圖片描述

圖片描述

測試覆蓋率

一旦你在你的項目中使用到了測試,那麼你確定想知道你的測試覆蓋量。很真實,依然有不少測試覆蓋率工具,我推薦的是Jacoco。

Jacoco

有一份覆蓋率報告,很簡單。你只須要配置一下:

buildTypes {
     debug {
       testCoverageEnabled = true
     }
}

當你執行完構建,你能夠在app/build/ outputs/reports/coverage/debug/index.html中找到,每一個版本都會有一個報告。測試覆蓋率會是這樣的:

圖片描述

你甚至能夠經過點擊查看更多信息,能夠看到哪一行代碼被測試。

總結

在這一章,咱們學習瞭如何測試,咱們學習了簡單的單元測試,以及Robolectric測試。咱們學習了功能測試,以及學習瞭如何使用Espresso。最好,咱們學會了如何查看測試覆蓋率報告。

在下一章,我將會帶來最重要的一章,即自定義化構建過程,建立自定義tasks和插件。固然了咱們會首先介紹Groovy語法,理解其語法讓你可以更輕鬆的理解gradle是如何工做的。

相關文章
相關標籤/搜索